Der vsyscall und vDSO Segmente sind zwei Mechanismen, die verwendet werden, um bestimmte Systemaufrufe in Linux zu beschleunigen. Zum Beispiel gettimeofday
wird normalerweise über diesen Mechanismus aufgerufen. Der erste eingeführte Mechanismus war vsyscall , das hinzugefügt wurde, um bestimmte Systemaufrufe auszuführen, für deren Ausführung keine wirkliche Berechtigungsebene erforderlich ist, um den Systemaufruf-Overhead zu reduzieren. Nach dem vorherigen Beispiel alle gettimeofday
tun muss, ist die aktuelle Zeit des Kernels zu lesen. Es gibt Anwendungen, die gettimeofday
aufrufen häufig (z. B. um Zeitstempel zu generieren), bis zu dem Punkt, dass sie sich auch nur um ein bisschen Overhead kümmern. Um dieses Problem zu lösen, bildet der Kernel im Benutzerbereich eine Seite ab, die die aktuelle Zeit und ein schnelles gettimeofday
enthält Implementierung (also nur eine Funktion, die die eingesparte Zeit in vsyscall einliest ). Mit diesem virtuellen Systemaufruf kann die C-Bibliothek einen schnellen gettimeofday
bereitstellen das nicht den Overhead hat, der durch den Kontextwechsel zwischen Kernel-Space und User-Space eingeführt wird, der normalerweise durch das klassische Systemaufrufmodell INT 0x80
eingeführt wird oder SYSCALL
.
Allerdings ist dieser vsyscall Der Mechanismus hat einige Einschränkungen:Der zugewiesene Speicher ist klein und erlaubt nur 4 Systemaufrufe und, was noch wichtiger und schwerwiegender ist, den vsyscall Seite wird in jedem Prozess statisch dieselbe Adresse zugewiesen, da der Ort des vsyscall Seite ist im Kernel ABI festgenagelt. Diese statische Zuweisung des vsyscall kompromittiert den Vorteil, der durch die Randomisierung des Speicherplatzes eingeführt wird, die üblicherweise von Linux verwendet wird. Ein Angreifer kann, nachdem er eine Anwendung durch Ausnutzen eines Stapelüberlaufs kompromittiert hat, einen Systemaufruf von vsyscall aufrufen Seite mit beliebigen Parametern. Alles, was er braucht, ist die Adresse des Systemaufrufs, die leicht vorhersehbar ist, da sie statisch zugewiesen wird (wenn Sie versuchen, Ihren Befehl auch mit anderen Anwendungen erneut auszuführen, werden Sie feststellen, dass die Adresse des vsyscall ändert sich nicht). 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 Systemaufrufbefehle an festen Adressen durch einen speziellen Trap-Befehl ersetzt wurden. Eine Anwendung, die versucht, vsyscall anzurufen page wird in den Kernel eingefangen, der dann den gewünschten virtuellen Systemaufruf 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 Die Ausführung dauert länger, bricht aber vor allem nicht die bestehende ABI. In jedem Fall wird die Verlangsamung nur angezeigt, wenn die Anwendung versucht, den vsyscall zu verwenden Seite anstelle des vDSO .
Das vDSO bietet die gleiche Funktionalität wie vsyscall, überwindet aber dessen Einschränkungen. Das vDSO (Virtual Dynamically linked Shared Objects) ist ein Speicherbereich, der im Benutzerbereich zugewiesen ist und einige Kernel-Funktionalitäten im Benutzerbereich auf sichere Weise verfügbar macht. Dies wurde eingeführt, um die durch vsyscall
verursachten Sicherheitsbedrohungen zu beseitigen .Das vDSO wird dynamisch zugewiesen, was Sicherheitsprobleme löst, und kann mehr als 4 Systemaufrufe haben. Das vDSO Links werden über die glibc-Bibliothek bereitgestellt. Der Linker verlinkt das glibc vDSO Funktionalität, vorausgesetzt, dass eine solche Routine ein begleitendes vDSO hat Version, wie z. B. gettimeofday
. Wenn Ihr Programm ausgeführt wird, wenn Ihr Kernel kein vDSO hat Unterstützung, wird ein traditioneller Systemaufruf durchgeführt.
Danksagungen und nützliche Links :
- Tolles Tutorial, wie man sein eigenes vDSO erstellt.
- vsyscall und vDSO, schöner Artikel
- nützliche Artikel und Links
- Was ist linux-gate.so.1?
Ich möchte das jetzt nur in neuen Kerneln hinzufügen, vDSO
wird nicht nur für "sichere" Systemaufrufe verwendet, sondern es wird verwendet, um zu entscheiden, welcher Systemaufrufmechanismus die bevorzugte Methode zum Aufrufen eines Systemaufrufs auf dem System ist.