Versuchen Sie es mit echo 0 > /proc/sys/kernel/vsyscall64
Wenn Sie versuchen, Gettimeofday-Aufrufe zu ptraceen und diese nicht angezeigt werden, welche Zeitquelle verwendet das System (pmtimer, acpi, tsc, hpet usw.). Ich frage mich, ob Sie mir einen Gefallen tun würden, indem Sie versuchen, Ihren Timer auf etwas Älteres wie pmtimer zu zwingen. Es ist möglich, dass eine der vielen zeitgeberspezifischen Optimierungen von gtod dazu führt, dass Ihre Ptrace-Aufrufe vermieden werden, selbst wenn vsyscall auf Null gesetzt ist.
Gibt es eine Möglichkeit, die Verwendung von vsyscalls/vDSO für einen einzelnen Prozess oder, falls dies nicht möglich ist, für das gesamte Betriebssystem zu deaktivieren?
Es stellt sich heraus, dass es IST eine Möglichkeit, die Verknüpfung von vDSO für einen einzelnen Prozess effektiv zu deaktivieren, ohne es systemweit mit ptrace
zu deaktivieren !
Alles, was Sie tun müssen, ist, den verfolgten Prozess zu stoppen, bevor er von execve
zurückkehrt und entfernen Sie die AT_SYSINFO_EHDR
Eintrag aus dem Hilfsvektor (der direkt nach Umgebungsvariablen entlang des Speicherbereichs kommt, auf den in rsp
verwiesen wird ). PTRACE_EVENT_EXEC
ist ein guter Ort, um dies zu tun.
AT_SYSINFO_EHDR
verwendet der Kernel, um dem Systemlinker mitzuteilen, wo vDSO im Adressraum des Prozesses abgebildet ist. Wenn dieser Eintrag nicht vorhanden ist, ld
scheint sich so zu verhalten, als hätte das System kein vDSO zugeordnet.
Beachten Sie, dass dadurch das vDSO nicht irgendwie aus Ihrem Prozessspeicher entfernt wird, es wird lediglich ignoriert, wenn andere gemeinsam genutzte Bibliotheken verknüpft werden. Ein bösartiges Programm wird immer noch in der Lage sein, damit zu interagieren, wenn der Autor es wirklich wollte.
Ich weiß, diese Antwort kommt etwas spät, aber ich hoffe, diese Information wird einigen armen Seelen Kopfschmerzen ersparen
Für neuere Systeme echo 0 > /proc/sys/kernel/vsyscall64
könnte nicht funktionieren. In Ubuntu 16.04 kann vDSO systemweit deaktiviert werden, indem der Kernel-Parameter vdso=0
hinzugefügt wird in /etc/default/grub
unter dem Parameter:GRUB_CMDLINE_LINUX_DEFAULT
.
WICHTIG:Parameter GRUB_CMDLINE_LINUX_DEFAULT
kann von anderen Konfigurationsdateien in /etc/default/grub.d/...
überschrieben werden , also prüfen Sie genau, wann Sie Ihre benutzerdefinierte Konfiguration hinzufügen.