Was sind vdso und vsyscall?


87

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 vdsound vsyscallbedeutet? Ist vsyscall der Kernel-Teil des Speichers? Es wäre großartig, wenn jemand etwas Licht in das Thema bringen könnte.


5
Google für VDSO gibt diese VDSO- Wikipage (die weitere Referenzen enthält).
Basile Starynkevitch

In der Procfs-Dokumentation finden Sie in Ihrer Kernel-Version dieser Datei Einzelheiten zu Ihrem System.
Kunstloser Lärm

Ich denke eine bessere Erklärung, dass das, was im Wiki oder in der procfs-Dokumentation zu finden ist, für dieses Thema benötigt wird.
Giuseppe Pes

Antworten:


149

Die Segmente vsyscall und vDSO sind zwei Mechanismen, mit denen bestimmte Systemaufrufe unter Linux beschleunigt werden. Zum Beispiel gettimeofdaywird 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 Beispiel gettimeofdaymüssen Sie lediglich die aktuelle Uhrzeit des Kernels lesen. Es gibt Anwendungen, die gettimeofdayhä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ältgettimeofdayImplementierung (dh nur eine Funktion, die die in vsyscall eingesparte Zeit liest ). Mit diesem virtuellen Systemaufruf kann die C-Bibliothek ein Fasten bereitstellen, bei gettimeofdaydem der durch den Kontextwechsel zwischen Kernelraum und Benutzerraum verursachte Overhead nicht durch das klassische Systemaufrufmodell INT 0x80oder verursacht wird SYSCALL.

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, z gettimeofday. 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:


3
Warum kann vsyscall nur 4 Systemaufrufe haben? Es sind 8 Megabyte für Systemaufrufe reserviert und es wird nur 1 Seite (tatsächlich 3 Funktionen, zugewiesen von 1024, dauert 1 Seite) verwendet.
Skap

9

Ich möchte nur hinzufügen, dass jetzt in neuen Kerneln vDSOnicht 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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.