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 Beispiel gettimeofday
müssen Sie lediglich die aktuelle Uhrzeit des Kernels lesen. Es gibt Anwendungen, die gettimeofday
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, bei gettimeofday
dem der durch den Kontextwechsel zwischen Kernelraum und Benutzerraum verursachte Overhead nicht durch das klassische Systemaufrufmodell INT 0x80
oder 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: