Prozessoren stellen Privilegienmodi bereit, die vertrauliche Anweisungen und Speicherzugriffe einschränken. Linux verwendet diese Hardwaregrenze, damit gewöhnliche Anwendungsfehler weder direkt Kernelspeicher überschreiben noch Geräte neu konfigurieren können. Der Kernel steuert die Übergänge in die privilegierte Ausführung.
Kernel · Lektion 2
Privilegienstufen
Erfahre, wie Prozessorprivilegien die Benutzerausführung von vertrauenswürdiger Kernelausführung trennen.
Benutzermodus
Ein gewöhnlicher Prozess läuft im Benutzermodus innerhalb seines virtuellen Adressraums. Er kann frei rechnen und auf vom Kernel gewährte Speicherabbildungen zugreifen, die sehr groß sein können; Benutzermodus bedeutet nicht „nur wenig Speicher“. Er kann weder unmittelbar auf beliebigen physischen Speicher oder private Abbildungen eines anderen Prozesses noch auf privilegierte Prozessorsteuerungen zugreifen.
Seitentabellen und Schutzbits setzen den Speicherzugriff durch. Wenn ein Thread auf eine ungültige oder unzulässige Adresse verweist, löst der Prozessor eine Trap in den Kernel aus. Dieser kann einen gültigen Seitenfehler beheben oder ein Signal wie SIGSEGV zustellen.
Auf welchen Speicher kann ein Prozess im Benutzermodus gewöhnlich unmittelbar zugreifen?
Kernelmodus
Der Kernelmodus erlaubt die Ausführung privilegierter Anweisungen und den Zugriff auf geschützte Kernelabbildungen, die für Speicherverwaltung, Scheduling, Interruptbehandlung und Treiber erforderlich sind. Auf x86 wird diese Linux-Aufteilung gewöhnlich als Ring 0 für den Kernel und Ring 3 für Benutzerprozesse beschrieben. Linux verwendet die Ringe 1 und 2 gewöhnlich nicht für die normale Prozessisolation.
Andere Architekturen verwenden andere Bezeichnungen und Mechanismen, beispielsweise Exception Levels. Virtualisierung fügt Beziehungen zwischen Hypervisor und Gast hinzu, die nicht in eine einfache Zeichnung mit zwei Ringen passen. Entscheidend ist das kontrollierte Privileg und nicht die x86-Ringnummer selbst.
In welchem x86-Schutzring läuft der Linux-Kernel gewöhnlich?
Kontrollierte Übergänge
Mehrere Ereignisse übertragen die Kontrolle an einen Kernel-Einstiegspunkt:
- Eine Systemaufrufanweisung fordert einen Kerneldienst an.
- Eine Ausnahme meldet einen Zustand wie einen Seitenfehler oder eine ungültige Anweisung.
- Ein Hardware-Interrupt meldet ein externes Ereignis.
Der Prozessor speichert den Ausführungskontext, ändert das Privileg entsprechend den konfigurierten Einstiegsmechanismen und beginnt mit der Ausführung vertrauenswürdigen Kernelcodes. Der Kernel validiert Anfrage und Zustand, führt die Arbeit aus oder lehnt sie ab und kehrt gegebenenfalls in den Benutzermodus zurück.
Die Anwendung wird nicht vorübergehend zu Kernelcode. Die CPU führt im Namen des Threads einen Kernelhandler mit vom Kernel gesteuerten Stacks und Abbildungen aus.
Was geschieht während eines Systemaufrufübergangs?
CPU-Privilegien sind keine Benutzeridentität
Eine Anwendung, die als Linux-Benutzer root läuft, führt ihre Anweisungen gewöhnlich weiterhin im Benutzermodus aus. UID 0 beeinflusst Autorisierungsprüfungen des Kernels, erlaubt ihren Anweisungen aber keinen direkten Zugriff auf Kernelspeicher. Umgekehrt läuft Kernelcode unabhängig davon im privilegierten Modus, welcher Benutzer durch seinen Systemaufruf die Ausführung veranlasst hat.
Capabilities, Namensräume, seccomp, Sicherheitsmodule und cgroups schränken weiter ein, was ein Prozess anfordern darf. Diese geschichtete Richtlinie ist von der Hardwaregrenze zwischen Benutzer- und Kernelmodus getrennt.
Welche Aussage vergleicht die root-Identität und den Kernelmodus richtig?
Warum die Grenze wichtig ist
Die Grenze begrenzt Schäden durch gewöhnliche Fehler und stellt einen Ort für Zugriffsprüfungen bereit. Kernel-Schwachstellen und bösartige Module können sie jedoch überwinden. Halte Kernel und Firmware über vertrauenswürdige Kanäle aktuell, minimiere privilegierten Code und lade keine nicht vertrauenswürdigen Module.
Probleme mit spekulativer Ausführung und Seitenkanäle zeigen außerdem, dass Hardwareisolation fortlaufende Gegenmaßnahmen benötigt. Ein „anderer Ring“ ist eine Grundlage und kein vollständiger Sicherheitsbeweis.
Garantiert die Trennung von Benutzer- und Kernelmodus vollständige Systemsicherheit?
Lektion abgeschlossen
Sie haben Privilegienstufen abgeschlossen
Du kannst nun Hardware-Ausführungsprivilegien von Linux-Kontobefugnissen unterscheiden.
Setze den Benutzermodus mit geschützten virtuellen Adressräumen in Beziehung.
Setze den Kernelmodus mit privilegierten Anweisungen und Abbildungen in Beziehung.
Behandle Systemaufrufe, Ausnahmen und Interrupts als kontrollierte Einstiegspunkte.
Trenne die Autorisierung der UID 0 von der Ausführung in Ring 0.
Betrachte Privilegienmodi als eine Schicht eines umfassenderen Sicherheitsentwurfs.
Lernfortschritt speichern
Erstellen Sie ein kostenloses Konto, um diese Lektion zu speichern und auf jedem Gerät weiterzulernen.
Kostenloses Konto erstellen