Ich tat sudo cat /proc/1/maps -vv
Ich versuche, die Ausgabe zu verstehen. Ich kann sehen, dass viele gemeinsam genutzte Bibliotheken wie erwartet dem Speicherzuordnungssegment zugeordnet werden.
7f3c00137000-7f3c00179000 r-xp 00000000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c00179000-7f3c00379000 ---p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c00379000-7f3c0037a000 r--p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c0037a000-7f3c0037b000 rw-p 00043000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c0037b000-7f3c00383000 r-xp 00000000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00383000-7f3c00583000 ---p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00583000-7f3c00584000 r--p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00584000-7f3c00585000 rw-p 00009000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00585000-7f3c0059b000 r-xp 00000000 08:01 21237220 /lib/x86_64-linux-gnu/libnih.so.1.0.0
7f3c0059b000-7f3c0079b000 ---p 00016000 08:01 21237220 /lib/x86_64-linux-gnu/libnih.so.1.0.0
7f3c0079b000-7f3c0079c000 r--p 00016000 08:01 21237220 /lib/x86_64-linux-gnu/libnih.so.1.0.0
Gegen Ende gibt es so etwas wie
7f3c0165b000-7f3c0177e000 rw-p 00000000 00:00 0 [heap]
7fff97863000-7fff97884000 rw-p 00000000 00:00 0 [stack]
7fff97945000-7fff97946000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Was bedeutet vdso
und vsyscall
bedeutet? Ist vsyscall der Kernel-Teil des Speichers? Es wäre großartig, wenn jemand etwas Licht in das Thema bringen könnte.
Antworten:
Die Segmente vsyscall und vDSO sind zwei Mechanismen, mit denen bestimmte Systemaufrufe unter Linux beschleunigt werden. Zum Beispiel
gettimeofday
wird normalerweise über diesen Mechanismus aufgerufen. Der erste eingeführte Mechanismus war vsyscall , der hinzugefügt wurde, um bestimmte Systemaufrufe auszuführen, für deren Ausführung keine wirklichen Berechtigungen erforderlich sind, um den Systemaufrufaufwand zu verringern. Nach dem vorherigen Beispielgettimeofday
müssen Sie lediglich die aktuelle Uhrzeit des Kernels lesen. Es gibt Anwendungen, diegettimeofday
häufig aufgerufen werden (z. B. um Zeitstempel zu generieren), bis zu dem Punkt, dass sie sich auch nur um ein wenig Overhead kümmern. Um dieses Problem zu beheben, ordnet der Kernel dem Benutzerbereich eine Seite zu, die die aktuelle Uhrzeit und ein Fasten enthältgettimeofday
Implementierung (dh nur eine Funktion, die die in vsyscall eingesparte Zeit liest ). Mit diesem virtuellen Systemaufruf kann die C-Bibliothek ein Fasten bereitstellen, beigettimeofday
dem der durch den Kontextwechsel zwischen Kernelraum und Benutzerraum verursachte Overhead nicht durch das klassische SystemaufrufmodellINT 0x80
oder verursacht wirdSYSCALL
.Dieser vsyscall- Mechanismus weist jedoch einige Einschränkungen auf: Der zugewiesene Speicher ist klein und erlaubt nur 4 Systemaufrufe. Wichtiger und schwerwiegender ist, dass die vsyscall- Seite in jedem Prozess statisch derselben Adresse zugewiesen wird, da sich der Speicherort der vsyscall- Seite befindet im Kernel ABI festgenagelt. Diese statische Zuordnung von vsyscall beeinträchtigt den Vorteil der von Linux üblicherweise verwendeten Randomisierung des Speicherplatzes. Ein Angreifer kann nach einer Gefährdung einer Anwendung durch Ausnutzen eines Stapelüberlaufs einen Systemaufruf vom vsyscall aus aufrufenSeite mit beliebigen Parametern. Er benötigt lediglich die Adresse des Systemaufrufs, die leicht vorhersehbar ist, da sie statisch zugewiesen ist (wenn Sie versuchen, Ihren Befehl auch mit verschiedenen Anwendungen erneut auszuführen, werden Sie feststellen, dass sich die Adresse des vsyscall nicht ändert). Es wäre schön, die Position der vsyscall-Seite zu entfernen oder zumindest zufällig zu sortieren, um diese Art von Angriff zu verhindern. Leider hängen Anwendungen von der Existenz und der genauen Adresse dieser Seite ab, sodass nichts unternommen werden kann.
Dieses Sicherheitsproblem wurde behoben, indem alle Systemaufrufanweisungen an festen Adressen durch eine spezielle Trap-Anweisung ersetzt wurden. Eine Anwendung, die versucht, die vsyscall- Seite aufzurufen, wird im Kernel abgefangen , der dann den gewünschten Aufruf des virtuellen Systems im Kernelraum emuliert. Das Ergebnis ist ein Kernel-Systemaufruf, der einen virtuellen Systemaufruf emuliert, der dort platziert wurde, um den Kernel-Systemaufruf überhaupt zu vermeiden. Das Ergebnis ist ein vsyscall, dessen Ausführung länger dauert, der jedoch den vorhandenen ABI nicht entscheidend beeinträchtigt . In jedem Fall wird die Verlangsamung nur angezeigt , wenn die Anwendung versucht, die vsyscall- Seite anstelle von vDSO zu verwenden .
Das vDSO bietet die gleiche Funktionalität wie das vsyscall und überwindet gleichzeitig seine Einschränkungen. Das vDSO (Virtual Dynamically Linked Shared Objects) ist ein im Benutzerbereich zugewiesener Speicherbereich, der einige Kernelfunktionen im Benutzerbereich auf sichere Weise verfügbar macht. Dies wurde eingeführt, um die Sicherheitsbedrohungen zu lösen, die durch die
vsyscall
. Das vDSO wird dynamisch zugewiesen, wodurch Sicherheitsbedenken gelöst werden und mehr als 4 Systemaufrufe möglich sind. Die vDSO- Links werden über die glibc-Bibliothek bereitgestellt. Der Linker verknüpft die glibc vDSO- Funktionalität, sofern eine solche Routine über eine zugehörige vDSO- Version verfügt, zgettimeofday
. Wenn Ihr Programm ausgeführt wird, wenn Ihr Kernel kein vDSO hat Unterstützung wird ein traditioneller Systemaufruf durchgeführt.Credits und nützliche Links:
quelle
Ich möchte nur hinzufügen, dass jetzt in neuen Kerneln
vDSO
nicht nur für "sichere" Systemaufrufe verwendet wird, sondern auch, um zu entscheiden, welcher Systemaufrufmechanismus die bevorzugte Methode zum Aufrufen eines Systemaufrufs auf dem System ist.quelle