Schutz, Isolation und virtuelle Maschinen

Lerne, wie ein Betriebssystem sich selbst und seine Benutzer schützt. Verfolge, wie Privilegstufen des Prozessors, Systemaufrufe und Seitentabellenberechtigungen Programme voneinander trennen, wie das System deine Identität prüft und Passwörter sicher speichert und wie Zugriffskontrolllisten, Capabilities, Unix- und Windows-Berechtigungen sowie systembestimmte Regeln darüber entscheiden, wer was nutzen darf. Sieh anschließend, wie Hypervisoren vollständige Betriebssysteme in virtuellen Maschinen nebeneinander ausführen und wie Container Anwendungen mit Namensräumen, Kontrollgruppen und eingeschränkten Privilegien isolieren. So kannst du für eine Arbeitslast die passende Isolationsgrenze wählen.

MittelEinheit 9 von 9 in Kurs: Betriebssysteme – Prozesse, Speicher, Threads und Dateisysteme

Was du lernst

  1. Beschreibe die Prozessormodi, kontrollierten Eintrittspunkte und Speicherschutzmechanismen, die verhindern, dass Programme einander oder den Kernel beschädigen, sowie die Mechanismen, die Angriffe darauf erschweren.
    • Trenne Benutzermodus und Kernelmodus
      Erkläre Privilegstufen und privilegierte Befehle und beschreibe, was passiert, wenn ein Programm etwas versucht, das nur der Kernel tun darf.
    • Wechsle über Systemaufrufe sicher in den Kernel
      Verfolge einen Systemaufruf vom Trap bis zur Berechtigungsprüfung und erkläre, warum der Kernel jedem erhaltenen Argument misstrauen muss.
    • Schütze Speicher und Geräte
      Erkläre anhand von Seitentabellenberechtigungen, Speicherabbildungen mit ausschließlichem Kernelzugriff und der IOMMU, wie der Kernel jeden Prozess auf dessen eigenen Speicher beschränkt.
    • Erschwere Angriffe auf Programme und den Kernel
      Erkläre, wie nicht ausführbarer Speicher, Adressrandomisierung, Systemaufruffilter, Secure Boot und Überwachungsprotokolle die Ausnutzung von Schwachstellen erschweren und Ereignisse aufzeichnen.
  2. Erkläre, wie ein Betriebssystem die Identität eines Benutzers prüft, Passwörter sicher speichert, weitere Authentifizierungsfaktoren nutzt und die daraus resultierende Identität an jeden Prozess weitergibt.
    • Weise Prozessen Identitäten zu
      Verfolge eine Anmeldung von der Passwortabfrage bis zu einer laufenden Shell und erkläre Benutzerkennungen, Gruppen, Vererbung und Programme, die Privilegien ändern, etwa Setuid-Programme und sudo.
    • Speichere und prüfe Passwörter sicher
      Erkläre Hashing, Salting und langsame Passwort-Hashing-Funktionen und berechne, wie sie den Aufwand für Rateangriffe verändern.
    • Authentifiziere dich mit Besitzmerkmalen und biometrischen Merkmalen
      Vergleiche Passwörter, Token und Biometrie, kombiniere sie bei der Mehrfaktorauthentifizierung und authentifiziere Dienste und Maschinen, an deren Tastatur keine Person sitzt.
  3. Stelle Rechte als Zugriffsmatrix dar, implementiere sie mit Zugriffskontrolllisten oder Capabilities, lies und setze Unix- und Windows-Berechtigungen und vergleiche benutzerbestimmte, systembestimmte und rollenbasierte Modelle.
    • Vergleiche Zugriffskontrolllisten und Capabilities
      Speichere dieselben Rechte nach Objekt oder nach Subjekt und wäge die beiden Ansätze für Prüfung, Überprüfung, Delegation und Widerruf von Zugriffen ab.
    • Lies und setze Berechtigungen unter Unix und Windows
      Interpretiere Berechtigungsbits und oktale Berechtigungsdarstellungen, wende die Unix-Prüfregeln auf Dateien und Verzeichnisse an und lies POSIX-ACLs und Windows-Zugriffssteuerungseinträge.
    • Vergleiche benutzerbestimmte, systembestimmte und rollenbasierte Zugriffskontrolle
      Unterscheide Modelle, in denen Eigentümer entscheiden, von Modellen mit systemweiten Regeln, und nutze Rollen, um die Rechte vieler Benutzer zu verwalten.
  4. Erkläre, wie ein Hypervisor Prozessor, Speicher und Geräte eines Computers auf mehrere vollständige Betriebssysteme aufteilt und diese zugleich voneinander isoliert.
    • Beschreibe virtuelle Maschinen und Hypervisoren
      Definiere virtuelle Maschinen und Hypervisoren, unterscheide Konzepte vom Typ 1 und Typ 2 und erkläre, wofür Virtualisierung eingesetzt wird und wo ihre Isolation endet.
    • Virtualisiere den Prozessor
      Erkläre Trap-and-Emulate, warum klassisches x86 es nicht direkt nutzen konnte und wie Binärübersetzung, Paravirtualisierung und Hardwareunterstützung das Problem lösten.
    • Virtualisiere den Speicher
      Übersetze eine virtuelle Gastadresse in eine reale Maschinenadresse und vergleiche Schattenseitentabellen mit hardwaregestützter verschachtelter Seitenverwaltung.
    • Virtualisiere Geräte und isoliere virtuelle Maschinen voneinander
      Vergleiche emulierte, paravirtuelle und durchgereichte Geräte und erkläre die Stärken und Grenzen der Isolation zwischen virtuellen Maschinen.
  5. Setze einen Container aus Kernelfunktionen zusammen (Namensräume für das, was ein Prozess sehen kann, Kontrollgruppen für das, was er nutzen kann, und Privilegbegrenzungen für das, was er tun darf) und entscheide, wann du einen Container oder eine virtuelle Maschine einsetzt.
    • Begrenze mit Namensräumen, was ein Prozess sehen kann
      Erkläre die Linux-Namensraumtypen, erzeuge Namensräume und tritt ihnen bei, und interpretiere PID-, Mount-, Netzwerk- und Benutzernamensräume.
    • Begrenze mit Kontrollgruppen den Ressourcenverbrauch eines Prozesses
      Organisiere Prozesse in Kontrollgruppen, setze Grenzen für CPU, Speicher, Prozessanzahl und Ein-/Ausgabe und interpretiere die Grenzwerte.
    • Schränke Container ein und wähle zwischen Containern und virtuellen Maschinen
      Verringere die Befugnisse eines Prozesses im Container, erkläre das Risiko eines gemeinsam genutzten Kernels und wähle für eine Arbeitslast Container, virtuelle Maschinen oder beides.

Schutz, Isolation und virtuelle Maschinen einfach erklärt

5 Kapitel

1

Erkläre, wie Hardware und Kernel das System schützen

Programme laufen schnell, weil gewöhnliche Befehle direkt auf dem Prozessor ausgeführt werden. Hardwareberechtigungen und kontrollierte Eintrittspunkte in den Kernel machen diese Freiheit sicher genug, um einen Rechner gemeinsam zu nutzen. Verfolge die Grenze von CPU-Privilegien über Systemaufrufprüfungen bis zum Speicher- und Gerätezugriff. Sieh dann, wie Ausführungsbeschränkungen, Randomisierung, Startüberprüfung und Protokolle Angriffe auf Programme und den Kernel begrenzen.

1.1 Trenne Benutzermodus und Kernelmodus

Ein Programm braucht genügend Freiheit, um schnell zu rechnen, ohne die Kontrolle über den gesamten Computer zu erlangen. Im Benutzermodus kann es gewöhnliche Befehle direkt ausführen. Der Kernelmodus, auch Supervisormodus genannt, gibt dem Betriebssystem Zugriff auf die Befehle, die den Rechner steuern.

Lass die Hardware Privilegien durchsetzen

Die CPU besitzt eine aktuelle Privilegstufe. Additionen, Lade- und Speicherzugriffe sowie Sprünge laufen normalerweise mit voller Geschwindigkeit, soweit die Speicherberechtigungen es erlauben. Der Kernel prüft nicht jeden Befehl per Software. Das ist eingeschränkte direkte Ausführung: direkte Ausführung, bis eine geschützte Operation oder ein Interrupt den Kernel benötigt.

Ein privilegierter Befehl löst einen Trap aus, wenn Benutzercode ihn auszuführen versucht. Auf x86-64 benötigen HLT, das Beschreiben des Seitentabellen-Basisregisters CR3 und das Einrichten einer Interrupttabelle mit LIDT Kernelprivilegien. Andernfalls könnte eine Anwendung die CPU anhalten, ihre eigenen Speichergrenzen ersetzen oder die Interruptbehandlung umleiten.

Angenommen, eine Anwendung führt HLT aus. Die CPU löst eine allgemeine Schutzverletzung aus, statt anzuhalten. Sie ruft die vom Kernel registrierte Behandlungsroutine auf. Linux sendet dem Prozess normalerweise SIGSEGV und beendet ihn, während andere Programme weiterlaufen. Die Anwendung kann nicht eine beliebige passende Adresse innerhalb des Kernels wählen und dort mit der Ausführung beginnen.

Überschreite die Grenze über einen kontrollierten Eintrittspunkt

Traps, Ausnahmen und Interrupts führen über vom Kernel registrierte Adressen in den Kernel. Die Hardware ändert die Privilegstufe und überträgt die Kontrolle an die Behandlungsroutine; der Eintrittscode des Kernels sichert den für die Rückkehr nötigen Zustand. Ein spezieller Rücksprungbefehl stellt die Ausführung im Benutzermodus am gespeicherten Befehlszähler wieder her. Auf x86-64 kann die Rückkehr SYSRET oder IRETQ nutzen.

Der Timer macht diese Kontrolle auch dann nutzbar, wenn ein Programm nie eine Leistung anfordert. Bevor der Kernel es ausführt, programmiert er einen Timer. Wenn der Interrupt eintrifft, kann der Scheduler einen anderen Prozess auswählen. Benutzercode kann weder Interrupts abschalten noch diesen Timer umprogrammieren. Daher kann eine Endlosschleife einen Kern nicht für immer belegen.

Lies Privilegdiagramme richtig
ArchitekturAnwendungKernelWeitere Ebenen
x86Ring 3Ring 0Ringe 1 und 2 existieren, bleiben aber bei gewöhnlichen Linux- und Windows-Kerneln ungenutzt
ARMv8-AEL0EL1EL2 unterstützt einen Hypervisor; EL3 unterstützt den sicheren Firmwaremonitor
RISC-VU-ModusS-ModusDer M-Modus besitzt Maschinenprivilegien

Die Nummerierung unterscheidet sich: Eine niedrigere x86-Ringnummer bedeutet mehr Privilegien, während eine höhere ARM-Ausnahmeebene mehr Privilegien bedeutet. Die Intel-Virtualisierung ergänzt außerdem VMX-Root- und Non-Root-Betrieb; diese sind unabhängig von der Ringnummer.

Trenne Identität und CPU-Modus

Root ist eine Benutzeridentität, UID 0, die Kernelsoftware erkennt. Der gewöhnliche Code einer Root-Anwendung läuft weiterhin im Benutzermodus und wechselt über Systemaufrufe in den Kernel. Ein Gerätetreiber im Kernelmodus hat erheblich mehr direkte Befugnisse: Ein Speicherfehler dort kann den Kernelzustand beschädigen, ohne eine Dateiberechtigungsprüfung zu durchlaufen.

Die Ebene, die eine Grenze durchsetzt, muss die Ebene darin kontrollieren. Der Kernel setzt Prozessgrenzen mit CPU-Modi und Speichertabellen durch. Ebenso kontrolliert ein Hypervisor Gastbetriebssysteme mithilfe der Hardwareunterstützung für Virtualisierung.

Wichtige Erkenntnisse

  • Benutzerbefehle laufen direkt, bis die Hardware einen Eintritt in den Kernel erfordert.
  • Privilegierte Operationen schützen Seitentabellen, Interrupts, Timer und die Gerätesteuerung.
  • Der Timer ermöglicht dem Scheduler, einer Endlosschleife einen Kern wieder zu entziehen.
  • Die Identität root versetzt eine Anwendung nicht in den Kernelmodus.
  • Die Nummerierung der Privilegstufen hängt von der Architektur ab.

1.2 Wechsle über Systemaufrufe sicher in den Kernel

Ein Systemaufruf ist eine kontrollierte Anfrage nach einer Leistung des Kernels. Das Öffnen von Dateien, Erzeugen von Prozessen und Senden von Netzwerkdaten erfordert jeweils Entscheidungen, die eine Anwendung nicht sicher selbst treffen kann. Der Eintritt in den Kernel gibt der Behandlungsroutine Befugnisse; er erlaubt dem Aufrufer nicht, alles Angeforderte zu tun.

Verfolge die Anfrage

Ein Bibliothekswrapper der C-Bibliothek wie open() legt die Aufrufnummer und die Argumente in Registern ab. Er nutzt SYSCALL auf x86-64, SVC auf ARM64 oder ECALL auf RISC-V. Der Kernel führt dann folgende Schritte aus:

  1. Er tritt über seinen registrierten Eintrittspunkt ein und sichert Benutzerregister.
  2. Er wählt die Behandlungsroutine aus der Systemaufruftabelle und weist eine unbekannte Nummer zurück.
  3. Er liest Identität und Anmeldeinformationen des Aufrufers aus dem aktuellen Prozess.
  4. Er prüft Argumente, Zugriffsrechte und die beteiligten Objekte.
  5. Er führt die Operation aus oder gibt einen Fehler zurück.
  6. Er stellt den gesicherten Zustand wieder her und kehrt in den Benutzermodus zurück.

Die Identität stammt aus den Anmeldeinformationen des Prozesses, nicht aus einem vom Benutzer angegebenen Namen. Ein Aufrufer kann die Rechte eines anderen Benutzers nicht erhalten, indem er dessen Namen zu einer Anfrage hinzufügt.

Behandle Argumente als nicht vertrauenswürdig

Ein Zeiger ist lediglich eine vom Aufrufer angegebene Zahl. Der Kernel muss den gesamten angeforderten Benutzerspeicherbereich einschließlich Länge und Zugriffsrichtung prüfen. Linux nutzt geprüfte Routinen wie copy_from_user und copy_to_user, um die Grenze sicher zu überschreiten.

Bei read(fd, buf, 4096) darf ein buf, das in den Kernelspeicher zeigt, nicht zum Ziel für Dateidaten werden. Linux meldet für diesen ungültigen Benutzerpuffer EFAULT. Ein anderer Fehler hat eine andere Ursache: write() über einen mit O_RDONLY geöffneten Deskriptor schlägt mit EBADF fehl, weil für den Deskriptor nie Schreibzugriff gewährt wurde. Eine gewöhnliche abgelehnte Anfrage gibt einen Fehler zurück; sie beendet den Prozess nicht automatisch. In C gibt der Wrapper gewöhnlich −1 zurück und setzt errno.

Prüfe das tatsächlich verwendete Objekt

Eine TOCTTOU-Wettlaufsituation trennt eine Entscheidung von dem Objekt, das sie schützen sollte. Ein privilegiertes Hilfsprogramm prüft access("/tmp/report", W_OK) und öffnet dann den Pfad. Ein Angreifer ersetzt den Pfad zwischen diesen Operationen durch einen symbolischen Link auf /etc/passwd. Der Name ist unverändert, aber das geöffnete Objekt ist ein anderes.

Die Lösung besteht darin, unter der vorgesehenen Identität auf das tatsächlich geöffnete Objekt zuzugreifen. Gib vor dem Öffnen Privilegien ab und nutze Flags wie O_NOFOLLOW, wenn symbolische Links unerwünscht sind. Argumente einmal in den Kernelspeicher zu kopieren vermeidet ebenfalls, veränderlichen Benutzerdaten wiederholt zu vertrauen; die kopierte Struktur muss dennoch geprüft werden.

Bestimme, was vertrauenswürdig sein muss

Ein Referenzmonitor vermittelt Zugriffe. Er muss immer aufgerufen werden, wenn Zugriff erlangt wird, vor Manipulation geschützt und klein genug sein, um ihn sorgfältig zu untersuchen. Nachdem der Kernel eine Speicherabbildung gewährt hat, durchlaufen einzelne Lade- und Speicherzugriffe die Berechtigungsprüfungen der MMU; sie lösen nicht jeweils einen Systemaufruf aus.

Die vertrauenswürdige Rechenbasis (TCB) umfasst die Hardware, Firmware und privilegierte Software, von deren Korrektheit der Schutz abhängt. Dazu gehören CPU, Bootkette, Kernel und vertrauenswürdige Anmeldekomponenten. Treiber oder Dateisysteme in Server im Benutzermodus zu verlagern, kann den Kernelanteil dieser Basis verkleinern, wie es Mikrokernelkonzepte tun. Eine kompromittierte gewöhnliche Anwendung missbraucht ihre gewährten Rechte; eine kompromittierte vertrauenswürdige Komponente kann die Prüfungen selbst untergraben.

Wichtige Erkenntnisse

  • Der Eintritt in den Kernel und die Erlaubnis, eine Operation auszuführen, sind getrennte Dinge.
  • Prüfe Zeigerbereiche und Zugriffsrechte, bevor du Benutzerargumente verwendest.
  • Eine TOCTTOU-Wettlaufsituation kann dazu führen, dass ein geprüfter Name auf ein anderes Objekt verweist.
  • Ein Referenzmonitor muss gegen Umgehung und Manipulation geschützt sein.
  • Die TCB umfasst mehr als den Kernel.
  • Ein verweigerter Systemaufruf gibt gewöhnlich einen Fehler zurück, den das Programm behandeln kann.

1.3 Schütze Speicher und Geräte

Virtueller Speicher übersetzt Adressen und schützt zugleich Programme. Ein Prozess kann die physischen Seitenrahmen erreichen, die seine aktive Seitentabelle nennt, und zwar mit den vom Kernel festgelegten Berechtigungen. Die privaten Seitenrahmen eines anderen Prozesses fehlen; gezielte Abbildungen gemeinsam genutzten Speichers sind eine ausdrückliche Ausnahme.

Prüfe jeden Speicherzugriff

Die Speicherverwaltungseinheit (MMU) prüft bei Zugriffen die Seitentabelleneinträge. Wichtige Berechtigungen sind präsent oder gültig, beschreibbar, für Benutzer zugänglich und ausführbar. Auf x86 unterscheidet U/S zwischen für Benutzer zugänglichen Seiten und Seiten mit ausschließlichem Kernelzugriff; NX oder XD verhindert die Ausführung. ARM nennt seine Ausführungsbeschränkung XN.

Ein Verstoß löst einen Seitenfehler aus. Der Fehler meldet eine fehlgeschlagene Hardwareprüfung; der Kernel entscheidet, ob dieser Fehlschlag erwartet und behebbar ist. Betrachte zwei Schreibzugriffe auf schreibgeschützte Seiten:

  • Ein Prozess überschreibt eine Codeseite, die keine Copy-on-Write-Seite ist. Der Kernel behandelt dies als ungültigen Schreibzugriff und sendet normalerweise SIGSEGV.
  • Nach fork() schreibt ein Prozess gemeinsam genutzte Daten, die als Copy-on-Write markiert sind. Der Kernel reserviert eine private Kopie, macht die Abbildung beschreibbar und versucht den Befehl erneut.

Beide Fehler gehen von einem Schutzbit aus. Die Verwaltungsdaten des Kernels erklären, warum die Abbildungen schreibgeschützt waren, und bestimmen die Reaktion. Ein Seitenfehler bedeutet daher nicht automatisch einen Absturz oder eine Anfrage, Daten von der Festplatte zu laden.

Schütze Kernelabbildungen in beide Richtungen

Herkömmliche Speicherlayouts bilden Kernelspeicher mit ausschließlichem Kernelzugriff in Prozessadressräume ab. Das erleichtert den Kerneleintritt und blockiert zugleich Lese- und Schreibzugriffe aus dem Benutzermodus. Der Meltdown-Angriff von 2018 zeigte, dass einige Prozessoren solche Daten durch spekulative Ausführung preisgeben konnten. Die Kernel-Seitentabellenisolation (KPTI) entfernt auf betroffenen Systemen die meisten Kernelabbildungen, während Benutzercode läuft.

Kernelcode muss auch davor geschützt werden, in benutzerkontrollierten Speicher umgeleitet zu werden. SMEP auf x86 verhindert die Ausführung von Benutzerseiten im Kernelmodus. SMAP blockiert Datenzugriffe im Kernelmodus auf Benutzerseiten, außer bei gezielt erlaubten Kopieroperationen. ARM bietet entsprechende Schutzmechanismen durch PXN und PAN. Diese Prüfungen verringern die Möglichkeiten eines Angreifers, einen Kernelfehler zum Ausführen von Code oder zum Bereitstellen gefälschter Kerneldaten zu nutzen.

Schreibgeschützter Zugriff schützt die Integrität, nicht die Geheimhaltung. Kann ein Prozess eine abgebildete Seite lesen, kann er ihren Inhalt erfahren, selbst wenn Schreibzugriffe fehlschlagen. Vertrauliche Daten müssen für diesen Prozess unzugänglich sein: Bilde sie nicht ab oder setze eine geeignete Grenze mit ausschließlichem Kernelzugriff durch.

Gib Geräten eine eigene Grenze

Anwendungen fordern Geräteoperationen gewöhnlich über einen Treiber an. Geräteregister sind normalerweise nur für den Kernel zugänglich. Ein berechtigter Prozess kann jedoch ausgewählte Abbildungen erhalten, wie bei Grafiktreibern oder Userspace-Ein-/Ausgabe unter Linux.

Ein Gerät mit direktem Speicherzugriff (DMA) liest oder beschreibt RAM, ohne diese Zugriffe durch die MMU der CPU zu leiten. CPU-Seitenberechtigungen allein können ein fehlerhaftes Gerät nicht daran hindern, die Seitenrahmen eines anderen Prozesses zu überschreiben. Eine IOMMU übersetzt und begrenzt Geräteadressen mit gerätespezifischen Abbildungen. Intel VT-d und AMD-Vi stellen diesen Mechanismus bereit.

Bei einem Gerät, das einer VM zugewiesen ist, begrenzt die IOMMU den DMA-Zugriff auf den dieser VM zugewiesenen Speicher. Auf CPU-Seite ist eine entsprechende Grenze nötig: Eine zweite Stufe der Seitenübersetzung bildet physische Gastadressen nur auf Seitenrahmen ab, die der Hypervisor erlaubt. Um eine Arbeitslast zu schützen, müssen sowohl CPU- als auch Gerätezugriffe abgedeckt werden.

Wichtige Erkenntnisse

  • Die MMU setzt die Abbildungen und Berechtigungsbits durch, die der Kernel einrichtet.
  • Ein Seitenfehler kann eine Wiederherstellung, Copy-on-Write oder ein Signal auslösen, das den Prozess beendet.
  • Schreibgeschützter Zugriff macht Daten nicht vertraulich.
  • KPTI entfernt die meisten Kernelabbildungen während der Ausführung im Benutzermodus.
  • SMEP und SMAP begrenzen die Nutzung von Benutzerseiten durch den Kernel.
  • Die IOMMU begrenzt DMA-Zugriffe, die die CPU-MMU umgehen.

1.4 Erschwere Angriffe auf Programme und den Kernel

Ein Fehler, der die Speichersicherheit verletzt, kann zu einem Angriff führen, wenn beschädigte Daten den Kontrollfluss des Programms ändern. Ein Pufferüberlauf auf dem Stack kann beispielsweise eine gespeicherte Rücksprungadresse überschreiben. Schutzmechanismen des Betriebssystems begrenzen, was ein Angreifer mit diesem Fehler tun kann; sie beheben den fehlerhaften Schreibzugriff nicht.

Trenne Daten von ausführbarem Code

Das NX-Bit markiert Datenseiten als nicht ausführbar. Windows nennt dies Data Execution Prevention (DEP). Das Einschleusen von Befehlen in einen Stackpuffer ist weniger nützlich, wenn ein Sprung dorthin einen Fehler auslöst.

W^X, schreibbar exklusiv oder ausführbar, ist strenger: Keine Seite ist gleichzeitig beschreibbar und ausführbar. DEP allein verbietet einem Programm nicht, eine solche Abbildung ausdrücklich anzufordern. Unter W^X schreibt ein Just-in-Time-Compiler erzeugten Code in beschreibbaren Speicher und ändert dann dessen Berechtigungen, bevor er ihn ausführt.

Ein Angreifer kann stattdessen vorhandene ausführbare Befehle wiederverwenden. Return-Oriented Programming (ROP) verkettet kurze Befehlsfolgen, die Gadgets heißen. Die Randomisierung des Adressraumlayouts (ASLR) ändert die Positionen von Stacks, Heaps, Bibliotheken und positionsunabhängigen Programmen, sodass Gadget-Adressen schwer vorherzusagen sind.

Wird die Basis einer Bibliothek gleichverteilt aus 228 Positionen gewählt, gelingt ein blinder Rateversuch mit einer Wahrscheinlichkeit von 1 zu 268.435.456. Bei nur 28=256 Positionen und einem Layout, das über Abstürze von Worker-Prozessen hinweg erhalten bleibt, braucht das Ausprobieren verschiedener Positionen höchstens 256 Versuche und durchschnittlich 128,5. Eine preisgegebene Adresse innerhalb einer bekannten Bibliothek verrät deren Basis und die Offsets der Gadgets in dieser Bibliothek. Ein getrennt randomisierter Stack kann weiterhin unbekannt bleiben.

Begrenze die Leistungen, die ein Angreifer anfordern kann

Seccomp-Filter unter Linux beschränken die Systemaufrufe, die ein Prozess ausführen darf. Einem Browserprozess zur Darstellung von Webseiten können beispielsweise Aufrufe zum Starten von Programmen oder zum direkten Öffnen von Dateien verweigert werden. Kindprozesse erben die Filter; sie lassen sich nicht entfernen, und spätere Filter können die Einschränkungen verschärfen. Ein übernommener Darstellungsprozess verfügt weiterhin über seine erlaubten Operationen. Ein Filter ist also eine Grenze für Leistungen und kein Beweis dafür, dass das Programm fehlerfrei ist. pledge von OpenBSD und die App Sandbox von macOS bieten ähnliche Einschränkungen.

Prüfe den Start und sichere Belege

Secure Boot prüft Signaturen entlang der Bootkette. Die Firmware prüft einen vertrauenswürdigen Bootloader; der Bootloader prüft den Kernel; der Kernel kann signierte Module verlangen. Eine veränderte Komponente ohne vertrauenswürdige Signatur wird zurückgewiesen. Das hilft, dauerhafte Änderungen an der Startsoftware zu verhindern, aber eine gültige Signatur beweist nicht, dass die Software keine Schwachstellen hat.

Measured Boot zeichnet Hashes geladener Komponenten auf, gewöhnlich mithilfe eines TPM. Diese Messwerte ermöglichen eine Attestierung: Eine andere Partei kann den gestarteten Zustand mit einem erwarteten Zustand vergleichen. Messen und das Verweigern des Starts sind unterschiedliche Operationen.

Die Überwachungsprotokollierung zeichnet Anmeldungen, fehlgeschlagene Authentifizierungen, verweigerte Berechtigungen, Kontoänderungen und privilegierte Aktionen wie sudo auf. Protokolle unterstützen die Erkennung und Rekonstruktion. Ein Angreifer, der einen Host kontrolliert, kann lokale Aufzeichnungen löschen. Geschützte Protokolle oder eine Protokollierung auf einem anderen Rechner erhalten daher Belege über diesen Host hinaus.

Angreifer können die Preisgabe einer Adresse, einen Fehler mit Speicherbeschädigung und einen Sandbox-Ausbruch kombinieren. Updates beseitigen die zugrunde liegenden Schwachstellen, die diese Schutzmechanismen bestehen lassen.

Wichtige Erkenntnisse

  • NX blockiert die Ausführung von markierten Datenseiten; W^X verbietet zusätzlich gleichzeitige Schreib- und Ausführungsberechtigungen.
  • ASLR macht Adressen für die Codewiederverwendung schwerer vorhersagbar.
  • Eine preisgegebene Bibliotheksadresse muss getrennt randomisierte Bereiche nicht aufdecken.
  • Systemaufruffilter begrenzen die Leistungen, die einem übernommenen Prozess zur Verfügung stehen.
  • Secure Boot prüft das Vertrauen in Startkomponenten; Measured Boot zeichnet auf, was geladen wurde.
  • Überwachungsprotokolle unterstützen Erkennung und Rekonstruktion. Schütze sie daher vor dem Löschen.
2

Authentifiziere Benutzer und weise Prozessen eine Identität zu

Ein Benutzername wird für den Kernel erst nutzbar, wenn er mit vertrauenswürdigen Anmeldeinformationen eines Prozesses verbunden ist. Verfolge eine Anmeldung bis zur laufenden Shell, einschließlich des sorgfältigen Umgangs mit Hilfsprogrammen mit erhöhten Rechten. Untersuche dann, wie Passwort-Hashes mit Salt Angriffe auf gestohlene Prüfwerte erschweren und wie Schlüssel, zeitbasierte Codes und Biometrie den Identitätsnachweis verändern, bevor gewöhnliche Berechtigungsprüfungen beginnen.

2.1 Weise Prozessen Identitäten zu

Eine erfolgreiche Anmeldung verbindet die Identität einer Person mit Anmeldeinformationen eines Prozesses, die der Kernel verwaltet. Authentifizierung prüft die behauptete Identität; Autorisierung entscheidet, was diese Identität tun darf. Ein Sicherheitssubjekt kann eine Person oder ein Dienstkonto sein; Prozesse handeln in seinem Auftrag.

Übertrage Identität in laufende Programme

Unix-artige Systeme identifizieren Benutzer anhand numerischer UIDs und Gruppen anhand von GIDs. /etc/passwd ordnet Namen UIDs, Home-Verzeichnissen und Shells zu. Der Kernel vergleicht die Nummern: Zwei Kontonamen mit einer UID sind für Zugriffsprüfungen eine Identität. UID 0 ist root und umgeht die meisten gewöhnlichen Berechtigungsprüfungen.

Windows nutzt Sicherheitskennungen (SIDs) für Benutzer und Gruppen. Das Zugriffstoken eines Prozesses hält seine Benutzer-SID, Gruppen-SIDs und Privilegien fest. Auf beiden Plattformen liefern die Anmeldeinformationen des laufenden Programms die Identität für spätere Entscheidungen.

Eine typische Passwortanmeldung unter Linux verläuft so:

  1. Ein privilegierter Anmeldedienst wie login, sshd oder ein Displaymanager erhält die Anmeldeinformationen.
  2. PAM prüft sie über konfigurierte Authentifizierungsmodule.
  3. Der Dienst setzt die ergänzenden Gruppen und die GID des Benutzers und ändert dann die UID, um root aufzugeben.
  4. Er startet die Shell. Kindprozesse erben diese Anmeldeinformationen über fork() und behalten sie normalerweise über execve() hinweg.

Die Reihenfolge ist wichtig. Gibt der Prozess root auf, bevor er Gruppen setzt, kann er möglicherweise seine geerbte privilegierte Gruppenliste nicht mehr ersetzen. Auch das Ändern der Gruppenzugehörigkeit eines Kontos schreibt die Anmeldeinformationen bereits laufender Prozesse nicht um; eine neue Anmeldesitzung erhält die neue Liste.

Verstehe einen kontrollierten Privilegwechsel

Ein Prozess hat eine reale UID, die normalerweise angibt, wer ihn gestartet hat, eine effektive UID, die für die meisten Zugriffsprüfungen verwendet wird, und eine gespeicherte Set-User-ID, die nach einer vorübergehenden Herabsetzung einen kontrollierten Wechsel zurück ermöglicht. Bei gewöhnlichen Programmen sind alle drei gleich.

Das root gehörende /usr/bin/passwd veranschaulicht Setuid. Sein Modus 4755, dargestellt als -rwsr-xr-x, macht root zur effektiven UID, wenn ein gewöhnlicher Benutzer es ausführt. Hat alice UID 1000, bleibt ihre reale UID 1000, während die effektive UID zu 0 wird. Das Programm kann /etc/shadow aktualisieren und nutzt die reale Identität des Aufrufers, um einzuschränken, wessen Passwort geändert werden darf. Eine ausführbare Setgid-Datei ändert entsprechend die effektive Gruppe.

Dieses kleine vertrauenswürdige Programm besitzt gefährliche Befugnisse. Ein Fehler kann Root-Rechte offenlegen, daher halten Systeme die Zahl der Setuid-Programme klein und geben Privilegien früh ab. Für einen Dienst, der nur einen Port mit niedriger Nummer benötigt, gewährt CAP_NET_BIND_SERVICE ein enger begrenztes Linux-Privileg als volle Root-Rechte.

Administriere, ohne eine Identität zu teilen

sudo authentifiziert den aufrufenden Benutzer, prüft, welche Befehle dieser als welche Zielidentität ausführen darf, und protokolliert die Nutzung. Die Regeln stehen gewöhnlich in /etc/sudoers. Individuelle Identitäten erhalten die persönliche Verantwortlichkeit, die beim Teilen eines Root-Passworts verloren geht. Unter Windows startet UAC die Programme eines Administrators normalerweise mit einem gefilterten Token und fragt für eine Rechteerhöhung um Zustimmung.

Alltägliche Anwendungen sollten mit gewöhnlichen Rechten laufen, und Dienste sollten eigene Konten wie www-data haben. Ein übernommener Dokumentbetrachter erbt dann diese eingeschränkten Anmeldeinformationen statt der vollen Befugnisse eines Administrators.

Wichtige Erkenntnisse

  • Authentifizierung stellt die Identität fest; Autorisierung prüft Rechte.
  • Unix prüft numerische UIDs und GIDs; Windows nutzt SIDs und Token.
  • Setze Gruppen, bevor du das Privileg zu ihrer Änderung dauerhaft abgibst.
  • Die effektive UID dient den meisten Unix-Zugriffsprüfungen.
  • Setuid-Hilfsprogramme brauchen sorgfältige Prüfungen, weil sie erhöhte Befugnisse besitzen.
  • Bestehende Prozesse behalten nach einer Kontoänderung ihre alte Gruppenliste.

2.2 Speichere und prüfe Passwörter sicher

Ein Passwortprüfsystem muss ein korrektes Passwort erkennen, ohne eine wiederherstellbare Kopie zu speichern. Es speichert einen Passwort-Hash mit den Informationen, die zur Wiederholung der Prüfung nötig sind. Bei der Anmeldung wird der Hash aus dem eingegebenen Passwort erneut berechnet und das Ergebnis verglichen; der gespeicherte Hash wird nie entschlüsselt.

Schütze den gespeicherten Prüfwert

Unter Linux enthält /etc/shadow geschützte Passwort-Hashes. Die weithin lesbare Datei /etc/passwd enthält Kontoinformationen und ein x anstelle des Passworts. Ein Shadow-Passwortfeld hält eine Algorithmuskennung, Kostenparameter, einen Salt und den resultierenden Hash fest. $y$ bezeichnet yescrypt, das standardmäßig in Debian 11, Ubuntu 22.04, Fedora 35 und späteren Versionen verwendet wird; $6$ bezeichnet SHA-512-crypt.

Eine gestohlene Hashdatei ermöglicht einen Offlineangriff. Der Angreifer hasht Rateversuche auf separater Hardware ohne die Verzögerungen des Anmeldedienstes. Ein Brute-Force-Angriff zählt Zeichenfolgen auf; ein Wörterbuchangriff beginnt mit wahrscheinlichen Wörtern, geleakten Passwörtern und Varianten wie „Password1!“.

Bei genau acht Kleinbuchstaben sind 268=208.827.064.576 Zeichenfolgen möglich. Bei 1010 Rateversuchen pro Sekunde dauert das vollständige Durchsuchen etwa 21 Sekunden. Bei 104 Rateversuchen pro Sekunde dauert es etwa 2,09×107 Sekunden, ungefähr 242 Tage. Dies sind Zeiten für eine vollständige Suche, keine Garantien für ein einzelnes Passwort. Zwölf Kleinbuchstaben ergeben etwa 9,5×1016 Zeichenfolgen, selbst bei der schnelleren Rate ungefähr 110 Tage.

Erhöhe den Angriffsaufwand für jedes Konto

Ein Salt ist ein neuer Zufallswert, der neben jedem Passwort-Hash gespeichert wird. Er sorgt dafür, dass gleiche Passwörter unterschiedliche Hashes ergeben, und macht wiederverwendbare vorberechnete Tabellen unwirksam. Der Salt ist öffentlich; seine Aufgabe ist es, getrennten Aufwand für verschiedene Konten zu erzwingen.

Betrachte 1.000 Konten und eine Liste mit 106 Rateversuchen, geprüft mit 104 Hashes pro Sekunde. Ohne Salts dauert die einmalige Berechnung der Liste 100 Sekunden und kann für alle Konten genutzt werden. Eigene Salts erfordern 109 Berechnungen, etwa 105 Sekunden oder 27,8 Stunden. Ein häufiges Passwort kann dennoch nahe am Anfang der Liste gefunden werden.

Passwort-Hashing-Verfahren wie bcrypt, scrypt, yescrypt, Argon2 und PBKDF2 haben einen einstellbaren Rechenaufwand. Scrypt, yescrypt und Argon2 verursachen außerdem Speicheraufwand. Bei einer Anmeldung ist ein Bruchteil einer Sekunde hinnehmbar; eine große Ratekampagne wiederholt diesen Aufwand Millionen Mal. Einer einzelnen schnellen SHA-256-Berechnung fehlt dieser gezielte Aufwand.

Richte die Anmelderegeln auf Rateangriffe aus

NIST SP 800-63B-4 (2025) verlangt Salts von mindestens 32 Bit und einen Passwort-Hashing-Kostenfaktor, der so hoch wie praktisch möglich ist. Die Passwortrichtlinie verlangt mindestens 15 Zeichen bei reiner Passwortauthentifizierung oder mindestens acht, wenn das Passwort Teil einer MFA ist, und empfiehlt, mindestens 64 Zeichen zuzulassen.

Sie lehnt vorgeschriebene Mischungen wie eine Ziffer und ein Sonderzeichen sowie routinemäßig erzwungene Passwortänderungen ab. Sie verlangt, häufige oder kompromittierte Passwörter zu sperren, Online-Rateversuche zu begrenzen und bei erkennbarer Kompromittierung eine Änderung zu erzwingen. Online-Ratenbegrenzungen schützen den laufenden Dienst; langsames Hashing mit Salt schützt gestohlene Prüfwerte. Ein längeres Passwort, das vorhersehbar aus einer gängigen Liste gewählt wird, kann weiterhin schwach sein.

Wichtige Erkenntnisse

  • Bei der Anmeldung wird ein Passwort-Hash neu berechnet; ein Passwort wird nicht entschlüsselt.
  • Offline-Rateversuche umgehen die Ratenbegrenzungen des laufenden Anmeldedienstes.
  • Ein eigener öffentlicher Salt verhindert, dass Hashing-Aufwand für mehrere Konten wiederverwendet wird.
  • Ein einstellbarer Rechenaufwand macht jeden Rateversuch aufwendig.
  • Passwortlänge und Sperrlisten helfen mehr als vorhersehbare Zusammensetzungsregeln.

2.3 Authentifiziere dich mit Besitzmerkmalen und biometrischen Merkmalen

Passwörter beweisen Wissen. Andere Authentifikatoren belegen den Besitz eines Gegenstands oder ein körperliches Merkmal. Das Betriebssystem ordnet die authentifizierte Identität schließlich Prozessen zu, aber der Weg zu dieser Identität beeinflusst, wie leicht ein Angreifer den Benutzer nachahmen kann.

Kombiniere unterschiedliche Faktorarten

Die drei Faktorarten sind etwas, das du weißt, etwa ein Passwort oder eine PIN; etwas, das du besitzt, etwa ein Telefon, eine Smartcard oder einen Sicherheitsschlüssel; und etwas, das du bist, etwa ein Fingerabdruck. Mehrfaktorauthentifizierung (MFA) kombiniert unterschiedliche Arten. Ein Passwort und eine Sicherheitsfrage wiederholen den Wissensfaktor.

Zeitbasierte Einmalpasswörter (TOTP) nutzen ein gemeinsames Geheimnis und einen Zeitschritt, gewöhnlich 30 Sekunden, um auf einem Authentifikator und einem Server übereinstimmende Codes zu erzeugen. RFC 6238 definiert das Verfahren. Ein Code verfällt schnell, aber eine gefälschte Anmeldeseite kann einen frischen Code vor seinem Ablauf weiterleiten. App-Codes vermeiden SIM-Swapping; SMS-Codes hängen von der Kontrolle über die Telefonnummer ab und können bei deren Übernahme umgeleitet werden.

Beweise den Besitz, ohne den Schlüssel zu senden

Ein Public-Key-Authentifikator signiert eine neue Herausforderung mit einem privaten Schlüssel. Der Server prüft sie mit einem gespeicherten öffentlichen Schlüssel, der selbst nicht zum Signieren einer Anmeldung wiederverwendet werden kann. FIDO2-Sicherheitsschlüssel und Passkeys binden die Authentifizierung außerdem an die Identität der Website, sodass eine Antwort für eine gefälschte Seite nicht bei der echten authentifizieren kann. Auch ein gewöhnlicher SSH-Schlüssel beweist Besitz; man sollte aber nicht annehmen, dass er denselben Mechanismus zur Bindung an eine Website hat.

Die Speicherung verändert das Risiko. Gerätegebundene Schlüssel in einem Hardware-Sicherheitsschlüssel, TPM oder einer sicheren Enklave signieren innerhalb der Hardware, ohne den privaten Schlüssel preiszugeben. Synchronisierte Passkeys kopieren verschlüsseltes Schlüsselmaterial über ein Plattformkonto zwischen Geräten. Das erleichtert die Wiederherstellung, bezieht aber dieses Konto in die Vertrauensgrenze ein. Ein gewöhnlicher privater SSH-Schlüssel ist eine Datei, die durch Berechtigungen und optional eine Passphrase geschützt ist.

Interpretiere biometrische Fehler

Ein biometrisches System vergleicht gemessene Merkmale mit einem gespeicherten Referenzmuster. Es akzeptiert, wenn ein Ähnlichkeitswert einen Schwellenwert erreicht; ein jedes Mal identisches Bild ist nicht nötig.

RateBezugsgröße im NennerGezählter Fehler
Falschakzeptanzrate (FAR)Versuche UnberechtigterAkzeptierte Unberechtigte
Falschrückweisungsrate (FRR)Versuche BerechtigterAbgelehnte Berechtigte

Zwei akzeptierte Unberechtigte bei 10.000 Versuchen ergeben eine FAR von 0,02 %. Dreißig Ablehnungen bei 1.000 Versuchen Berechtigter ergeben eine FRR von 3 %. Ein höherer Ähnlichkeitsschwellenwert senkt die FAR und erhöht die FRR. Eine strengere Übereinstimmung verringert erfolgreiche Identitätsvortäuschungen, macht aber erneute Versuche Berechtigter häufiger nötig.

Ein bekannt gewordenes biometrisches Merkmal lässt sich nicht wie ein Passwort ändern, und Sensoren brauchen Schutz gegen Fotos oder kopierte Fingerabdrücke. Ein zweckmäßiges Konzept nutzt Biometrie lokal, um einen geschützten Schlüssel zu entsperren, und sendet nur eine Signatur an den Server.

Authentifiziere auch Prozesse

Bei einer lokalen Unix-Domain-Verbindung bezieht SO_PEERCRED unter Linux die Anmeldeinformationen der Gegenstelle vom Kernel, statt einem vom Client gesendeten Namen zu vertrauen. Zwischen Rechnern nutzen Dienste Schlüssel, Zertifikate oder Token, die unter dem Dienstkonto mit eingeschränktem Zugriff gespeichert sind. Nach der Anmeldung nutzen gewöhnliche Zugriffsprüfungen des Betriebssystems die UID oder das Zugriffstoken; sie fragen nicht, ob der Benutzer ein Passwort eingegeben oder einen Schlüssel berührt hat.

Wichtige Erkenntnisse

  • MFA kombiniert unterschiedliche Faktorarten, nicht nur zwei Fragen.
  • TOTP-Codes können weitergeleitet werden, solange sie gültig sind.
  • Die Public-Key-Anmeldung beweist Besitz, ohne den privaten Schlüssel zu senden.
  • FIDO2 bindet die Authentifizierung an die vorgesehene Website.
  • FAR und FRR beziehen sich auf unterschiedliche Gruppen von Versuchen.
  • Ein strengerer biometrischer Schwellenwert führt zu weniger akzeptierten Unberechtigten und mehr abgelehnten Berechtigten.
  • Anmeldeinformationen einer lokalen Gegenstelle sollten vom Kernel stammen.
3

Kontrolliere den Zugriff auf Dateien und andere Ressourcen

Auch für eine authentifizierte Identität muss über jede angeforderte Ressource entschieden werden. Stelle Rechte in einer Zugriffsmatrix dar und vergleiche dann Listen an Objekten mit Token im Besitz von Prozessen. Arbeite Datei- und Verzeichnisberechtigungen durch, bevor du systembestimmte Regeln und Tätigkeitsrollen hinzunimmst. Dieselbe Anfrage kann ein geöffnetes Handle, gewöhnliche Modusbits und eine zentral durchgesetzte Grenze für einen Dienst betreffen.

3.1 Vergleiche Zugriffskontrolllisten und Capabilities

Eine Zugriffsentscheidung hat drei Teile: Ein Subjekt bittet darum, eine Operation auf einem Objekt auszuführen. Das Subjekt ist gewöhnlich ein Prozess, der für ein Sicherheitssubjekt handelt; zu den Objekten gehören Dateien, Geräte und andere Prozesse. Eine Zugriffsmatrix stellt die Rechte in Zellen dar, mit Subjekten als Zeilen und Objekten als Spalten.

Speichere dieselben Rechte auf zwei Arten

Angenommen, alice darf report.txt lesen und schreiben, bob darf die Datei nur lesen, und der Sicherungsdienst darf sowohl report.txt als auch payroll.db lesen. Bob darf payroll.db außerdem lesen und schreiben. Alice und bob dürfen den Drucker nutzen; der Sicherungsdienst darf es nicht. Die meisten Zellen in der viel größeren Matrix eines realen Systems sind leer.

Eine Zugriffskontrollliste (ACL) speichert eine Spalte bei ihrem Objekt. Die Liste von report.txt nennt alice, bob und backup mit ihren jeweiligen Rechten. Eine Capability-Liste speichert eine Zeile beim Subjekt. Bob besitzt Token zum Lesen des Berichts, zum Lesen und Schreiben der Gehaltsdaten und zum Nutzen des Druckers.

FrageACLCapability-Liste
Wer darf dieses Objekt nutzen?Seine Liste prüfenAlle Besitzer finden
Was darf dieses Subjekt nutzen?Viele Objekte prüfenSeine Token prüfen
Wie werden begrenzte Rechte delegiert?Einträge hinzufügen oder ändernAusgewählte Token ohne zusätzliche Rechte weitergeben
Was erschwert den Widerruf?Bereits gewährte Handles können bestehen bleibenKopien von Token können sich verbreitet haben

Eine Capability bezeichnet sowohl ein Objekt als auch erlaubte Operationen und kann von ihrem Besitzer weder gefälscht noch erweitert werden. Autorisiertes Kopieren und Delegieren sind möglich. Der Kernel kann das eigentliche Token halten, während Benutzercode einen Index besitzt; ein anderer Ansatz schützt ein Token kryptografisch.

Verfolge einen Deskriptor nach dem Öffnen

Unix kombiniert beide Ansätze. open() prüft den Aufrufer anhand der Dateiberechtigungen und gibt dann einen Dateideskriptor zurück, der den gewährten Zugriff festhält. Spätere Lese- und Schreibzugriffe prüfen dieses geöffnete Handle. Ein Kindprozess kann es über fork() erben, oder ein Prozess kann es über einen Unix-Domain-Socket empfangen.

Alice öffnet app.log zum Schreiben. Der Eigentümer ändert den Modus auf 444. Über den bereits geöffneten Deskriptor kann alice weiterhin schreiben; ein neuer Versuch, die Datei zum Schreiben zu öffnen, trifft auf den neuen Modus. Eine Aktualisierung der ACL für zukünftige Öffnungen widerruft nicht jede bereits ausgegebene Capability. Windows-Handles folgen demselben allgemeinen Muster.

Capsicum von FreeBSD macht dies für die Einschränkung von Prozessen nutzbar. Nach cap_enter() kann ein Prozess keinen beliebigen absoluten Pfad öffnen. Er kann über bestehende Deskriptoren arbeiten, Deskriptoren empfangen und openat() unterhalb eines Verzeichnisdeskriptors nutzen, den er besitzt. Ein Elternprozess kann einem Worker daher genau die Dateien geben, die er benötigt. Capability-basierte Kernel wie seL4 und Fuchsia erweitern die Idee auf Kernelobjekte allgemein.

Unterscheide die andere Bedeutung von Capability unter Linux

Linux-Capabilities teilen die Privilegien von root in Kategorien auf. CAP_NET_BIND_SERVICE erlaubt das Binden von Ports mit niedrigen Nummern; CAP_DAC_OVERRIDE umgeht gewöhnliche Dateizugriffsprüfungen. Diese Privilegien bezeichnen kein bestimmtes einzelnes Objekt und unterscheiden sich daher von einer Capability im Sinne der Zugriffsmatrix. Ein einzelnes Linux-Privileg kann eine Klasse von Operationen an vielen Objekten erlauben.

Wichtige Erkenntnisse

  • ACLs ordnen Rechte nach Objekt; Capability-Listen ordnen sie nach Subjekt.
  • Eine Capability kann von ihrem Besitzer weder gefälscht noch erweitert werden.
  • Deskriptoren bewahren den Zugriff, der beim Öffnen eines Objekts gewährt wurde.
  • Eine Änderung des Dateimodus widerruft normalerweise keine bestehenden Deskriptoren.
  • Linux-Capabilities teilen Root-Privilegien auf und bezeichnen keine einzelnen Objekte.

3.2 Lies und setze Berechtigungen unter Unix und Windows

Unix-Berechtigungen ordnen dem Eigentümer, der Eigentümergruppe und allen anderen Rechte zu. Um über einen Zugriff zu entscheiden, bestimme zuerst die Operation und das betreffende Objekt. Dateiinhalt zu lesen, ein Verzeichnis zu durchqueren und einen Namen zu löschen erfordert unterschiedliche Berechtigungen.

Entschlüssele und wähle die Bits

Lesen ist 4, Schreiben 2 und Ausführen 1. Addiere diese Werte für jede Klasse: 754 bedeutet rwxr-xr--; 640 bedeutet rw-r-----. chmod 640 notes.txt setzt einen Modus, während chmod g+w,o-r notes.txt ausgewählte Bits ändert. Der Eigentümer oder root darf den Modus ändern; ein Eigentümerwechsel benötigt Root-Befugnisse, unter Linux dargestellt durch CAP_CHOWN.

Der Kernel wählt die erste zutreffende Klasse: Eigentümer, wenn die effektive UID übereinstimmt, andernfalls Gruppe, wenn eine Gruppe des Prozesses übereinstimmt, sonst andere. Er kombiniert keine Klassen und versucht keine großzügigere Klasse erneut. Alice gehört eine Datei mit Modus 077: Ihre Eigentümerbits sind leer, daher kann sie die Datei nicht lesen, obwohl Gruppe und andere volle Rechte haben. Als Eigentümerin kann sie den Modus dennoch ändern.

Root umgeht normalerweise Lese- und Schreibprüfungen. Um eine reguläre Datei unter den gewöhnlichen benutzerbestimmten Linux-Prüfungen auszuführen, muss mindestens ein Ausführungsbit gesetzt sein. Systembestimmte Regeln können weitere Einschränkungen auferlegen.

Interpretiere Verzeichnis- und Spezialbits

Die Leseberechtigung für ein Verzeichnis erlaubt das Auflisten von Namen; Ausführen erlaubt das Durchqueren und Nachschlagen; Schreiben zusammen mit Ausführen erlaubt das Erstellen, Löschen und Umbenennen von Einträgen. Das Entfernen eines Namens ändert sein Verzeichnis. Daher kann eine Person mit den nötigen Verzeichnisrechten eine Datei mit Modus 000 löschen.

Setuid fügt dem Modus einer ausführbaren Datei oktal 4000 hinzu und ändert bei der Ausführung die effektive Benutzeridentität. Setgid fügt 2000 hinzu und ändert entsprechend die Gruppe; auf einem Verzeichnis sorgt es dafür, dass neue Dateien die Gruppe des Verzeichnisses erben. Das Sticky-Bit fügt 1000 hinzu. Ein Verzeichnis wie /tmp mit Modus 1777 erlaubt das Löschen oder Umbenennen nur dem Dateieigentümer, dem Verzeichniseigentümer oder einem privilegierten Prozess. Die gewöhnlichen Verzeichnisberechtigungen sind weiterhin erforderlich.

Entferne Bits beim Erstellen von Dateien

Eine umask löscht Bits aus dem von einem Programm angeforderten Modus. Das ist eine Bitoperation, keine oktale Subtraktion. Bei den üblichen Anforderungen von 666 für Dateien und 777 für Verzeichnisse gilt:

UmaskNeue DateiNeues Verzeichnis
022644755
027640750
000666777

Eine umask kann keine Ausführungsrechte hinzufügen, die in der Dateianforderung fehlten.

Lies erweiterte Zugriffslisten

POSIX-ACLs ergänzen benannte Benutzer und Gruppen. setfacl -m u:bob:r report.txt gibt bob einen benannten Leseeintrag; getfacl zeigt ihn an und ls -l markiert die erweiterte ACL mit +. Die ACL-Maske begrenzt benannte Benutzer, benannte Gruppen und die Eigentümergruppe, sodass ein benannter Eintrag mehr Rechte anzeigen kann, als tatsächlich wirksam sind.

Windows NTFS nutzt einen Sicherheitsdeskriptor mit einer Eigentümer-SID und einer DACL aus geordneten erlaubenden oder verweigernden ACEs. Die Auswertung stoppt, wenn ein angefordertes Recht verweigert wird oder alle angeforderten Rechte gewährt wurden; nicht gewährte Rechte werden verweigert. Die bevorzugte Reihenfolge setzt explizite Einträge vor geerbte, innerhalb jeder Gruppe stehen verweigernde vor erlaubenden Einträgen. Eine explizite Erlaubnis kann daher eine Anfrage entscheiden, bevor eine geerbte Verweigerung erreicht wird. Eine separate SACL wählt Zugriffsereignisse für die Überwachungsprotokollierung aus.

Wichtige Erkenntnisse

  • Wähle die zutreffende Unix-Berechtigungsklasse, bevor du ihre Bits prüfst.
  • Verzeichnisberechtigungen steuern Namen; Dateiberechtigungen steuern Dateiinhalte.
  • Das Sticky-Bit ergänzt beim Löschen und Umbenennen eine Eigentümerprüfung.
  • Eine umask löscht angeforderte Bits und fügt niemals welche hinzu.
  • Die POSIX-ACL-Maske begrenzt die Gruppenklasse und benannte Einträge.
  • Die Auswertung einer Windows-DACL hängt von der Reihenfolge der ACEs ab.
  • Eine SACL wählt die Überwachungsprotokollierung aus, statt Zugriff zu gewähren.

3.3 Vergleiche benutzerbestimmte, systembestimmte und rollenbasierte Zugriffskontrolle

Verschiedene Zugriffskontrollmodelle beantworten unterschiedliche Verwaltungsfragen. Wer darf Zugriff gewähren? Kann ein kompromittiertes Programm Daten eines Benutzers weitergeben? Wie kann ein Administrator die Rechte vieler Beschäftigter ändern, ohne jede Datei zu bearbeiten? Ein Betriebssystem kann mehrere Modelle auf dieselbe Anfrage anwenden.

Unterscheide Eigentümerentscheidung und systemweite Regeln

Bei der benutzerbestimmten Zugriffskontrolle (DAC) entscheidet der Eigentümer eines Objekts, wer es nutzen darf. Unix-Modi und ACLs sind vertraute Mechanismen. Die Schwäche besteht darin, dass ein bösartiges Programm, das als der Benutzer handelt, dessen Rechte ausüben kann, einschließlich des Kopierens lesbarer Daten an einen anderen Ort.

Bei der systembestimmten Zugriffskontrolle (MAC) begrenzen systemweite Regeln eines Administrators den Zugriff unabhängig von den Wünschen des Eigentümers. Der Kernel wendet MAC zusätzlich zu DAC an. Beide Prüfungen müssen den Zugriff erlauben, sodass ein großzügiger Dateimodus eine systembestimmte Verweigerung nicht außer Kraft setzt.

Das Bell-LaPadula-Modell schützt die Vertraulichkeit durch geordnete Stufen und zwei Regeln: nicht nach oben lesen und nicht nach unten schreiben. Ein Prozess auf der Stufe geheim darf vertrauliche Daten lesen und an ein streng geheimes Ziel schreiben. Er darf keine streng geheimen Daten lesen oder vertrauliche Daten schreiben. Ein Programm kann Informationen nicht einfach durch Lesen und erneutes Schreiben von geheim nach vertraulich verschieben. Biba kehrt die Lese- und Schreibrichtungen um, um die Integrität zu schützen.

Schränke einen Dienst auch als root ein

SELinux kennzeichnet Dateien mit Typen und führt Prozesse in Domänen aus. Regeln benennen, welche Domäne welche Operationen auf jedem Typ ausführen darf; nicht aufgeführter Zugriff wird verweigert. Ein Webserver in httpd_t darf mit httpd_sys_content_t gekennzeichnete Seiten lesen, während ihm der Zugriff auf user_home_t verwehrt bleibt, selbst wenn gewöhnliche Unix-Modi das Lesen erlauben. ls -Z zeigt Kennzeichnungen an.

Im durchsetzenden Modus blockiert und protokolliert SELinux Verstöße. Im toleranten Modus protokolliert es, ohne zu blockieren. Root in einer eingeschränkten Domäne muss weiterhin die durchgesetzten Regeln erfüllen. UID 0 und uneingeschränkter Zugriff sind daher unterschiedliche Aussagen.

AppArmor schränkt Programme mit Profilen ein, die auf Dateipfaden und erlaubten Capabilities beruhen. Es wird häufig unter Ubuntu und SUSE eingesetzt. SELinux und AppArmor wirken bei Sicherheitsentscheidungen über Schnittstellen der Linux-Sicherheitsmodule (LSM). Android kombiniert App-spezifische UIDs mit SELinux; Apple-Systeme nutzen ebenfalls Sandbox-Profile für Anwendungen.

Weise Tätigkeiten statt einzelner Rechte zu

Bei der rollenbasierten Zugriffskontrolle (RBAC) sind Berechtigungen Rollen zugeordnet, und Benutzer erhalten Rollenzugehörigkeiten. Wechselt eine Person die Tätigkeit, werden Zugehörigkeiten geändert statt vieler unabhängiger Objektberechtigungen.

Angenommen, 50 Beschäftigte benötigen jeweils 20 Berechtigungen. Die direkte Zuweisung braucht 1.000 Benutzer-Berechtigungs-Verknüpfungen. Haben fünf Rollen jeweils 20 Berechtigungen und jeder Beschäftigte eine Rolle, benötigt die Verwaltung 50 Benutzer-Rollen-Verknüpfungen und 100 Rollen-Berechtigungs-Verknüpfungen: insgesamt 150. Die Einsparung entsteht durch gemeinsame Tätigkeitsmuster, nicht durch das Löschen benötigter Berechtigungen.

Als Rollen genutzte Windows-Gruppen und gruppenbasierte sudo-Regeln setzen dieses Muster um. DAC eignet sich für vom Eigentümer verwaltete Dateien, MAC schränkt Dienste nach zentral durchgesetzten Regeln ein und RBAC organisiert administrative Zuweisungen. Ein Dienst kann seine Tätigkeitsrechte über eine Rolle erhalten, während DAC und MAC beide seinen tatsächlichen Dateizugriff prüfen.

Wichtige Erkenntnisse

  • DAC lässt Eigentümer über den Zugriff entscheiden; MAC setzt systemweite Regeln durch.
  • Eine Anfrage muss sowohl DAC als auch durchgesetzte MAC bestehen.
  • Bell-LaPadula blockiert das Lesen nach oben und das Schreiben nach unten.
  • SELinux-Domänen und -Typen können Root-Prozesse einschränken.
  • RBAC verwaltet Berechtigungen über Tätigkeitsrollen.
4

Führe Betriebssysteme in virtuellen Maschinen aus

Mehrere Kernel auf einem Computer auszuführen ergänzt eine Schutzebene unterhalb des Betriebssystems. Ein Hypervisor muss die Sicht jedes Gastbetriebssystems erhalten und zugleich die Kontrolle über physische CPU-Zeit, Speicher und Geräte behalten. Verfolge die Mechanismen von Befehlen, die einen Trap auslösen, bis zur zweistufigen Adressübersetzung und vergleiche dann Geräteschnittstellen und die verbleibenden Wege, auf denen ein Gastbetriebssystem seinen Host beeinflussen könnte.

4.1 Beschreibe virtuelle Maschinen und Hypervisoren

Eine virtuelle Maschine (VM) stellt einem vollständigen Betriebssystem scheinbar einen eigenen Computer zur Verfügung. Dieses Betriebssystem ist das Gastbetriebssystem. Der physische Computer ist der Host, und der Hypervisor, auch Virtual Machine Monitor (VMM), weist den Gastbetriebssystemen reale Prozessorzeit, Speicher und Geräte zu.

Bewahre das Verhalten und behalte die Kontrolle

Das Modell von Popek und Goldberg aus dem Jahr 1974 nennt drei Eigenschaften. Äquivalenz bedeutet, dass Programme sich wie auf einem realen Rechner verhalten, abgesehen von Zeitverhalten und verfügbaren Ressourcen. Ressourcenkontrolle bedeutet, dass der Hypervisor die Kontrolle über die Hardware behält. Effizienz bedeutet, dass die meisten Gastbefehle direkt auf dem Prozessor laufen.

Der Hypervisor plant virtuelle CPUs (vCPUs) auf physischen Kernen ein. Ein Maschinenwechsel sichert den vollständigen Ausführungszustand einer VM einschließlich privilegierter Register und Interrupteinstellungen und stellt dann den einer anderen wieder her. Ein Gastbetriebssystem sieht seinen eigenen Zustand, auch wenn es sich einen physischen Kern mit anderen Gastbetriebssystemen teilt.

KonzeptWo der Hypervisor läuftBeispiele
Typ 1, Bare MetalKontrolliert die Hardware direktESXi, Xen, Hyper-V
Typ 2, gehostetLäuft als Anwendung auf einem HostbetriebssystemVirtualBox, VMware Workstation, Parallels Desktop

KVM macht den Linux-Kernel selbst zum Hypervisor und wird gewöhnlich als Typ 1 eingeordnet. Ein vollständiger Linux-Host bleibt verfügbar, wodurch die einfache Unterscheidung zweier Typen weniger eindeutig wird. Um den Schutz zu beurteilen, bestimme, welche Komponente die CPU- und Speichervirtualisierung tatsächlich kontrolliert.

Nutze die Abstraktion einer Maschine

Serverkonsolidierung führt wenig ausgelastete Systeme zusammen. Zwölf Server, die jeweils durchschnittlich 5 % eines Computers mit acht Kernen nutzen, benötigen zusammen 60 % eines solchen Computers. Dieser Durchschnitt legt nahe, dass eine Konsolidierung möglich ist. Gleichzeitige Spitzen sowie der Bedarf an RAM und Geräten erfordern aber weiterhin Reserven.

Ein Snapshot speichert den Zustand einer VM zur späteren Wiederherstellung. Das bloße Kopieren eines Festplattenimages erfasst weder eine laufende CPU noch ihren Speicher. Livemigration überträgt eine laufende VM auf einen anderen Host, indem sie den Speicher kopiert und die Ausführung mit einer kurzen Pause umschaltet. Diese Vorgänge sind möglich, weil der Maschinenzustand des Gastbetriebssystems als Daten dargestellt wird, die der Hypervisor verwaltet.

VMs unterstützen auch das Testen alter Systeme, die Trennung miteinander unverträglicher Software und das Ausführen unterschiedlicher Betriebssysteme auf kompatibler Hardware. In VMs kann ein Windows-Gastbetriebssystem neben einem Linux-Gastbetriebssystem laufen, jeweils mit eigenem Kernel. Cloud-Serverinstanzen nutzen häufig diese Grenze.

Unterscheide Virtualisierung von vollständiger Emulation

Ein Emulator kann einen Befehlssatz für einen anderen Prozessor interpretieren oder übersetzen, etwa ARM-Code auf x86. Hardwarevirtualisierung führt Gastbefehle normalerweise direkt auf einem kompatiblen Prozessor aus und greift bei sensitiven Ereignissen ein. Das erklärt sowohl ihre Geschwindigkeit als auch ihren Bedarf an CPU-Unterstützung.

Getrennte Gastkernel bilden eine nützliche Grenze: Die Übernahme eines Gastkernels gibt nicht unmittelbar Kontrolle über den Hostkernel. Die Grenze hängt weiterhin von korrektem Hypervisor- und Gerätemodellcode ab. Ein VM-Ausbruch nutzt eine Schwachstelle in dieser Ebene aus, während ein Seitenkanal über gemeinsam genutzte Hardware Daten preisgeben kann, ohne gewöhnlichen Speicherzugriff zu gewähren. Eine VM verringert die Schnittstellen, die einem nicht vertrauenswürdigen Gastbetriebssystem zugänglich sind; gemeinsam genutzte Hardware wird dadurch nicht unfehlbar.

Wichtige Erkenntnisse

  • Eine VM stellt ihrem Gastbetriebssystem eine vollständige Maschine bereit.
  • Äquivalenz, Ressourcenkontrolle und Effizienz beschreiben die Aufgabe eines VMM.
  • Eine vCPU wird auf einer physischen CPU eingeplant.
  • Snapshots und Migration beruhen darauf, den Maschinenzustand zu speichern und zu übertragen.
  • Konsolidierung benötigt Reserven für Bedarfsspitzen, nicht nur einen niedrigen Durchschnitt.
  • VM-Isolation hängt von der Korrektheit des Hypervisors, des Gerätemodells und der Hardware ab.

4.2 Virtualisiere den Prozessor

Ein Gastkernel erwartet, seine Maschine zu kontrollieren. Der Hypervisor muss diesen Eindruck bewahren, ohne die Kontrolle über den realen Computer abzugeben. Die CPU-Virtualisierung lässt gewöhnliche Gastbefehle direkt laufen und fängt Operationen ab, die eine Änderung des Zustands der virtuellen Maschine erfordern.

Wende Trap-and-Emulate auf den virtuellen Zustand an

Beim klassischen Trap-and-Emulate werden dem Gastkernel Privilegien entzogen. Sein Versuch, ein Seitentabellenregister zu laden oder eine Trap-Tabelle einzurichten, löst einen Trap zum Hypervisor aus. Der Hypervisor aktualisiert das virtuelle Register oder die virtuelle Tabelle des Gastbetriebssystems und setzt die Ausführung fort. Er lässt das Gastbetriebssystem nicht die realen Kontrollstrukturen des Hypervisors ersetzen.

Ein Systemaufruf des Gastbetriebssystems kann bei diesem Konzept mehrere Übergänge erfordern. Die Gastanwendung löst einen Trap in die reale Behandlungsroutine des Hypervisors aus. Der Hypervisor überträgt die Ausführung mit verringerten Privilegien an die aufgezeichnete Behandlungsroutine des Gastkernels. Bei der Rückkehr des Gastkernels löst dieser privilegierte Rücksprung erneut einen Trap aus; der Hypervisor führt die tatsächliche Rückkehr zur Gastanwendung zu Ende.

Die Bedingung von Popek und Goldberg für dieses Verfahren lautet, dass jeder sensitive Befehl privilegiert sein muss. Sensitiv bedeutet, dass er die Maschinenkonfiguration ändert oder sich abhängig von der Privilegstufe anders verhält. Privilegiert bedeutet, dass er außerhalb des am stärksten privilegierten Modus einen Trap auslöst. Stillschweigende Unterschiede lassen sich nicht emulieren, wenn der Hypervisor nie von ihnen erfährt.

Verstehe das Hindernis beim klassischen x86

Die Analyse von Robin und Irvine aus dem Jahr 2000 identifizierte 17 sensitive, nicht privilegierte x86-Befehle. Beispielsweise kann POPF mit ausreichenden Privilegien das Flag zur Interruptfreigabe wiederherstellen, lässt es bei verringerten Privilegien aber stillschweigend unverändert. Ein Gastbetriebssystem mit verringerten Privilegien kann glauben, es habe Interrupts abgeschaltet, obwohl kein Trap den Hypervisor veranlasst hat, seinen virtuellen Interruptzustand zu aktualisieren.

Drei Ansätze lösen dieses Problem:

AnsatzWie er die Operation abfängtÄnderung am Gastbetriebssystem
BinärübersetzungSchreibt problematische Befehle des Gastkernels vor der Ausführung um und speichert den übersetzten Code zwischenKeine Änderung am Quellcode
ParavirtualisierungErsetzt privilegierte Operationen durch ausdrückliche HypercallsAngepasster Gastkernel
HardwareunterstützungStellt einen getrennten Gastbetrieb und kontrollierte VM-Exits bereitEin unverändertes Gastbetriebssystem kann laufen

VMware nutzte 1999 Binärübersetzung; Xen nutzte 2003 Paravirtualisierung. Intel VT-x kam 2005 und AMD-V 2006. Gewöhnliche Gastanwendungen können weiterhin direkt laufen, wenn Kernelcode Übersetzung oder Hypercalls benötigt.

Trenne Ringnummer und Virtualisierungsmodus

Mit Intel VT-x läuft der Hypervisor im VMX-Root-Betrieb und ein Gastbetriebssystem im Non-Root-Betrieb. Der Gastkernel kann dort Ring 0 nutzen. Ring 0 in einem Gastbetriebssystem bedeutet keine Kontrolle über den physischen Host.

Konfigurierte Ereignisse verursachen einen VM-Exit, der den vCPU-Zustand in einer Kontrollstruktur wie der VMCS sichert. Der Hypervisor behandelt das Ereignis und setzt die Ausführung über einen VM-Entry fort. Viele Systemaufrufe können vollständig innerhalb des Gastbetriebssystems bleiben. ARM nutzt EL2 für den Hypervisor; RISC-V bietet eine Hypervisor-Erweiterung.

Führt ein Gastbetriebssystem HLT aus und ist dieses Ereignis für einen VM-Exit konfiguriert, markiert der Hypervisor seine vCPU als wartend und plant andere Arbeit ein, bis ein virtueller Interrupt eintrifft. Der physische Kern muss nicht untätig bleiben. VM-Exits und VM-Entrys kosten weiterhin Zeit, typischerweise Hunderte bis Tausende Takte. Daher bleiben Bündelung und paravirtuelle Schnittstellen wertvoll.

Wichtige Erkenntnisse

  • Trap-and-Emulate wendet sensitive Operationen auf den Zustand der virtuellen Maschine an.
  • Klassisches Trap-and-Emulate setzt voraus, dass sensitive Befehle einen Trap auslösen.
  • Binärübersetzung schreibt Code um; Paravirtualisierung ändert die Schnittstelle des Gastbetriebssystems.
  • Ring 0 des Gastbetriebssystems unter VT-x bleibt vom VMX-Root-Betrieb getrennt.
  • VM-Exits sind kontrollierte Ereignisse mit tatsächlichem Leistungsaufwand.

4.3 Virtualisiere den Speicher

Eine Gastanwendung nutzt eine virtuelle Gastadresse. Ihr Kernel übersetzt diese in eine physische Gastadresse, die der Sicht des Gastbetriebssystems auf den RAM entspricht. Der Hypervisor bildet diese Adresse dann auf eine physische Hostadresse oder Maschinenadresse ab. Jedes Gastbetriebssystem kann annehmen, sein RAM beginne bei null, während es unterschiedliche reale Seitenrahmen nutzt.

Behalte den Seitenoffset bei

Verwende 4-KiB-Seiten. Das Gastbetriebssystem bildet die virtuelle Seite 2 auf Gastseitenrahmen 7 ab; der Hypervisor bildet Gastseitenrahmen 7 auf Maschinenseitenrahmen 42 ab. Für die Adresse 0x2ABC gilt:

  1. Teile sie in Seite 2 und Offset 0xABC.
  2. Ersetze Seite 2 durch Gastseitenrahmen 7. Das ergibt 0x7ABC.
  3. Ersetze Gastseitenrahmen 7 durch Maschinenseitenrahmen 42, hexadezimal 0x2A.
  4. Behalte den Offset bei. Das ergibt die Maschinenadresse 0x2AABC, also 174.780 Byte ab Adresse null.

Nur die Seitennummer ändert sich. Die physische Gastadresse als reale RAM-Adresse zu behandeln, würde die Zuweisungs- und Isolationsentscheidung des Hypervisors umgehen.

Vergleiche Software- und Hardwareübersetzung

Schattenseitentabellen bilden virtuelle Gastseiten direkt auf Maschinenseitenrahmen ab. Die reale MMU nutzt diese vom Hypervisor erstellten Tabellen. Der Hypervisor schützt die Seiten mit Gastseitentabellen vor Schreibzugriffen und fängt Änderungen und Wechsel der Gasttabellen ab, damit seine Schattentabellen konsistent bleiben. Häufige Adressraumwechsel des Gastbetriebssystems verursachen daher zusätzliche Traps.

Bei der verschachtelten Seitenverwaltung, Intel EPT oder AMD NPT, erhält die MMU beide Stufen. Die Hardware durchläuft die Gasttabellen und die Tabellen für die Übersetzung von physischen Gastadressen in Maschinenadressen. Aktualisierungen der Gastseitentabellen müssen nicht mehr alle per Software abgefangen werden. Der TLB speichert die kombinierte endgültige Übersetzung zwischen.

Ein Cache-Fehlzugriff kann dennoch aufwendig sein. Bei vier Ebenen auf jeder Stufe benötigt jeder der vier Gasttabelleneinträge vier Zugriffe auf verschachtelte Tabellen plus den Eintrag selbst: 20 Zugriffe. Die Übersetzung der endgültigen physischen Gastadresse der Daten fügt vier weitere hinzu. Das ergibt 24 Übersetzungszugriffe vor dem Datenzugriff. Große Speicherseiten und Seitentabellendurchlauf-Caches verringern diesen Aufwand im ungünstigsten Fall ohne zwischengespeicherte Einträge.

Gewinne Speicher mit begrenztem Wissen über das Gastbetriebssystem zurück

Speicherüberbuchung sagt insgesamt mehr Gastspeicher zu, als der Host besitzt. Vier VMs mit je 16 GiB ergeben 64 GiB auf einem Host mit 48 GiB. Das funktioniert nur, solange ihr aktiver Bedarf gedeckt werden kann; werden alle stark ausgelastet, wird Speicherrückgewinnung oder Auslagerung nötig.

Ein Balloon-Treiber innerhalb eines Gastbetriebssystems reserviert auf Anfrage des Hypervisors Seiten. Das Gastbetriebssystem wählt aus, was es freigibt, während der Hypervisor die Maschinenseitenrahmen hinter den Balloon-Seiten zurückgewinnt. Das verringert die Informationslücke: Das Gastbetriebssystem weiß, welche Daten wichtig sind, während der Hypervisor Zuweisungen sieht, ohne deren volle Bedeutung zu kennen.

Gemeinsame Seitennutzung, etwa Linux KSM, führt identische Seiten zu einer schreibgeschützten Kopie zusammen und trennt sie bei einem Schreibzugriff wieder. Auslagerung durch den Hypervisor bietet eine weitere Ausweichmöglichkeit, kann aber schlecht auswählen, weil ihm das Wissen des Gastbetriebssystems fehlt. Auch ein an die VM durchgereichtes Gerät braucht eine IOMMU, um seine DMA-Adressen zu übersetzen und zu begrenzen.

Das gemeinsame Nutzen identischer Seiten durch verschiedene Kunden hat einen Nachteil für die Vertraulichkeit: Die Dauer von Copy-on-Write kann verraten, ob ein anderes Gastbetriebssystem dieselben Daten besitzt. Cloud-Anbieter deaktivieren diese kundenübergreifende Nutzung daher häufig, obwohl sie Speicher spart.

Wichtige Erkenntnisse

  • Virtuelle Gastadressen, physische Gastadressen und Maschinenadressen sind unterschiedliche Ebenen.
  • Ein Seitenoffset bleibt bei beiden Übersetzungen unverändert.
  • Bei Schattentabellen muss der Hypervisor Änderungen an Gasttabellen verfolgen.
  • Verschachtelte Seitenverwaltung führt beide Stufen in Hardware aus und speichert das kombinierte Ergebnis zwischen.
  • Speicherüberbuchung hängt davon ab, dass der Bedarf unter der verfügbaren Kapazität bleibt.
  • Ballooning nutzt Wissen des Gastbetriebssystems; gemeinsame Seitennutzung kann Informationen über Zeitverhalten preisgeben.

4.4 Virtualisiere Geräte und isoliere virtuelle Maschinen voneinander

Eine VM benötigt neben CPU-Zeit und RAM auch Speichergeräte, Netzwerkverbindungen und andere Geräte. Die Geräteschnittstelle beeinflusst Kompatibilität, Leistung und den Code, den ein nicht vertrauenswürdiges Gastbetriebssystem erreichen kann. Eine schnelle Schnittstelle und eine kleine vertrauenswürdige Schnittstelle sind verwandte Entwurfsentscheidungen, aber nicht dieselbe Eigenschaft.

Wähle, wie das Gastbetriebssystem ein Gerät erreicht
AnsatzSchnittstelle des GastbetriebssystemsWichtigster Zielkonflikt
EmulationEin Modell eines bekannten physischen GerätsVorhandene Treiber funktionieren, aber Registeroperationen erfordern Softwareaufwand
Paravirtuelles GerätEin virtualisierungsbewusster Treiber und gemeinsam genutzte WarteschlangenEffiziente Bündelung, aber das Gastbetriebssystem benötigt den Treiber
DurchreichungEin zugewiesenes physisches Gerät oder eine virtuelle FunktionNahezu nativer Zugriff, aber gemeinsame Nutzung und Migration sind schwieriger

Ein Hilfsprogramm wie QEMU kann eine Intel-e1000-Netzwerkkarte emulieren. Der gewöhnliche Gasttreiber beschreibt vertraute Register; das Hilfsprogramm setzt die Wirkung um. Häufige Registerzugriffe können viele VM-Exits und Softwareoperationen verursachen.

Ein virtio-Treiber tauscht Anfragen dagegen über Warteschlangen im gemeinsam genutzten Speicher aus. Er kann mehrere Operationen einreihen und das Backend einmal benachrichtigen. Vmxnet3 von VMware und VMBus-Geräte von Hyper-V folgen ähnlichen virtualisierungsbewussten Konzepten. Ein paravirtueller Gerätetreiber bedeutet nicht, dass der gesamte Gastkernel paravirtuelle CPU-Operationen nutzen muss.

Bei der Gerätedurchreichung besitzt das Gastbetriebssystem ein physisches Gerät oder eine virtuelle SR-IOV-Funktion. Die IOMMU begrenzt DMA auf den Speicher der VM. Durchreichung verringert die Vermittlung durch Software, aber die Übertragung des Gerätezustands auf einen anderen Host kann die Livemigration erschweren.

Behandle virtuelle Festplatten als verwalteten Zustand

Eine virtuelle Festplatte ist häufig eine Hostdatei, etwa im Format qcow2, VMDK oder VHDX, oder ein Speichervolume. Copy-on-Write-Images lassen viele Gastbetriebssysteme eine Basis teilen und zugleich getrennte Änderungen aufzeichnen. Snapshots können den Festplattenzustand kostengünstig sichern; ein vollständiger Snapshot einer laufenden VM benötigt auch deren Ausführungs- und Speicherzustand. Klonen und Migration beruhen darauf, dass der Hypervisor diese Darstellungen verwalten kann.

Finde die Grenze, die ein Angreifer überwinden muss

Ein kompromittierter Gastkernel kontrolliert bereits diese VM, aber um den Host zu erreichen, ist ein VM-Ausbruch oder ein anderes Versagen der Grenze nötig. Die VENOM-Schwachstelle von 2015 betraf den emulierten Diskettencontroller von QEMU und konnte ermöglichen, Gastcode im QEMU-Prozess des Hosts auszuführen. Läuft die Geräteemulation in einem separaten Prozess innerhalb einer Sandbox, begrenzt das die Befugnisse, die durch einen solchen Fehler zugänglich werden.

Gemeinsam genutzte CPU-Caches, Sprungvorhersagen und Speicherbusse schaffen ebenfalls Seitenkanäle. Spectre und L1TF zeigten, dass sich Isolation nicht allein anhand von Seitenabbildungen beurteilen lässt. Gegenmaßnahmen umfassen Prozessor- und Mikrocode-Updates, das Löschen relevanter Zustände zwischen Gastbetriebssystemen und den Verzicht darauf, verschiedene Kunden gleichzeitig auf den Hardwarethreads eines Kerns einzuplanen.

Confidential Computing, darunter AMD SEV-SNP und Intel TDX, schützt Gastspeicher mit hardwareverwahrten Verschlüsselungsschlüsseln vor dem Hypervisor und unterstützt die Attestierung der gestarteten Umgebung. Es erweitert die Vertrauensgrenze gegenüber einem kompromittierten Host oder Betreiber. Es beseitigt nicht jeden Seitenkanal oder jede Möglichkeit, mit der ein Host den Dienst unterbrechen kann. Die Sicherheit einer VM hängt weiterhin vom Hypervisor, den Geräteschnittstellen, der Hardware und ihrer Konfiguration ab.

Wichtige Erkenntnisse

  • Emulation begünstigt Kompatibilität; paravirtuelle Warteschlangen verringern wiederholte VM-Exits.
  • Gerätedurchreichung erfordert, dass die IOMMU den DMA-Zugriff des Geräts begrenzt.
  • Virtuelle Festplatten und gespeicherter Maschinenzustand ermöglichen Snapshots und Migration.
  • Fehler im Gerätemodell können einen VM-Ausbruch ermöglichen.
  • Gemeinsam genutzte Hardware kann Informationen preisgeben, ohne dass eine gewöhnliche Speicherberechtigungsprüfung fehlschlägt.
  • Confidential Computing schützt Gastspeicher im Rahmen seiner Hardwaregarantien vor dem Host.
5

Isoliere Anwendungen mit Containern

Container schaffen eine isolierte Umgebung um gewöhnliche Prozesse auf dem Kernel des Hosts. Ihre privaten Sichten, Ressourcenbudgets und Befugnisse stammen aus unterschiedlichen Kernelfunktionen, die daher jeweils gesondert betrachtet werden müssen. Lies Namensraumzuordnungen und Kontrollgruppeneinstellungen und verbinde sie dann mit Privilegbegrenzungen. Nutze die Grenze des gemeinsam genutzten Kernels, um zu entscheiden, wo Container, VMs oder eine Kombination für eine Arbeitslast geeignet sind.

5.1 Begrenze mit Namensräumen, was ein Prozess sehen kann

Ein Linux-Container ist eine Gruppe von Prozessen, die den Hostkernel mit eingeschränkten Sichten und Privilegien nutzen. Er hat keinen separaten Kernel und keinen emulierten Computer. Namensräume geben Prozessen eigene Instanzen von Ressourcen, die andernfalls global wären.

Ordne jedem Namensraum seine Sicht zu
NamensraumWas er trennt
MountEingehängte Dateisysteme und den sichtbaren Dateibaum
PIDProzessnummern und die Sichtbarkeit von Prozessen
NetzwerkSchnittstellen, Adressen, Routen, Ports und Firewallregeln
UTSHostname und NIS-Domänenname
IPCSystem-V-IPC-Objekte und POSIX-Nachrichtenwarteschlangen
BenutzerBenutzer- und Gruppenkennungszuordnungen und Capabilities mit begrenztem Geltungsbereich
CgroupDen sichtbaren Teil der Cgroup-Hierarchie
ZeitOffsets für monotone Uhren und Uhren seit dem Systemstart

clone() mit Namensraum-Flags erzeugt einen Kindprozess in ausgewählten neuen Namensräumen. unshare() trennt den Namensraumkontext, und setns() tritt über einen Deskriptor, etwa einen aus /proc/1234/ns/net geöffneten, einem bestehenden Namensraum bei. Eine erneute PID-Zuordnung wirkt sich auf spätere Kindprozesse aus, ohne den Aufrufer zu verschieben. Bei Zeitnamensräumen bereitet unshare(CLONE_NEWTIME) ebenfalls einen Namensraum für spätere Kindprozesse vor; setns() kann den Aufrufer in einen bestehenden Zeitnamensraum versetzen. Zeitnamensräume werden mit unshare() erzeugt.

Daher nutzt unshare --pid --fork --mount-proc bash die Option --fork, um die Shell innerhalb des neuen PID-Namensraums zu erzeugen. Diese Shell ist dort PID 1, selbst wenn ihre Host-PID 48213 ist. PID 1 übernimmt verwaiste Prozesse; endet sie, beendet der Kernel die übrigen Prozesse des Namensraums. Prozesse in einem übergeordneten Namensraum können untergeordnete Prozesse sehen, während Prozesse innerhalb eines PID-Namensraums nicht nach außen in übergeordnete PID-Namensräume sehen können.

Trenne Dateien und Netzwerk

Ein Mount-Namensraum gibt eine eigene Einhängeliste. Eine Laufzeitumgebung stellt einen Dateibaum zusammen und macht ihn mit pivot_root zum Wurzelverzeichnis. Ein Container kann /etc und /usr einer anderen Linux-Distribution nutzen und dennoch den Hostkernel aufrufen. chroot allein ändert lediglich den Ausgangspunkt der Pfadauflösung; gegenüber einem privilegierten Prozess ist es keine sichere Grenze.

Ein neuer Netzwerknamensraum hat eine Loopback-Schnittstelle. Eine Laufzeitumgebung kann ihn über ein Veth-Paar verbinden, wobei ein Endpunkt innerhalb liegt und der andere mit einer Host-Bridge verbunden ist. Getrennte Stacks lassen zwei Container beide an Port 80 lauschen, ohne um den Port eines Namensraums zu konkurrieren.

Übersetze Identitäten über einen Benutzernamensraum hinweg

Eine Zeile in /proc/<pid>/uid_map führt die erste interne Kennung, die erste externe Kennung und die Bereichslänge auf. Die Zeile 0 100000 65536 bildet die internen Kennungen 0–65535 auf die Hostkennungen 100000–165535 ab. Die interne UID 1000 wird daher extern auf 101000 abgebildet. Kennungen ohne nutzbare Zuordnung werden normalerweise als Überlauf-UID 65534 angezeigt.

Root innerhalb dieses Namensraums hat Capabilities für Ressourcen, die von ihm verwaltet werden, aber keine hostweiten Befugnisse. Das Laden eines Kernelmoduls oder Ändern der realen Systemuhr benötigt weiterhin Privilegien im ursprünglichen Benutzernamensraum. Eine UID-Zuordnung schützt nicht vor einem privilegierten Laufzeitumgebungs-Socket, der in den Container weitergereicht wird.

Eine private Sicht begrenzt auch nicht den Verbrauch. Ein Prozess mit eigenen PID- und Mount-Namensräumen kann weiterhin CPU und RAM verbrauchen. Cgroups begrenzen Mengen, während Capability-Begrenzungen und Seccomp Operationen einschränken.

Wichtige Erkenntnisse

  • Container nutzen Prozesse auf dem Hostkernel mit privaten Ressourcensichten.
  • Die acht Namensraumtypen trennen unterschiedliche Arten globaler Zustände.
  • Erneute PID-Zuordnung und unshare von Zeitnamensräumen betreffen spätere Kindprozesse; setns kann einem Zeitnamensraum direkt beitreten.
  • PID 1 hat innerhalb ihres Namensraums besondere Aufgaben während des Lebenszyklus.
  • Benutzernamensräume übersetzen Kennungen und begrenzen den Geltungsbereich von Befugnissen.
  • Private Sichten benötigen gesonderte Ressourcen- und Privilegbegrenzungen.

5.2 Begrenze mit Kontrollgruppen den Ressourcenverbrauch eines Prozesses

Eine Kontrollgruppe oder Cgroup fasst Prozesse zusammen, um Ressourcenverbrauch zu erfassen und zu steuern. Namensräume bestimmen ihre Sicht; Cgroups regeln Mengen wie CPU-Zeit, Speicher und die Anzahl der Tasks. Kindprozesse erben die Gruppe ihres Elternprozesses, und die Hierarchie verhindert, dass eine Kindgruppe die Grenzen einer übergeordneten Gruppe umgeht.

Lies die Dateien von cgroup v2

Cgroup v2 nutzt eine einheitliche Hierarchie, normalerweise unter /sys/fs/cgroup. Eine Elterngruppe aktiviert Controller für ihre Kindgruppen über cgroup.subtree_control, zum Beispiel +cpu +memory +pids. Einzelne Dateien in jeder Kindgruppe enthalten Grenzen und Zähler.

Zu den Controllern gehören cpu, cpuset, memory, io, pids, hugetlb und rdma. Sie steuern CPU-Zeit, Platzierung auf CPUs und Speicherknoten, gewöhnlichen Speicher, Block-Ein-/Ausgabe, Taskanzahl, große Speicherseiten und RDMA-Ressourcen. Cgroup-bewusste Leistungsereignisse unterstützen Messungen, und cgroup.freeze pausiert die Ausführung einer Gruppe.

Unterscheide eine CPU-Obergrenze von einem Anteil

cpu.max enthält Kontingent und Periode in Mikrosekunden. 50000 100000 erlaubt 50 ms CPU-Ausführung pro 100 ms, entsprechend der Hälfte einer CPU. 200000 100000 erlaubt zwei CPUs entsprechende Laufzeit, die auf Kerne verteilt sein kann. max 100000 bedeutet keine Kontingentobergrenze. Sobald das Kontingent verbraucht ist, wartet die Gruppe auf die nächste Periode, selbst wenn eine CPU untätig ist.

cpu.weight legt bei Konkurrenz einen relativen Anteil von 1 bis 10.000 fest, mit dem Standardwert 100. Bei gleich platzierten, ausführbaren Gruppen auf vier CPUs teilen die Gewichte 100 und 300 die verfügbare Zeit im Verhältnis 1:3: ungefähr eine CPU und drei CPUs. Wird die höher gewichtete Gruppe untätig, kann die andere alle vier nutzen, sofern keine andere Grenze eingreift. Ein Gewicht ist weder eine Reservierung noch eine feste Obergrenze.

Begrenze die Ausschöpfung von Speicher und Tasks

memory.high erhöht oberhalb seines Schwellenwerts den Druck zur Speicherrückgewinnung und verlangsamt Tasks. memory.max setzt eine feste Grenze. Der Kernel versucht zunächst, Speicher zurückzugewinnen, indem er unter anderem Cache freigibt und verfügbare Auslagerung nutzt. Kann er nicht genug zurückgewinnen, beendet die OOM-Behandlung der Cgroup einen geeigneten Prozess innerhalb der betroffenen Gruppe.

Bei einem Wert von 512M für memory.max beträgt die Grenze 536.870.912 Byte oder 512 MiB. Ein Prozess mit Speicherleck kann Speicherrückgewinnung und schließlich eine OOM-Beendigung erzwingen. Das Opfer wird aber vom Kernel ausgewählt und muss nicht dieser Prozess sein. Die Gruppengrenze beschränkt das Ereignis auf die Gruppe, statt einen unbeteiligten Hostprozess auszuwählen.

pids.max zählt Prozesse und Threads. Bei einer Grenze von 100 schlägt weiteres Erzeugen mit EAGAIN fehl und begrenzt so das Taskwachstum einer Forkbombe. Eine Ein-/Ausgabegrenze wie 8:0 rbps=10485760 in io.max begrenzt Lesezugriffe auf das Blockgerät 8:0 auf 10 MiB/s.

Diese Dateien verbergen weder Hostprozesse noch Dateinamen. Außerdem können /proc/meminfo und Werkzeuge, die diese Datei lesen, den RAM des Hosts statt memory.max melden; die angezeigte Gesamtsumme allein beweist nicht, dass eine Cgroup keine Grenze hat. Ressourcenmessungen müssen auf der Ebene abgelesen werden, die die Grenze durchsetzt.

Wichtige Erkenntnisse

  • Cgroup v2 setzt Ressourcensteuerung über eine einheitliche Hierarchie um.
  • Eine Kindgruppe bleibt durch die Grenzen übergeordneter Gruppen beschränkt.
  • cpu.max ist ein festes Kontingent; cpu.weight ist ein relativer Anteil bei Konkurrenz.
  • memory.high erhöht den Rückgewinnungsdruck; memory.max kann zur lokalen OOM-Beendigung führen.
  • pids.max zählt sowohl Threads als auch Prozesse.
  • Cgroup-Grenzen erzeugen keine privaten Sichten auf Hostressourcen.

5.3 Schränke Container ein und wähle zwischen Containern und virtuellen Maschinen

Eine zweckmäßige Containergrenze kombiniert Sichten, Ressourcensteuerung und eingeschränkte Befugnisse. Ein privater Dateibaum allein verhindert keine gefährlichen Systemaufrufe, und ein CPU-Kontingent verhindert keinen Zugriff auf eine freigegebene Hostdatei. Der Hostkernel setzt jede dieser Kontrollen durch.

Verringere die Befugnisse des Prozesses

Eine Laufzeitumgebung kombiniert Namensräume, Cgroups und ein Dateisystemimage mit Programmen und Bibliotheken. Sie kann die Grenze durch folgende Maßnahmen stärken:

  • Die Arbeitslast ohne Root-Rechte ausführen oder Containerkennungen über einen Benutzernamensraum zuordnen.
  • Linux-Capabilities abgeben, insbesondere weitreichende Befugnisse wie CAP_SYS_ADMIN und CAP_SYS_MODULE.
  • Seccomp anwenden, um unnötige Aufrufe einzuschränken.
  • SELinux- oder AppArmor-Regeln anwenden.
  • Das Wurzeldateisystem schreibschützen, wo dies praktikabel ist.
  • no_new_privs setzen, damit die Ausführung von Setuid-Programmen Privilegien nicht erhöhen kann.

Jede Kontrolle deckt einen anderen Weg ab. Ein schreibgeschütztes Wurzeldateisystem erlaubt weiterhin zulässige Netzwerkoperationen; ein Seccomp-Filter erlaubt weiterhin die Aufrufe auf seiner Liste. Der Entwurf sollte zu den Operationen passen, die die Anwendung tatsächlich benötigt.

Erkenne das Risiko des gemeinsam genutzten Kernels

Alle gewöhnlichen Container teilen sich den Hostkernel. Ein erreichbarer Kernelfehler kann daher den Host und andere Container kompromittieren. In einer VM verschafft die Ausnutzung des Gastkernels Kontrolle über dieses Gastbetriebssystem; um den Host zu erreichen, muss zusätzlich eine Grenze des Hypervisors oder der Geräte versagen.

Root innerhalb eines Containers ist besonders kritisch. Ohne Benutzernamensraum ist es für den Hostkernel UID 0, eingeschränkt durch Capabilities, Filter und systembestimmte Regeln. Der privilegierte Modus oder Zugriff auf das Wurzeldateisystem des Hosts kann diese Einschränkungen aufheben. Auch ein root gehörender Laufzeitumgebungs-Socket ist gefährlich: Sein Client kann die Laufzeitumgebung zu privilegierten Aktionen auffordern. Container-root auf eine unprivilegierte Hostkennung abzubilden macht diesen Socket weder sicher noch beseitigt es Kernelschwachstellen.

Wähle eine Grenze für die Arbeitslast
BedarfGeeignete GrenzeGrund
Häufig bereitgestellte Linux-Dienste eines TeamsEingeschränkte ContainerSchnelle Starts und geringer Verwaltungsaufwand auf einem Kernel
Einander nicht vertrauender KundencodeVMs oder MicroVMsGetrennte Gastkernel verringern das Risiko durch einen gemeinsam genutzten Kernel
Eine reine Windows-Anwendung auf Linux-HostsVMDie Arbeitslast benötigt einen anderen Kernel

Ein Linux-Container benötigt einen Linux-Kernel. Plattformen auf Windows und macOS stellen daher häufig eine Linux-VM unter Linux-Containern bereit. VMs starten ein Betriebssystem und reservieren Speicher für jeden Kernel; Container starten gewöhnliche Prozesse und können Arbeitslasten dichter zusammenfassen.

Erkenne Zwischenformen

gVisor behandelt viele Container-Systemaufrufe in einem Kernel im Benutzeradressraum und verringert so den direkten Kontakt mit dem Hostkernel. Kata Containers gibt jeder Sandbox, häufig einem Kubernetes-Pod, eine schlanke VM; Container in dieser Sandbox teilen sich deren Gastkernel. Firecracker stellt MicroVMs mit einem minimalen Gerätemodell für Plattformen bereit, die Funktionen oder Containerarbeitslasten ausführen, darunter AWS Lambda.

Cloud-Systeme platzieren Container häufig innerhalb von VMs: Eine VM trennt Kunden, während Container die Anwendungen eines Kunden organisieren. Die Gastkernel und der Hostkernel bleiben getrennt. Ein Containerausbruch innerhalb einer VM belegt daher für sich genommen keinen Hypervisor-Ausbruch.

Wichtige Erkenntnisse

  • Containerisolation benötigt Sichten, Ressourcengrenzen und Privilegbegrenzungen.
  • Alle gewöhnlichen Container auf einem Host teilen sich dessen Kernel.
  • Eine Rootless-UID-Zuordnung verringert Befugnisse, kann aber keine Kernelfehler beheben.
  • Der Zugriff auf einen privilegierten Laufzeitumgebungs-Socket kann Kontrolle über den Host gewähren.
  • VMs können einen anderen Kernel mitbringen; Container nutzen den Kernel unter ihnen.
  • gVisor, Kata und Firecracker ergänzen unterschiedliche Grenzen um Arbeitslasten.
  • Container innerhalb von VMs kombinieren eine hohe Anwendungsdichte mit getrennten Gastkerneln.

Schutz, Isolation und virtuelle Maschinen: Beispiele

5 Interaktive Lektionen

1

Verfolge eine Anfrage über die Kernelgrenze

16 Schritte
Verfolge Ausführung, Argumentprüfungen, Speicherberechtigungen und Schutz vor der Ausnutzung von Schwachstellen anhand eines kleinen Dienstes.
  1. 1
    EinführungBeginne mit einer laufenden Anwendung

    Ein Berichtsdienst verbringt die meiste Zeit mit Berechnungen im Benutzermodus. Er benötigt den Kernel nur für geschützte Aufgaben, etwa zum Öffnen einer Datei oder Einrichten einer Speicherabbildung.

    Verfolge, was sich beim Überschreiten dieser Grenze ändert: Die CPU-Privilegstufe ändert sich, aber die Identität des Aufrufers und die Gültigkeit seiner Anfrage müssen weiterhin geprüft werden. Verfolge dann die getrennten Schutzmechanismen für Speicher, Geräte und ausführbaren Code.

  2. 2
    ErklärungFühre gewöhnlichen Code direkt aus

    Die CPU führt Additionen, Ladezugriffe und Sprünge des Dienstes direkt aus. Die Hardware prüft währenddessen Privilegstufe und Speicherberechtigungen; der Kernel genehmigt nicht jeden Befehl per Software.

    Der Versuch, eine Seitentabelle zu ersetzen oder Interrupts abzuschalten, muss einen Trap auslösen. Andernfalls könnte das Programm genau die Beschränkungen entfernen, die es eingrenzen sollen. Diese Kombination heißt eingeschränkte direkte Ausführung.

  3. 3
    HerausforderungEin Dienst stellt keine Anfragen mehr

    Der Dienst bleibt in einer Endlosschleife im Benutzermodus hängen. Er führt keinen weiteren Systemaufruf aus. Kann der Scheduler trotzdem einen anderen bereiten Prozess ausführen lassen?

    ---reveal---

    Ja. Ein Hardwaretimerinterrupt führt unabhängig von der Mitwirkung des Dienstes in den Kernel. Der Scheduler kann einen anderen Prozess auswählen. Das Programmieren des Timers und das Abschalten von Interrupts erfordern Privilegien, sodass der Dienst in der Schleife den Kern nicht dadurch behalten kann, dass er Systemaufrufe vermeidet.

  4. 4
    ErklärungFordere eine geschützte Leistung an

    Um eine Datei zu lesen, legt der Bibliothekswrapper eine Aufrufnummer, einen Deskriptor, eine Pufferadresse und eine Länge in Registern ab und führt dann den architekturspezifischen Eintrittsbefehl für Systemaufrufe aus.

    Der Kernel sichert den Benutzerzustand, wählt die Behandlungsroutine und erhält die Anmeldeinformationen des Aufrufers aus dem aktuellen Prozess. Der Eintritt mit Kernelprivilegien ist erst der Anfang: Die Behandlungsroutine muss weiterhin entscheiden, ob dieser Aufrufer und diese Argumente zulässig sind.

  5. 5
    BeispielPrüfe den gesamten Zielbereich

    Angenommen, der Dienst fordert mit read(fd, buf, 8192) an, Bytes in seinen Puffer zu kopieren. Dass das erste Byte gültig ist, reicht nicht aus: Der Kopiervorgang kann eine Seitengrenze in einen verbotenen Bereich überschreiten.

    Der Kernel muss den gesamten für die Übertragung benötigten Zielbereich prüfen und sicher darauf zugreifen. Geprüfte Linux-Routinen zum Kopieren von und zu Benutzerspeicher behandeln ungültige Benutzeradressen, ohne zuzulassen, dass der angeforderte Kopiervorgang Kernelspeicher überschreibt.

  6. 6
    HerausforderungEine Anfrage nutzt die falsche Zugriffsart

    Der Puffer ist gültig, aber der Dienst versucht write() mit einem Deskriptor, den er mit O_RDONLY geöffnet hat. Was sollte der Kernel prüfen, und muss der Prozess enden?

    ---reveal---

    Er prüft den für den Deskriptor gewährten Zugriff und weist den Schreibzugriff unter Linux mit EBADF zurück. Das ist ein Fehlerergebnis, das das Programm behandeln kann. Der Aufruf ist korrekt in den Kernel eingetreten, aber der Deskriptor enthält das angeforderte Recht nicht.

  7. 7
    KernaussageHalte einen geprüften Pfad an sein Objekt gebunden

    Ein Hilfsprogramm prüft die Berechtigung für einen Pfad und öffnet ihn später mit höheren Privilegien. Zwischen den beiden Operationen kann ein anderer Prozess den Verzeichniseintrag ersetzen. Eine kopierte Pfadzeichenfolge verhindert diesen Austausch nicht.

    Das ist eine TOCTTOU-Wettlaufsituation. Öffne mit den vorgesehenen Anmeldeinformationen und nutze ein Verfahren zum Erlangen des Objekts, das prüft, was tatsächlich geöffnet wird; verwende O_NOFOLLOW, wenn symbolische Links unerwünscht sind.

  8. 8
    ErklärungLass Abbildungen spätere Zugriffe steuern

    Sobald eine Abbildung gewährt ist, nutzen Lade- und Speicherzugriffe die MMU, ohne pro Byte einen Systemaufruf auszuführen. Die MMU prüft die Schreib-, Benutzer-/Supervisor- und Ausführungsberechtigungen der aktiven Seitentabelle.

    Eine schreibgeschützte Benutzerseite schützt ihren Inhalt vor Änderungen, lässt den Prozess ihn aber weiterhin lesen. Um Daten vor diesem Prozess geheim zu halten, muss die Abbildung auch das Lesen verweigern, etwa indem sie fehlt oder ausschließlich Kernelzugriff erlaubt.

  9. 9
    BeispielInterpretiere zwei Schreibfehler auf schreibgeschützten Seiten

    Der Dienst schreibt zuerst auf seine Codeseite und dann auf nach fork() gemeinsam genutzte Daten. Beide Seiten sind schreibgeschützt, sodass beide Schreibzugriffe zunächst einen Seitenfehler auslösen.

    Die Verwaltungsdaten des Kernels unterscheiden die Ergebnisse. Ein unerlaubter Schreibzugriff auf Code führt normalerweise zu SIGSEGV. Ein zulässiger Copy-on-Write-Fehler bei Daten führt zu einer privaten Kopie und einem Neustart des Befehls. Die Hardware meldet den Verstoß; die Verwaltungsdaten des Kernels entscheiden, ob er behoben werden kann.

  10. 10
    HerausforderungEin Gerät überschreitet die Speichergrenze

    Der Dienst wird durch CPU-Seitentabellen begrenzt, aber ein fehlerhaftes Gerät schreibt direkt in nicht zugehörigen RAM. Warum haben diese CPU-Abbildungen es nicht aufgehalten?

    ---reveal---

    DMA durchläuft nicht die MMU der CPU. Das Gerät benötigt eine IOMMU-Abbildung, die seine eigenen Adressen begrenzt. Der Schutz von CPU-Lade- und Speicherzugriffen bildet eine Grenze; die Begrenzung von Geräteübertragungen erfordert die entsprechende Gerätegrenze.

  11. 11
    ErklärungBlockiere die Ausführung eingeschleuster Bytes

    Ein Pufferüberlauf kann eine gespeicherte Rücksprungadresse überschreiben. Die NX-Markierung des Stacks macht eingeschleuste Stackbefehle nicht ausführbar, sodass ein Sprung dorthin einen Fehler auslöst.

    W^X ergänzt die Regel, dass keine Seite gleichzeitig beschreibbar und ausführbar sein darf. Ein Just-in-Time-Compiler muss erzeugten Code schreiben und dann die Berechtigungen vor der Ausführung umstellen. Diese Prüfungen erschweren die Ausnutzung; der ursprüngliche Schreibzugriff außerhalb des Bereichs muss weiterhin behoben werden.

  12. 12
    VerbindungErschwere das Auffinden vorhandenen Codes

    Ein Angreifer kann bereits in ausführbaren Bibliotheken vorhandene Befehle wiederverwenden, statt neue einzuschleusen. ROP verknüpft diese kurzen Gadgets zu einer neuen Berechnung.

    ASLR macht ihre Adressen schwerer vorhersagbar. Die Preisgabe einer bekannten Bibliotheksadresse verrät die Basis dieser Bibliothek und bekannte Offsets, aber keinen unabhängig randomisierten Stack. Randomisierung funktioniert am besten, wenn Fehler die gewählten Adressen nicht preisgeben können.

  13. 13
    HerausforderungBegrenze einen kompromittierten Darstellungsprozess

    Ein Prozess zur Darstellung von Webseiten wurde übernommen. Sein Stack ist als NX markiert und seine Bibliotheksadressen sind dem Angreifer nun bekannt. Eine Seccomp-Regel blockiert weiterhin Aufrufe zum Starten von Programmen. Kann Codewiederverwendung diese Beschränkung einfach entfernen?

    ---reveal---

    Nein. Die Wiederverwendung ausführbarer Befehle entfernt keinen installierten Seccomp-Filter. Der Prozess bleibt auf erlaubte Aufrufe beschränkt. Um ein anderes Programm zu starten, braucht es daher einen weiteren Weg um den Filter oder ein anderes Versagen einer Grenze.

  14. 14
    ErklärungTrenne Startprüfungen von Ereignisaufzeichnungen

    Secure Boot prüft Signaturen, bevor es die Kontrolle an die nächste vertrauenswürdige Startkomponente übergibt. Measured Boot zeichnet Komponenten-Hashes auf, häufig mithilfe eines TPM, sodass eine externe prüfende Stelle beurteilen kann, was geladen wurde.

    Überwachungsprotokollierung dient einem späteren Zweck: Sie zeichnet Ereignisse wie fehlgeschlagene Anmeldungen und Befehle mit erhöhten Rechten auf. Geschützte Kopien außerhalb des Hosts helfen, diese Belege zu erhalten, falls ein Eindringling die Befugnis erhält, lokale Protokolle zu löschen.

  15. 15
    HerausforderungBestimme die fehlende Schutzebene

    Ein Root-Dienst bildet vertrauliche Daten schreibgeschützt in den Adressraum eines nicht vertrauenswürdigen Workers ab und beschränkt dessen Systemaufrufe. Der Worker liest dann die Daten. Welche Entscheidung hat sie offengelegt?

    ---reveal---

    Die für Benutzer lesbare Abbildung hat den Inhalt offengelegt. Schreibschutz verhindert Änderungen, und ein Systemaufruffilter blockiert keine gewöhnlichen Ladezugriffe auf eine erlaubte Seite. Der Kernel muss dem Worker diese Abbildung oder seine Leseberechtigung verweigern, um die Vertraulichkeit zu wahren.

  16. 16
    ZusammenfassungFinde die Prüfung, die die Aktion steuert

    Verfolge bei einem unbekannten Fehler die Operation: CPU-Befehl, Kernelanfrage, Zugriff auf abgebildeten Speicher oder Geräte-DMA. Jede erreicht einen anderen Durchsetzungspunkt.

    Frag dich dann, was der Angreifer bereits kontrolliert. Die Identität root, ausführbare Gadgets und ein gültiger Deskriptor verleihen unterschiedliche Befugnisse. Eine nützliche Diagnose benennt die genau fehlende Prüfung, statt anzunehmen, dass eine erfolgreiche Schutzmaßnahme jeden Weg schützt.

2

Verfolge die Anmeldung bis zu den Anmeldeinformationen eines Prozesses

14 Schritte
Verbinde Passwortprüfung und andere Faktoren mit der Identität, die ein laufendes Programm tatsächlich mit sich führt.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungMache aus einer Anmeldung eine Identität für laufende Prozesse
  2. 2
    ErklärungSetze Gruppen, bevor du root aufgibst
  3. 3
    BeispielVerfolge ein Setuid-Hilfsprogramm für Passwörter
  4. 4
    HerausforderungAktualisiere ein Konto während einer Sitzung
  5. 5
    ErklärungBerechne einen Prüfwert neu, ohne ein Passwort wiederherzustellen
  6. 6
    BeispielMiss den Rateaufwand für ein Konto
  7. 7
    BeispielWiederhole die Arbeit für unterschiedliche Salts
  8. 8
    HerausforderungEine Kontosperre erreicht die gestohlene Datei nicht
  9. 9
    ErklärungUnterscheide einen Code von einer an eine Website gebundenen Signatur
  10. 10
    BeispielWähle vor dem Rechnen den Nenner
  11. 11
    HerausforderungZwei Geheimnisse bleiben eine Faktorart
  12. 12
    VerbindungLass den Kernel eine lokale Gegenstelle identifizieren
  13. 13
    HerausforderungFinde, wo die Stärke der Anmeldung keine Rolle mehr spielt
  14. 14
    ZusammenfassungHalte den Nachweis und die resultierenden Rechte auseinander
3

Arbeite eine Zugriffsentscheidung durch

15 Schritte
Nutze Anmeldeinformationen, Verzeichnisoperationen und Regeln gemeinsam, um ein Zugriffsergebnis zu erklären.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungBenenne die Operation und ihr Objekt
  2. 2
    ErklärungOrdne Rechte nach Objekt oder Subjekt
  3. 3
    BeispielÜbergib einem Worker eine eng begrenzte Berechtigung
  4. 4
    HerausforderungÄndere Berechtigungen nach der Vergabe eines Handles
  5. 5
    ErklärungWähle eine Klasse, bevor du ihre Bits addierst
  6. 6
    BeispielErstelle eine Datei unter einer Maske
  7. 7
    BeispielPrüfe den Zugriff anhand des resultierenden Modus
  8. 8
    HerausforderungEntferne einen Namen, ohne seine Daten zu lesen
  9. 9
    TippLies neben dem ACL-Eintrag auch dessen Begrenzung
  10. 10
    ErklärungErgänze Regeln, die der Eigentümer nicht aufheben kann
  11. 11
    BeispielVerfolge vertrauliche Informationen zwischen Stufen
  12. 12
    HerausforderungErkläre den verweigerten Lesezugriff eines Root-Dienstes
  13. 13
    VerbindungÄndere eine Tätigkeit über Rollen
  14. 14
    HerausforderungVerfolge eine Berechtigung durch mehrere Kontrollen
  15. 15
    ZusammenfassungVerfolge die Entscheidung in einer sinnvollen Reihenfolge
4

Führe ein Gastbetriebssystem aus, ohne den Host aus der Hand zu geben

17 Schritte
Verfolge CPU-Abfangmechanismen, Seitenübersetzung und Gerätebehandlung über die Grenze einer virtuellen Maschine hinweg.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungGib einem Kernel scheinbar einen eigenen Computer
  2. 2
    ErklärungPlane einen virtuellen Prozessor ein
  3. 3
    HerausforderungBeurteile eine Aussage zur Konsolidierung
  4. 4
    ErklärungEmuliere nur den Steuerungszustand des Gastbetriebssystems
  5. 5
    BeispielBehandle einen Befehl, der keinen Trap auslöst
  6. 6
    HerausforderungBehalte Ring 0 des Gastbetriebssystems unter Kontrolle
  7. 7
    ErklärungUnterscheide die drei Adressbezeichnungen
  8. 8
    BeispielWende zuerst die Abbildung des Gastbetriebssystems an
  9. 9
    BeispielWende als Nächstes die Abbildung des Hypervisors an
  10. 10
    HerausforderungÜbersetze ein anderes Byte auf der Seite
  11. 11
    VerbindungWähle, wo die kombinierte Abbildung verwaltet wird
  12. 12
    KernaussageGewinne Speicher mit Hilfe des Gastbetriebssystems zurück
  13. 13
    ErklärungTausche Gerätekompatibilität gegen weniger Übergänge
  14. 14
    HerausforderungVerringere häufige gerätebedingte VM-Exits
  15. 15
    ErklärungSchütze eine Grenze, die über Seitenabbildungen hinausgeht
  16. 16
    HerausforderungBereite eine laufende Maschine für einen anderen Host vor
  17. 17
    ZusammenfassungBehalte an jeder virtuellen Schnittstelle die Kontrolle
5

Erstelle und beurteile eine Containergrenze

16 Schritte
Kombiniere Namensraumsichten, Ressourcenbudgets und Privilegbegrenzungen und wähle dann eine geeignete Isolationsebene.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungTrenne drei Aufgaben innerhalb eines Containers
  2. 2
    ErklärungGib Prozessen private Ressourcensichten
  3. 3
    BeispielStarte den ersten Kindprozess in einem PID-Namensraum
  4. 4
    BeispielBilde eine interne Identität auf den Host ab
  5. 5
    HerausforderungWähle die Sicht, die einen Konflikt löst
  6. 6
    ErklärungLies ein festes CPU-Budget
  7. 7
    BeispielTeile das Budget einer Elterngruppe zwischen Kindgruppen auf
  8. 8
    HerausforderungLass eine konkurrierende Gruppe untätig werden
  9. 9
    ErklärungBegrenze Speicher- und Taskwachstum
  10. 10
    HerausforderungLies die Grenze auf der durchsetzenden Ebene ab
  11. 11
    ErklärungVerringere, was der Prozess anfordern darf
  12. 12
    HerausforderungEine zugeordnete UID erreicht weiterhin einen privilegierten Dienst
  13. 13
    VerbindungWähle, wo ein separater Kernel nötig ist
  14. 14
    ErklärungErkenne zusätzliche Sandbox-Ebenen
  15. 15
    HerausforderungPlatziere nicht vertrauenswürdige Aufträge mit Ressourcengrenzen
  16. 16
    ZusammenfassungOrdne jedem Bedarf seinen Mechanismus zu

Schutz, Isolation und virtuelle Maschinen: Übungsaufgaben

60 Übungsfragen in 6 Sets

Set 1: Verfolge Identitäten und Authentifizierung10 Übungsfragen

Frage 1 von 10

Zwei lokale Kontonamen haben UID 2400. Wie unterscheidet der Unix-Kernel ihre Identität als Dateieigentümer?
  1. Er vergleicht die Schreibweise ihrer Anmeldenamen.
  2. Er gibt jedem beim Start der Shell eine neue UID.
  3. Er vergleicht ihre Passwort-Hashing-Algorithmen.
  4. Er behandelt beide als dieselbe numerische Benutzeridentität.
Antwort zeigenAntwort ausblenden
Antwort: D
Der Kernel prüft numerische UIDs statt Kontonamen als Zeichenfolgen. Beide Namen bezeichnen daher für diese Zugriffsprüfungen denselben Eigentümer. Unterschiedliche Passwortprüfwerte können die Authentifizierung beeinflussen, erzeugen aber keine unterschiedlichen Kernel-Benutzeridentitäten, wenn die in beiden Prozess-Anmeldeinformationen gespeicherte UID gleich ist.

Frage 2 von 10

Ein Anmelde-Hilfsprogramm wechselt dauerhaft von UID 0 zu UID 2400, bevor es seine ergänzenden Gruppen ersetzt. Warum ist diese Reihenfolge unsicher?
  1. Es kann die zum Ersetzen privilegierter Gruppen nötige Befugnis verlieren.
  2. Es ändert alle bestehenden Dateien auf die primäre Gruppe des Benutzers.
  3. Es macht die reale UID des Benutzers zur alten Gruppenkennung.
  4. Es erlaubt dem Benutzer danach, jede beliebige Gruppe zu setzen.
Antwort zeigenAntwort ausblenden
Antwort: A
Das Ändern ergänzender Gruppen erfordert Privilegien. Gibt der Prozess root zuerst dauerhaft auf, kann die spätere Gruppenaktualisierung daher fehlschlagen. Der Prozess kann die alten privilegierten Gruppenmitgliedschaften behalten. Dateieigentum wird durch die Änderung von Prozess-Anmeldeinformationen nicht umgeschrieben; das Problem betrifft die Anmeldeinformationen, die die Shell erbt.

Frage 3 von 10

Nora wird zur Gruppe archive hinzugefügt, während ihr Terminal geöffnet bleibt. Warum kann ein aus diesem Terminal gestarteter Befehl eine Prüfung der Gruppe archive weiterhin nicht bestehen?
  1. Der Dateieigentümer muss zuerst die Gruppe archive umbenennen.
  2. Er erbt die alte Gruppenliste des Terminalprozesses.
  3. Nur die reale UID kann eine ergänzende Gruppe erfassen.
  4. Neue Kindprozesse verwerfen ergänzende Gruppen immer.
Antwort zeigenAntwort ausblenden
Antwort: B
Die Shell behält die für ihre Sitzung gesetzte Gruppenliste, und ein neuer Kindprozess erbt diese Liste. Eine Änderung der Kontodatenbank schreibt die Kernel-Anmeldeinformationen der Shell nicht um. Eine neue Anmeldung setzt normalerweise die aktualisierten Mitgliedschaften; lediglich einen weiteren Befehl aus der alten Shell zu starten tut dies nicht.

Frage 4 von 10

Eine gestohlene Passwortdatenbank enthält neben jedem Hash einen anderen zufälligen Salt. Müssen die Salts geheim sein, damit ihre wichtigste Schutzwirkung funktioniert?
  1. Ja; sie sind die Entschlüsselungsschlüssel für die Passwörter.
  2. Ja; ein öffentlicher Salt macht jeden gespeicherten Hash umkehrbar.
  3. Nein; sie verhindern wiederverwendbaren Hashing-Aufwand auch öffentlich.
  4. Nein; der Salt selbst ersetzt das geheime Passwort des Benutzers.
Antwort zeigenAntwort ausblenden
Antwort: C
Ein Salt wird bewusst zusammen mit dem Prüfwert gespeichert und muss nicht geheim sein. Sein Wert macht die Hashing-Berechnung jedes Kontos unterschiedlich und verhindert wiederverwendbare vorberechnete Tabellen und gemeinsamen Rateaufwand. Er ist kein Verschlüsselungsschlüssel; die Kenntnis des Salts bietet daher keine Operation, die den Hash entschlüsselt.

Frage 5 von 10

Ein Testraum enthält 81.000.000 gleich wahrscheinliche Passwörter. Ein Offlineangreifer prüft 3.000 pro Sekunde. Wie lange dauert es, den Raum vollständig zu durchsuchen?
  1. 13.500 Sekunden.
  2. 27.000 Sekunden.
  3. 243.000 Sekunden.
  4. 270.000 Sekunden.
Antwort zeigenAntwort ausblenden
Antwort: B
Teile 81.000.000 Kandidaten durch 3.000 Prüfungen pro Sekunde. Das ergibt 27.000 Sekunden für eine vollständige Suche. Die Frage verlangt das vollständige Durchsuchen, nicht den durchschnittlichen Haltepunkt bei einem gleichverteilt liegenden richtigen Kandidaten. Das Halbieren des Ergebnisses verwechselt diese beiden Maße für den Rateaufwand.

Frage 6 von 10

Ein Dienst ergänzt pro Konto einen eigenen öffentlichen Salt und eine Online-Kontosperre, behält aber einen einzelnen schnellen Hash bei. Seine Prüfwertdatenbank wird gestohlen. Welcher Schutz fehlt weiterhin?
  1. Ein aufwendiges Passwort-Hashing-Verfahren für jeden Offline-Rateversuch.
  2. Eine zweite Online-Kontosperre für die gestohlene Datenbank.
  3. Eine Verschlüsselung, mit der der Dienst vergessene Passwörter wiederherstellen kann.
  4. Ein gemeinsamer Salt, der in der öffentlichen Kontonamendatei verborgen ist.
Antwort zeigenAntwort ausblenden
Antwort: A
Der Angreifer kann Rateversuche offline prüfen, ohne den gesperrten Dienst zu kontaktieren, und jeder schnelle Hash bleibt billig. Eigene Salts verhindern, dass eine Berechnung für mehrere Konten wiederverwendet wird, machen aber die Rateversuche für jedes Konto nicht aufwendig. Ein Passwort-Hashing-Verfahren mit einstellbarem Kostenfaktor begegnet dieser zusätzlichen Schwäche.

Frage 7 von 10

Ein Dienst mit reiner Passwortanmeldung folgt NIST SP 800-63B-4. Welche Regel passt zu den Vorgaben für Mindestlänge und regelmäßige Änderungen?
  1. Mindestens 8 Zeichen, mit erzwungener Änderung jeden Kalendermonat.
  2. Mindestens 12 Zeichen, mit einem vorgeschriebenen Sonderzeichen in jedem Passwort.
  3. Mindestens 15 Zeichen, mit erzwungener Änderung bei einem Beleg für Kompromittierung.
  4. Mindestens 15 Zeichen, mit erzwungener Änderung nach jeder erfolgreichen Anmeldung.
Antwort zeigenAntwort ausblenden
Antwort: C
Die NIST-Richtlinie von 2025 verlangt mindestens 15 Zeichen für ein allein verwendetes Passwort und eine Änderung bei erkennbarer Kompromittierung. Das Minimum von acht Zeichen gilt für Passwörter innerhalb einer MFA. Regelmäßig geplante Änderungen und vorgeschriebene Zeichenmischungen sind kein empfohlener Ersatz für Sperrlisten und Ratenbegrenzungen.

Frage 8 von 10

Eine Anmeldung fragt nach einem Passwort und anschließend nach einer PIN, die sich der Benutzer merkt. Wie viele Faktorarten werden verwendet?
  1. Zwei: Wissen und Besitz.
  2. Eine: Identität.
  3. Zwei: eine pro Bildschirm.
  4. Eine: Wissen.
Antwort zeigenAntwort ausblenden
Antwort: D
Sowohl das Passwort als auch die gemerkte PIN beweisen Wissen. Zweimal zu fragen erzeugt keinen Besitzfaktor, selbst wenn die Abfragen auf unterschiedlichen Bildschirmen erscheinen. MFA erfordert unterschiedliche Faktorarten, etwa ein Passwort und den Nachweis eines vorhandenen Sicherheitsschlüssels, nicht nur zwei getrennte Geheimnisse derselben Art.

Frage 9 von 10

In einem biometrischen Test sind 6 von 30.000 Versuchen Unberechtigter erfolgreich und 18 von 900 Versuchen Berechtigter schlagen fehl. Wie groß sind FAR und FRR?
  1. FAR 0,02 %; FRR 2 %.
  2. FAR 2 %; FRR 0,02 %.
  3. FAR 0,02 %; FRR 0,06 %.
  4. FAR 0,2 %; FRR 20 %.
Antwort zeigenAntwort ausblenden
Antwort: A
Die FAR ist 6 geteilt durch 30.000, also 0,02 %; die FRR ist 18 geteilt durch 900, also 2 %. Jede Rate nutzt ihre eigene Gruppe von Versuchen. Alle Versuche als gemeinsamen Nenner zu verwenden verdeckt die unterschiedlichen Fragen: wie oft Unberechtigte Zugang erhalten und wie oft Berechtigte abgewiesen werden.

Frage 10 von 10

Ein Angreifer stiehlt die Prüfwertdatenbank eines Dienstes und betreibt eine gefälschte Website, die zuvor frische TOTP-Codes weitergeleitet hat. Der Dienst ersetzt diese Anmeldung durch FIDO2. Können gespeicherte öffentliche Schlüssel oder für die gefälschte Seite erhaltene Antworten eine gültige Signatur für die echte Seite liefern?
  1. Öffentliche Schlüssel können neue Herausforderungen signieren, aber Antworten für die gefälschte Seite gelten nicht für die echte.
  2. Keines reicht aus: Öffentliche Schlüssel können nicht signieren, und Antworten für die gefälschte Seite gelten nicht für die echte.
  3. Öffentliche Schlüssel können nicht signieren, aber eine frische Antwort für die gefälschte Seite lässt sich wie ein TOTP-Code weiterleiten.
  4. Beides reicht bei einer frischen Herausforderung aus, weil die Zeit statt der Website-Identität über die Annahme entscheidet.
Antwort zeigenAntwort ausblenden
Antwort: B
Die öffentlichen Schlüssel der Datenbank prüfen Signaturen, können sie aber nicht erzeugen; dem Angreifer fehlt weiterhin der private Signaturschlüssel. FIDO2 bindet eine Antwort außerdem an die vorgesehene Website, sodass eine Antwort für die gefälschte Seite nicht bei der echten authentifizieren kann. Die Aktualität allein, die das Weiterleiten von TOTP erlaubte, ist hier nicht die einzige Prüfung.
Set 2: Verfolge Hardware- und Kernelgrenzen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein root gehörendes Rechnerprogramm addiert in seiner Hauptfunktion zwei ganze Zahlen. In welchem CPU-Modus läuft dieser Anwendungscode normalerweise?
  1. Im Kernelmodus.
  2. Im VMX-Root-Modus.
  3. Im Benutzermodus.
  4. Im Root-Modus.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein Benutzerprozess versucht, mit x86-LIDT eine andere Interrupttabelle einzurichten. Was verhindert, dass er die Kontrolle über die Interruptbehandlung übernimmt?
  1. Der Scheduler verweigert seine nächste Zeitscheibe.
  2. Die CPU löst beim privilegierten Befehl einen Trap aus.
  3. Die C-Bibliothek schreibt die Tabellenadresse um.
  4. Der Seitencache verwirft seinen Tabelleninhalt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Ein Prozess springt wiederholt zu seinem eigenen Code und führt keine Systemaufrufe aus. Wie kann ein anderer bereiter Prozess trotzdem CPU-Zeit erhalten?
  1. Der nächste Systemaufruf des Prozesses in der Schleife wählt automatisch den anderen Prozess.
  2. Sprünge im Benutzermodus verlieren nach genügend Wiederholungen Privilegien.
  3. Die MMU zählt Sprünge und macht schließlich die Codeseite ungültig.
  4. Ein Timerinterrupt führt in den Kernel, der neu einplanen kann.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein Programm öffnet eine Datei schreibgeschützt und ruft später write() über diesen Deskriptor auf. Welcher Linux-Fehler passt zum fehlenden Zugriff über den Deskriptor?
  1. EBADF.
  2. EFAULT.
  3. EACCES.
  4. EAGAIN.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Ein privilegiertes Export-Hilfsprogramm prüft einen Pfad, pausiert und öffnet ihn dann. Ein anderer Prozess ersetzt den Pfad während der Pause. Welche Änderung behebt die Wettlaufsituation?
  1. Den Pfad zweimal prüfen und dann mit vollen Privilegien öffnen.
  2. Den Pfadtext kopieren und die ursprüngliche separate Prüfung beibehalten.
  3. Die Anmeldeverzögerung vor dem Start des Hilfsprogramms erhöhen.
  4. Das tatsächliche Objekt mit den vorgesehenen verringerten Anmeldeinformationen öffnen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Kernel-Behandlungsroutine vertraut einem vom Aufrufer angegebenen Benutzernamen, prüft das erste Byte eines Puffers und kopiert dann eine vom Aufrufer angegebene Länge hinein. Welche vollständige Korrektur ist nötig?
  1. Kernel-Anmeldeinformationen nutzen und nur die erste Zielseite prüfen.
  2. Kernel-Anmeldeinformationen nutzen und den gesamten Zielbereich prüfen.
  3. Dem Benutzernamen nach Prüfung des gesamten Zielbereichs vertrauen.
  4. Die Namensprüfung beibehalten und mit einem Kernelmodus-Befehl kopieren.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein Schreibzugriff auf eine schreibgeschützte Datenseite löst nach fork() einen Seitenfehler aus. Die Verwaltungsdaten des Kernels markieren sie als Copy-on-Write. Welche Reaktion erhält das normale Programmverhalten?
  1. Den Prozess beenden, weil jeder Schreibzugriff auf eine schreibgeschützte Seite zum Abbruch führt.
  2. Die gemeinsam genutzte physische Seite für beide Prozesse beschreibbar machen.
  3. Eine private beschreibbare Kopie erstellen und den Schreibzugriff wiederholen.
  4. EACCES als Ergebnis des Speicherbefehls zurückgeben.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Ein Prozess hat eine schreibgeschützte ausführbare Codeseite ohne Copy-on-Write-Status und eine schreibgeschützte Copy-on-Write-Datenseite, die nach fork() gemeinsam genutzt wird. Schreibzugriffe auf beide lösen Seitenfehler aus. Ein Treiber benötigt außerdem DMA in einen separaten Puffer. Welche Reaktion erhält die vorgesehenen Grenzen?
  1. Code geschützt halten, die beschriebenen Daten privat kopieren und DMA mit einer IOMMU begrenzen.
  2. Code geschützt halten, die beschriebenen Daten privat kopieren und DMA nur mit der CPU-MMU begrenzen.
  3. Code geschützt halten, die gemeinsamen Daten direkt beschreibbar machen und DMA mit einer IOMMU begrenzen.
  4. Code nach dem Fehler beschreibbar machen, die Daten privat kopieren und DMA mit einer IOMMU begrenzen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Angreifer leitet die Ausführung auf eingeschleuste Bytes einer als NX markierten Stackseite um. Welcher unmittelbare Schutz greift?
  1. Die eingeschleusten Bytes werden zuerst gelöscht.
  2. Das Laden von Befehlen von dieser Seite löst einen Fehler aus.
  3. Die Seite wird in einen zufälligen physischen Seitenrahmen verschoben.
  4. Die effektive UID wird auf einen gewöhnlichen Benutzer herabgesetzt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Informationsleck verrät eine Adresse innerhalb einer bekannten gemeinsam genutzten Bibliothek. Der Stack wird unabhängig randomisiert. Was kann ein Angreifer aus dem Leck ableiten?
  1. Die Bibliotheksbasis und bekannte Gadget-Offsets, aber nicht die Stackbasis.
  2. Sowohl die Bibliotheksbasis als auch die unabhängige Stackbasis.
  3. Nur das preisgegebene Byte, weil sich Offsets innerhalb der Bibliothek ändern.
  4. Die Stackbasis, aber keine weiteren Adressen innerhalb der Bibliothek.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 3: Entscheide, wer eine Ressource nutzen darf10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein Administrator möchte alle überprüfen, die ein Datenbankobjekt lesen dürfen. Welche Darstellung fasst diese Rechte direkt zusammen?
  1. Die Capability-Liste jedes Benutzers.
  2. Die ACL des Datenbankobjekts.
  3. Die Ausführungswarteschlange des Schedulers.
  4. Die Seitentabellen jedes Prozesses.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein Worker erbt einen beschreibbaren Deskriptor für metrics.bin. Danach entfernt der Eigentümer die Schreibberechtigung aus dem Dateimodus. Was geschieht mit gewöhnlichen Schreibzugriffen über diesen Deskriptor?
  1. Sie können mit dem beim Öffnen gewährten Zugriff fortgesetzt werden.
  2. Sie schlagen fehl, sobald die nächste Modusprüfung kein Schreibbit findet.
  3. Sie werden nur fortgesetzt, wenn der Worker Dateieigentümer wird.
  4. Sie öffnen den Pfad automatisch mit der UID des Workers erneut.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Ein übergeordneter Prozess soll einem Worker Lesezugriff auf eine bereits geöffnete Eingabedatei geben, keine Suche über Pfadnamen erlauben und alle eigenen übrigen Rechte behalten. Welches Konzept passt am besten?
  1. Die vollständigen Konto-Anmeldeinformationen des übergeordneten Prozesses teilen.
  2. Den Worker zur Gruppe der Eingabeverzeichnisse hinzufügen.
  3. Dem Worker eine schreibgeschützte Objekt-Capability übergeben.
  4. Ein Linux-Privileg gewähren, das Dateizugriffsprüfungen umgeht.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Welche Rechte gibt der Unix-Modus 652 der Eigentümergruppe?
  1. Lesen und Schreiben.
  2. Nur Schreiben.
  3. Nur Lesen.
  4. Lesen und Ausführen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Mina gehört eine Datei mit Modus 046. Kann sie die Datei bei der Eigentümerprüfung lesen, wenn ACLs und privilegierte Ausnahmen außer Acht bleiben?
  1. Ja, weil die Gruppenklasse Leserecht gewährt.
  2. Nein, weil die Eigentümerklasse keine Rechte hat.
  3. Ja, weil die Klasse für andere Leserecht gewährt.
  4. Ja, weil alle drei Klassen kombiniert werden.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein Programm fordert für eine neue Datei unter umask 037 den Modus 666 an. Welcher Modus ergibt sich?
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Omar hat gewöhnliche Schreib- und Ausführungsrechte für Leenas Verzeichnis mit Sticky-Bit. Eine Datei darin mit Modus 000 gehört ebenfalls Leena. Omar ist weder Datei- noch Verzeichniseigentümer und hat keine Sonderrechte. Kann er sie jetzt lesen oder löschen, und könnte er sie löschen, wenn nur das Sticky-Bit entfernt würde?
  1. Jetzt kein Lesen, aber Löschen ist bereits möglich und bleibt nach Entfernen des Bits möglich.
  2. Lesen und Löschen sind jetzt möglich, weil das Verzeichnis Schreiben und Ausführen erlaubt.
  3. Keine der Aktionen ist jetzt möglich, und Modus 000 verhindert das Löschen auch nach Entfernen des Bits.
  4. Jetzt weder Lesen noch Löschen; nach Entfernen des Sticky-Bits wird Löschen möglich.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Die Unix-Prüfungen eines Root-Dienstes erlauben einen Lesezugriff, aber durchgesetztes SELinux verweigert seiner Domäne den Zugriff auf den Dateityp. Was ist das Ergebnis?
  1. UID 0 hebt die SELinux-Verweigerung auf.
  2. Die vorherige DAC-Prüfung erlaubt das Lesen.
  3. Das Lesen wird durch systembestimmte Regeln verweigert.
  4. Das Lesen wird protokolliert, aber weiterhin erlaubt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Prozess auf der Stufe geheim muss geheime Notizen an einen vertraulichen Speicher senden. Er kann direkt schreiben oder ein Hilfsprogramm auf der Stufe vertraulich bitten, seinen als geheim gekennzeichneten Puffer zu lesen und dann den Speicher zu beschreiben. Was geschieht nach Bell-LaPadula mit diesen beiden Wegen?
  1. Nur das direkte Schreiben scheitert; das Hilfsprogramm darf nach oben lesen und dann auf seiner Stufe schreiben.
  2. Nur der Weg über das Hilfsprogramm scheitert; der geheime Prozess darf jedes Ziel beschreiben, das er lesen kann.
  3. Beide scheitern: Das direkte Schreiben geht nach unten, das Lesen des Hilfsprogramms nach oben.
  4. Beide gelingen, weil das vertrauliche Hilfsprogramm das endgültige Ziel beschreiben darf.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Unternehmen verwaltet 72 Beschäftigte mit je 24 Berechtigungen. Sechs Tätigkeitsrollen ohne Überschneidung enthalten jeweils 24 Berechtigungen; jede Person hat eine Rolle. Wie viele Zuordnungen benötigt dieses RBAC-Konzept und warum?
  1. 216: 72 Benutzer-Rollen- und 144 Rollen-Berechtigungs-Zuordnungen.
  2. 144: Nur die sechs Gruppen von Rollen-Berechtigungs-Zuordnungen zählen.
  3. 1.728: Jeder Benutzer muss weiterhin jede Berechtigung direkt erhalten.
  4. 288: 72 Benutzer-Rollen- und 216 Rollen-Berechtigungs-Zuordnungen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 4: Verfolge ein Gastbetriebssystem durch virtuelle Hardware10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Eine Virtualisierungsanwendung verlässt sich darauf, dass ein gewöhnliches Hostbetriebssystem die Hardware kontrolliert. Um welches Hypervisor-Konzept handelt es sich?
  1. Typ 1, nativ.
  2. Containerbasiert.
  3. Typ 2, gehostet.
  4. Auf Durchreichung basierend.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Acht gleich große Server haben jeweils durchschnittlich 7 % CPU-Auslastung. Was kann ihr gemeinsamer Durchschnitt einem Konsolidierungsplaner sagen?
  1. Sie erreichen durchschnittlich 56 %, sodass ein Host garantiert jeden zukünftigen Bedarf deckt.
  2. Sie erreichen durchschnittlich 7 %, weil sich gleichzeitige Gastbetriebssysteme dieselben physischen Kerne teilen.
  3. Sie erreichen durchschnittlich 87,5 %, sodass Speicher- und Gerätebedarf nicht weiter geprüft werden müssen.
  4. Sie erreichen durchschnittlich 56 % eines gleichwertigen Rechners, aber für Spitzen sind weiterhin Reserven nötig.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Unter Intel VT-x wird ein Gastkernel auf Ring 0 im VMX-Non-Root-Betrieb ausgeführt. Gibt ihm diese Ringnummer die Hardwarebefugnisse des Hypervisors?
  1. Nein; der VMX-Root-Betrieb bleibt eine separate Kontrollebene.
  2. Ja; jeder Ring-0-Befehl gehört zum Hostkernel.
  3. Ja; der Non-Root-Betrieb ändert nur die UID des Gastbetriebssystems.
  4. Nein; Ring 0 ist der am wenigsten privilegierte x86-Schutzring.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein Befehl eines klassischen Gastbetriebssystems mit verringerten Privilegien lässt ein Interrupt-Flag stillschweigend unverändert, statt einen Trap auszulösen. Warum reicht einfaches Trap-and-Emulate nicht aus?
  1. Der Befehl ist rechnerisch zu aufwendig für die direkte Ausführung.
  2. Der Hypervisor erhält kein Ereignis, um die beabsichtigte Änderung des Gastbetriebssystems zu emulieren.
  3. Das Gastbetriebssystem muss das Flag zuerst durch verschachtelte Seitentabellen übersetzen.
  4. Der Hypervisor hat die physische Interrupttabelle bereits abgegeben.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Ein Gastbetriebssystem kann nicht geändert werden, und der verfügbaren CPU fehlt geeignete Virtualisierungsunterstützung. Sein Kernel nutzt sensitive Befehle, die keinen Trap auslösen. Welcher Ansatz kann das Verhalten des Gastbetriebssystems bewahren und zugleich die Kontrolle behalten?
  1. Den Gastkernel direkt mit vollen Hostprivilegien ausführen.
  2. Diese Befehle im Quellcode durch Hypercalls ersetzen.
  3. Mit verschachtelten Seitentabellen jeden CPU-Befehl einen Trap auslösen lassen.
  4. Problematische Gastkernelbefehle vor der Ausführung übersetzen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Bei 4-KiB-Seiten wird die virtuelle Gastseite 5 auf Gastseitenrahmen 12 abgebildet, dieser auf Maschinenseitenrahmen 29. Welche Maschinenadresse entspricht 0x53D0?
  1. 0x1D3D0.
  2. 0xC3D0.
  3. 0x1D53D0.
  4. 0x533D0.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine VM nutzt hardwaregestützte verschachtelte Seitenverwaltung mit drei Gastseitentabellenebenen und vier Hypervisorebenen. Wie viele Speicherzugriffe auf Seitentabellen sind bei einer vollständig nicht zwischengespeicherten Übersetzung vor dem Datenzugriff nötig, und muss jede Änderung der Gastseitentabelle zur Synchronisierung einer Schattentabelle einen Trap auslösen?
  1. 7 Zugriffe; hardwaregestützte Verschachtelung benötigt nicht bei jeder Änderung eine Schattentabellensynchronisierung.
  2. 19 Zugriffe; jede Gasttabellenänderung muss zur Synchronisierung einer Software-Schattentabelle einen Trap auslösen.
  3. 19 Zugriffe; hardwaregestützte Verschachtelung benötigt nicht bei jeder Änderung eine Schattentabellensynchronisierung.
  4. 24 Zugriffe; jedes Paar verschachtelter Tabellen hat unabhängig von der Tiefe dieselbe Durchlauflänge.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Ein Host überbucht Speicher für verschiedene Kunden. Jedes Gastbetriebssystem weiß, welche Daten es verwerfen kann, und kundenübergreifende gemeinsame Seitennutzung ist untersagt. Welche Rückgewinnungsstrategie nutzt dieses Wissen, und was geschieht, wenn später alle Gastbetriebssysteme ihren vollständig zugesagten Speicher benötigen?
  1. Blinde Hostauslagerung nutzen; sie weiß unmittelbar, welche Gastseiten frei sind, und vermeidet Druck bei vollem Bedarf.
  2. Ballooning nutzen; es kann weiterhin nicht den gesamten zugesagten RAM bereitstellen, wenn der gemeinsame aktive Bedarf den Host übersteigt.
  3. Ballooning nutzen; es erhöht die Hostkapazität dauerhaft genug, um jede zugesagte Zuweisung zu erfüllen.
  4. Identische Seiten zusammenführen; das erfüllt die Nutzungsbeschränkung, weil zusammengeführte Seiten zunächst schreibgeschützt sind.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Speichertreiber im Gastbetriebssystem stellt viele Anfragen in eine Warteschlange im gemeinsam genutzten Speicher, bevor er ein Backend benachrichtigt. Welches Gerätemodell zeigt dies?
  1. Ein registerweise emuliertes Gerät.
  2. Eine paravirtuelle Geräteschnittstelle.
  3. Ein ohne Vermittlung gemeinsam genutztes physisches Gerät.
  4. Ein Emulator für CPU-Befehlssätze.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

VMs haben korrekte private Seitenabbildungen, aber ein Angreifer leitet Daten aus dem Zeitverhalten eines gemeinsam genutzten Caches ab. Der Betreiber erwägt CPU-Mikrocode-Updates und möchte vermeiden, verschiedene Kunden gleichzeitig auf den Hardwarethreads desselben Kerns auszuführen. Welche Diagnose verbindet das Risiko mit diesen Kontrollen?
  1. Ein Seitenkanal über gemeinsam genutzte Hardware benötigt CPU-Gegenmaßnahmen und eine sorgfältige gleichzeitige Platzierung auf Hardwarethreads desselben Kerns.
  2. Ein Ausbruch über das Gerätemodell benötigt nur korrigierte Emulation; Cache-Zeitverhalten kann korrekte Gastabbildungen nicht überwinden.
  3. Ein Seitenkanal über einen gemeinsamen Cache benötigt nur CPU-Updates; Updates beseitigen jedes Risiko durch Hardwarethreads desselben Kerns.
  4. Ein Seitenkanal über einen gemeinsamen Cache benötigt nur Threadtrennung; CPU-Schwachstellen brauchen dann keine Updates.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 5: Interpretiere Containersichten und -grenzen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein Dienst benötigt eigene Schnittstellen, eine eigene Routingtabelle und einen eigenen Portbereich zum Lauschen. Welcher Linux-Namensraum bietet diese Sicht?
  1. Netzwerk.
  2. Mount.
  3. PID.
  4. Cgroup.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine UID-Zuordnung lautet 0 220000 8000. Welche Host-UID entspricht der internen UID 1750?
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Ein übergeordneter Prozess ruft unshare(CLONE_NEWPID) auf, erzeugt dort seinen ersten Kindprozess und läuft außerhalb weiter. Dieser Kindprozess erzeugt einen Protokollierungsprozess und endet dann. Was geschieht mit dem Protokollierungsprozess und dem übergeordneten Prozess?
  1. Der Protokollierungsprozess überlebt als PID 1, und der übergeordnete Prozess wechselt in den Namensraum des Kindprozesses.
  2. Der Protokollierungsprozess überlebt im Hostnamensraum, und der übergeordnete Prozess behält seine alte Zugehörigkeit.
  3. Der Protokollierungsprozess wird beendet und der übergeordnete Prozess ebenfalls, weil beide denselben Kernel nutzen.
  4. Der Protokollierungsprozess wird beendet, und der übergeordnete Prozess bleibt in seinem ursprünglichen PID-Namensraum.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine Gruppe hat für cpu.max den Wert 120000 100000. Welches CPU-Kontingent gibt dieser Wert an?
  1. Die Zeit von 0,12 CPUs pro Periode.
  2. Die Zeit von 1,2 CPUs pro Periode.
  3. Die Zeit von 12 CPUs pro Periode.
  4. Ein relatives Schedulinggewicht von 1,2.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Zwei Gruppen auf derselben Ebene mit genügend ausführbaren Threads konkurrieren um sechs gleichermaßen verfügbare CPUs. Ihre Gewichte betragen 200 und 400; es gibt keine Kontingente. Welchen Anteil erhält die erste Gruppe, und was geschieht, wenn die zweite untätig wird?
  1. Bei Konkurrenz etwa zwei CPUs; allein bleibt sie auf zwei begrenzt.
  2. Bei Konkurrenz etwa zwei CPUs; allein darf sie alle sechs nutzen.
  3. Bei Konkurrenz etwa drei CPUs; allein darf sie alle sechs nutzen.
  4. Bei Konkurrenz etwa vier CPUs; allein bleibt sie auf vier begrenzt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Elterngruppe begrenzt zwei ausgelastete Kindgruppen auf die Leistung von 1,5 CPUs. Kindgruppe A hat Gewicht 100 und ein eigenes Kontingent von 0,5 CPUs; B hat Gewicht 200. A soll bei Konkurrenz ihren Anteil von einem Drittel behalten, aber die gesamte verfügbare Kapazität der Elterngruppe nutzen können, wenn B untätig ist. Welche Änderung passt?
  1. Das eigene Kontingent von A entfernen und beide Gewichte sowie die Obergrenze der Elterngruppe behalten.
  2. Das Gewicht von A auf 300 erhöhen und ihr eigenes Kontingent sowie die Obergrenze der Elterngruppe behalten.
  3. Nur die Obergrenze der Elterngruppe erhöhen und das eigene Kontingent von A sowie beide Gewichte behalten.
  4. B ein kleineres Kontingent geben und das eigene Kontingent von A sowie beide Gewichte behalten.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine Elterngruppe hat für pids.max den Wert 30. Kindgruppe A hat vier Prozesse mit jeweils insgesamt sieben Threads und eine lokale Grenze von 40; die Gruppe B auf derselben Ebene enthält zwei Prozesse mit je einem Thread. Kann A einen weiteren Thread erzeugen, während alle bestehenden Tasks weiterlaufen?
  1. Ja; A liegt unter ihrer lokalen Grenze von 40, daher spielt die Gesamtsumme der Elterngruppe keine Rolle.
  2. Ja; die Elterngruppe zählt nur die sechs Prozessleiter, sodass 24 Taskplätze frei bleiben.
  3. Nein; die 28 Tasks von A und die 2 von B füllen bereits die Grenze der Elterngruppe von 30 Tasks.
  4. Nein; A überschreitet bereits ihre lokale Grenze, weil jeder Prozess sieben zusätzliche Prozessleiter hinzufügt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Ein Team möchte eine Anwendung, die einen Windows-Kernel benötigt, auf Linux-Servern ausführen. Welche Grenze kann diesen Kernel bereitstellen?
  1. Ein Windows-Container.
  2. Ein UID-0-Namensraum.
  3. Ein eingehängter Windows-Dateibaum.
  4. Eine VM mit Windows.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Rootless-Container erhält einen nutzbaren Socket zu einer root gehörenden Host-Laufzeitumgebung. Warum kann die UID-Zuordnung den Host möglicherweise nicht vor seinen Anfragen schützen?
  1. Die zugeordnete UID gibt den Anfragen der Laufzeitumgebung nur die verringerten Befugnisse des Containers.
  2. Die Zuordnung blockiert Privilegänderungen im Client, sodass Anfragen keine Hostobjekte beeinflussen können.
  3. Die Laufzeitumgebung handelt bei Anfragen des Clients mit ihren eigenen privilegierten Befugnissen.
  4. Der Socket erlaubt nur namensraumlokale Aktionen, weil sein Client in einem Benutzernamensraum liegt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Anbieter führt hochgeladenen Code für voneinander unabhängige Kunden aus. Die Kunden A und C benötigen Linux, B benötigt Windows. Er möchte Container innerhalb jeder Kundenumgebung schnell bereitstellen und zugleich die Folgen einer Gastkernel-Kompromittierung auf den jeweiligen Kunden begrenzen. Wie sollte er die Grenzen anordnen?
  1. Pro Kunde eine separate VM oder MicroVM mit dem benötigten Betriebssystem und kompatiblen Containern darin nutzen.
  2. Pro Betriebssystem eine VM nutzen, die Container von A und C unter Linux mischen und B in einer Windows-VM platzieren.
  3. Eine gemeinsame Linux-VM mit getrennten Rootless-Containern nutzen und B einen Windows-Dateibaum geben.
  4. Eine gemeinsame Windows-VM mit getrennten PID-Namensräumen nutzen und die Bibliotheken aller drei Kunden einpacken.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 6: Diagnostiziere Fehler über Isolationsebenen hinweg10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Eine ermittelnde Person benötigt Aufzeichnungen fehlgeschlagener Anmeldungen und der Nutzung von Befehlen mit erhöhten Rechten. Welcher Mechanismus liefert diese Belege?
  1. Adressrandomisierung.
  2. Überwachungsprotokollierung.
  3. Verschachtelte Seitenverwaltung.
  4. Ein CPU-Ausführungskontingent.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein biometrisches System akzeptiert zu viele Unberechtigte. Der Betreiber erhöht seinen Ähnlichkeitsschwellenwert. Auf welchen Zielkonflikt sollte ein Test achten?
  1. Mehr akzeptierte Unberechtigte und weniger abgelehnte Berechtigte.
  2. Weniger akzeptierte Unberechtigte und weniger abgelehnte Berechtigte.
  3. Mehr akzeptierte Unberechtigte und mehr abgelehnte Berechtigte.
  4. Weniger akzeptierte Unberechtigte und mehr abgelehnte Berechtigte.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine POSIX-ACL gibt einem benannten Benutzer Lesen und Schreiben, aber ihre Maske erlaubt nur Lesen. Der Eintrag der Datei für andere erlaubt Schreiben. Der Benutzer ist nicht der Eigentümer. Kann der benannte Benutzer nach erneutem Öffnen schreiben?
  1. Nein; der benannte Eintrag wird durch die Maske begrenzt und kann nicht auf andere zurückgreifen.
  2. Ja; der benannte Lese-Schreib-Eintrag umgeht die Maske der Gruppenklasse.
  3. Ja; das Schreibrecht für andere wird mit dem maskierten benannten Eintrag kombiniert.
  4. Nein; jeder benannte Benutzer muss vor der ACL-Nutzung der Eigentümergruppe beitreten.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein privilegiertes Hilfsprogramm kopiert einen Pfadnamen in privaten Speicher, prüft ihn mit access() und öffnet den Pfad dann mit vollen Privilegien. Ein Angreifer kann den benannten Eintrag ersetzen. Welche Schwachstelle bleibt?
  1. Das Kopieren der Zeichenfolge hat sowohl die Speicherwettlaufsituation als auch die Pfadwettlaufsituation beseitigt.
  2. Die Kopie ändert die reale UID des Hilfsprogramms auf die des Pfadeigentümers.
  3. Die unveränderte Zeichenfolge kann beim Öffnen weiterhin auf ein anderes Objekt aufgelöst werden.
  4. Die Kopie macht symbolische Links für jede spätere Namensauflösung unsichtbar.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Bei 4-KiB-Seiten bildet ein Gastbetriebssystem die virtuelle Seite 9 auf Gastseitenrahmen 4 und dann auf Maschinenseitenrahmen 51 ab. Einem zugewiesenen Gerät erlaubt seine IOMMU außerdem die Maschinenseitenrahmen 48–55. Wie lautet die von der CPU übersetzte Maschinenadresse für 0x9B20, und liegt der resultierende Seitenrahmen innerhalb der Geräteabbildung?
  1. 0x4B20; nein, Seitenrahmen 4 liegt außerhalb des erlaubten Bereichs.
  2. 0x33B20; nein, der Offset liegt außerhalb des erlaubten Bereichs.
  3. 0x33B20; ja, Seitenrahmen 51 liegt im erlaubten Bereich.
  4. 0x9B20; ja, die virtuelle Seitennummer liegt im erlaubten Bereich.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein Host mit acht CPUs gibt einer Eltern-Cgroup ein Kontingent von zwei CPUs. Zwei ausführbare Kindgruppen auf derselben Ebene haben die Gewichte 100 und 300, keine kleineren Kontingente und genügend parallele Arbeit. Welche dauerhaften Anteile ergeben sich, während beide konkurrieren?
  1. Etwa 2 und 6 CPUs von allen acht Host-CPUs.
  2. Etwa 0,5 und 1,5 CPUs innerhalb der Obergrenze der Elterngruppe.
  3. Etwa 1 und 1 CPU bei gleicher Aufteilung des Kontingents.
  4. Etwa 2 und 2 CPUs mit je einem vollen Kontingent.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein übergeordneter Prozess öffnet eine Datei, übergibt einem Worker einen schreibgeschützten Deskriptor und ändert dann den Dateimodus so, dass dem Worker zukünftiges Öffnen verweigert wird. Welche Befugnis hat der Worker über den Deskriptor weiterhin?
  1. Er behält den Lesezugriff über den bestehenden Deskriptor.
  2. Er verliert den Deskriptor beim nächsten Schedulerwechsel.
  3. Er erhält Schreibzugriff, weil Deskriptoren Zugriffsmodi ignorieren.
  4. Er darf über diesen Dateideskriptor jede benachbarte Datei erneut öffnen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine VM nutzt Gerätedurchreichung für eine DMA-fähige Karte und hardwareverschlüsselten Gastspeicher. Der Betreiber möchte Livemigration und eine Begrenzung des Gerätezugriffs auf die richtige VM. Welche Arbeit ist weiterhin erforderlich?
  1. Die IOMMU nutzen, aber nur die Festplatte migrieren und den Zustand des zugewiesenen Geräts auslassen.
  2. Den Gerätezustand übertragen, aber dessen DMA allein mit Gastseitentabellen begrenzen.
  3. Die Speicherverschlüsselung die DMA-Begrenzung ersetzen lassen und nur den CPU-Zustand kopieren.
  4. DMA mit einer IOMMU begrenzen und den Migrationszustand des zugewiesenen Geräts behandeln.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Container hat einen neuen PID-Namensraum, teilt sich aber den Netzwerknamensraum des Hosts. Kann er allein durch seine PID-Isolation einen Port binden, der auf dem Host bereits belegt ist?
  1. Nein; der Port bleibt im gemeinsam genutzten Netzwerknamensraum.
  2. Ja; jeder PID-Namensraum hat einen unabhängigen Portbereich.
  3. Ja; PID 1 erhält automatisch einen neuen Netzwerkstack.
  4. Nein; Container können niemals Netzwerkports binden.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Angreifer dringt in einen Container in der VM von Kunde A ein und nutzt einen Fehler aus, um den Gastkernel dieser VM zu kontrollieren. Andere Kunden haben separate VMs auf demselben physischen Host. Welche Arbeitslasten sind unmittelbar gefährdet, und was ist noch nötig, um Code auf dem Host auszuführen?
  1. Nur der ursprüngliche Container ist gefährdet; sein PID-Namensraum begrenzt weiterhin den kontrollierten Gastkernel.
  2. Andere Container in der VM von A sind gefährdet; für die Ausführung auf dem Host muss weiterhin die VM-Grenze überwunden werden.
  3. Die VMs aller Kunden sind unmittelbar gefährdet; jeder Gastkernel kontrolliert den gemeinsamen physischen Host.
  4. Nur Container mit derselben UID sind gefährdet; ein kontrollierter Gastkernel muss weiterhin jede UID beachten.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

113 Schlüsselbegriffe, jeweils mit Definition

A

AppArmor-Profil
Ein AppArmor-Profil schränkt ein Programm ein, indem es erlaubte Pfade und Operationen einschließlich ausgewählter Linux-Capabilities festlegt.
Ein AppArmor-Profil kann einem Dienst das Lesen seiner Konfiguration erlauben, aber den Zugriff auf nicht zugehörige Dateien in Home-Verzeichnissen verweigern.
ASLR
ASLR randomisiert die Positionen von Speicherbereichen, sodass Angreifer Adressen für Codewiederverwendung oder gezielte Datenzugriffe nicht zuverlässig vorhersagen können.
Ein Informationsleck kann die Basisadresse einer Bibliothek verraten und ASLR für deren Gadgets schwächen.
Ausnahmeebene
Eine Ausnahmeebene ist eine Ausführungsprivilegstufe von ARMv8-A, die von EL0 für Anwendungen bis EL3 für sichere Firmware reicht.
Der ARM-Hypervisor läuft auf Ausnahmeebene EL2, während ein Gastbetriebssystemkernel normalerweise auf EL1 läuft.
Authentifizierung
Authentifizierung prüft, ob eine Einheit, die eine Identität beansprucht, die dieser Identität zugeordneten Anmeldeinformationen oder Faktoren kontrolliert.
Eine erfolgreiche Authentifizierung ermöglicht dem Anmeldedienst, die Anmeldeinformationen des Kontos einer neuen Shell zuzuordnen.
Autorisierung
Autorisierung entscheidet, ob ein authentifiziertes Sicherheitssubjekt eine bestimmte Operation auf einer geschützten Ressource ausführen darf.
Die Dateiautorisierung kann einem angemeldeten Benutzer die Erlaubnis verweigern, einen Bericht zu lesen, der einem anderen Konto gehört.

B

Ballooning
Ballooning nutzt einen Gasttreiber, um Seiten zu reservieren, damit der Hypervisor mit Hilfe des Gastbetriebssystems ihre Maschinenseitenrahmen zurückgewinnen kann.
Ballooning lässt das Gastbetriebssystem anhand von Wissen, das der Hypervisor nicht hat, auswählen, welche Seiten es abgibt.
Bell-LaPadula-Modell
Das Bell-LaPadula-Modell schützt Vertraulichkeit, indem es Lesen über der Stufe eines Subjekts und Schreiben darunter verbietet.
Nach dem Bell-LaPadula-Modell darf ein Prozess auf der Stufe geheim vertrauliche Daten lesen, aber keine vertrauliche Datei beschreiben.
Benutzerbestimmte Zugriffskontrolle
Die benutzerbestimmte Zugriffskontrolle lässt den Eigentümer eines Objekts entscheiden, welche anderen Sicherheitssubjekte mit welchen Rechten darauf zugreifen dürfen.
Die benutzerbestimmte Zugriffskontrolle erlaubt einem Dateieigentümer, Lesezugriff zu gewähren, auch über ein Programm, das als dieser Eigentümer läuft.
Benutzermodus
Der Benutzermodus ist die eingeschränkte CPU-Privilegstufe, auf der Anwendungsbefehle unter Hardware-Schutzprüfungen ausgeführt werden.
Ein root gehörender Texteditor führt seine gewöhnlichen Befehle weiterhin im Benutzermodus aus und fordert Dateioperationen beim Kernel an.
Benutzernamensraum
Ein Benutzernamensraum bildet Benutzer- und Gruppenkennungen zwischen interner und externer Sicht aufeinander ab und beschränkt Capabilities auf seine Ressourcen.
Ein Benutzernamensraum kann die Container-UID 0 auf eine unprivilegierte Host-UID statt auf Host-root abbilden.
Binärübersetzung
Binärübersetzung schreibt problematische Gastkernelbefehle vor der Ausführung in sichere Folgen um und speichert das Ergebnis zwischen.
Binärübersetzung kann einen unveränderten Gastkernel auf einem Prozessor mit sensitiven Befehlen unterstützen, die keinen Trap auslösen.
Biometrisches Referenzmuster
Ein biometrisches Referenzmuster sind gespeicherte Merkmalsdaten, die aus einer körperlichen Eigenschaft abgeleitet und für einen ähnlichkeitsbasierten Identitätsvergleich genutzt werden.
Ein Fingerabdrucksensor vergleicht neue Merkmale mit einem biometrischen Referenzmuster, statt identische Bilder zu verlangen.
Brute-Force-Angriff
Ein Brute-Force-Angriff probiert systematisch jeden Kandidaten in einem definierten Passwortsuchraum aus, bis er einen passenden Prüfwert findet.
Ein Brute-Force-Angriff auf acht Kleinbuchstaben hat einen Suchraum von 26 hoch acht.

C

Capability-Widerruf
Ein Capability-Widerruf entzieht zuvor gewährten tokenbasierten Zugriff und kann die Kontrolle über delegierte Kopien erfordern.
Ein Capability-Widerruf ist schwierig, wenn viele Prozesse unabhängig nutzbare Kopien einer Berechtigung für ein Objekt besitzen.
Cgroup-Controller
Ein Cgroup-Controller misst oder regelt eine Ressourcenklasse für Gruppen in der Kontrollgruppenhierarchie.
Eine Elterngruppe aktiviert den Speicher-Cgroup-Controller für ihre Kindgruppen, bevor sie deren Speichergrenzen konfiguriert.
Confidential Computing
Confidential Computing nutzt Hardwareschutz und Attestierung, um Gastspeicher vor einem möglicherweise nicht vertrauenswürdigen Host abzuschirmen.
Confidential Computing kann Speicherschlüssel einer VM für den Hypervisor unzugänglich halten, während die Hardware den Startzustand überprüft.
Container
Ein Container besteht aus einem oder mehreren Prozessen auf dem Hostkernel, die mit privaten Sichten, Ressourcensteuerung und Privilegbegrenzungen isoliert werden.
Ein Container kann Dateien einer anderen Linux-Distribution enthalten und dennoch auf demselben Kernel wie der Host laufen.
cpu.max
cpu.max ist die cgroup-v2-Datei, die ein CPU-Ausführungskontingent und eine Periode in Mikrosekunden oder ein unbegrenztes Kontingent festlegt.
Ein cpu.max-Wert von 75000 100000 erlaubt höchstens drei Viertel der Zeit einer CPU pro Periode.
cpu.weight
cpu.weight legt den relativen CPU-Anteil einer Cgroup bei Konkurrenz fest, ohne eine feste Obergrenze für sonst verfügbare Zeit aufzuerlegen.
Ein höherer cpu.weight-Wert bevorzugt eine ausgelastete Gruppe gegenüber konkurrierenden Gruppen auf derselben Ebene, kann aber deren separates Kontingent nicht aufheben.

D

DACL
Eine DACL ist die geordnete Liste erlaubender und verweigernder Einträge eines Windows-Objekts, die bestimmt, welche angeforderten Rechte gewährt werden.
Eine DACL kann ein angefordertes Leserecht durch einen expliziten Eintrag gewähren, bevor die Auswertung eine geerbte Verweigerung erreicht.
Dateideskriptor
Ein Dateideskriptor ist ein prozesslokaler Index auf eine geöffnete, vom Kernel verwaltete Ressource, bei der der beim Öffnen gewährte Zugriff festgehalten ist.
Ein geerbter beschreibbarer Dateideskriptor kann nutzbar bleiben, nachdem der Dateimodus neue Öffnungen zum Schreiben nicht mehr erlaubt.
Direkter Speicherzugriff
Direkter Speicherzugriff erlaubt einem Gerät, Daten zum oder vom RAM zu übertragen, ohne diese Zugriffe durch die MMU der CPU zu leiten.
Ein Netzwerkgerät mit direktem Speicherzugriff benötigt eine separate Grenze für die RAM-Adressen, die es erreichen kann.

E

EFAULT
EFAULT ist ein Linux-Fehler, der angibt, dass eine für einen Speicherzugriff eines Systemaufrufs angegebene Adresse keine gültige erlaubte Benutzeradresse ist.
Ein read()-Aufruf mit einem Ziel im Kernelspeicher kann EFAULT zurückgeben, statt den Kernel zu überschreiben.
Effektive UID
Die effektive UID ist die Unix-Prozessidentität, die für die meisten Zugriffsprüfungen genutzt wird und von der Identität abweichen kann, die den Prozess gestartet hat.
Ein root gehörendes Setuid-Passwort-Hilfsprogramm hat die effektive UID 0 und behält zugleich die reale UID des Aufrufers.
Eingeschränkte direkte Ausführung
Bei der eingeschränkten direkten Ausführung laufen gewöhnliche Befehle nativ, während Hardwareprüfungen und kontrollierte Traps die übergeordnete Kontrolle bewahren.
Die eingeschränkte direkte Ausführung gibt einer Anwendung native Rechengeschwindigkeit, ohne ihr das Ersetzen der Seitentabellen zu erlauben.

F

Falschakzeptanzrate
Die Falschakzeptanzrate ist der Anteil der Versuche Unberechtigter, die ein biometrisches System fälschlich als berechtigt akzeptiert.
Ein akzeptierter Unberechtigter bei 5.000 Versuchen ergibt eine Falschakzeptanzrate von 0,02 %.
Falschrückweisungsrate
Die Falschrückweisungsrate ist der Anteil der Versuche Berechtigter, die ein biometrisches System fälschlich nicht akzeptiert.
Ein strengerer Ähnlichkeitsschwellenwert erhöht die Falschrückweisungsrate, wenn mehr Scans Berechtigter den Schwellenwert verfehlen.

G

Gastbetriebssystem
Ein Gastbetriebssystem läuft innerhalb einer virtuellen Maschine und sieht Hardware, die von einem Hypervisor bereitgestellt wird.
Das Gastbetriebssystem aktualisiert seine Seitentabellen, ohne direkte Kontrolle über jeden Maschinenseitenrahmen des Hosts zu erhalten.
Gemeinsame Seitennutzung
Gemeinsame Seitennutzung führt identische Seiten zu einer schreibgeschützten Kopie zusammen und erstellt wieder separate Kopien, wenn ein Gastbetriebssystem auf eine davon schreibt.
Kundenübergreifende gemeinsame Seitennutzung kann durch die Zeit zum Erstellen einer privaten beschreibbaren Kopie übereinstimmende Daten verraten.
Gerätedurchreichung
Gerätedurchreichung weist ein physisches Gerät oder eine Funktion direkt einer VM zu, wobei eine IOMMU dessen DMA-Zugriff begrenzt.
Gerätedurchreichung kann die Netzwerkleistung verbessern und zugleich gemeinsame Nutzung und Livemigration erschweren.
Geräteemulation
Geräteemulation stellt ein Softwaremodell physischer Hardware bereit, damit ein Gastbetriebssystem einen Treiber für dieses Gerät nutzen kann.
Geräteemulation kann einen Registerschreibzugriff einer Gastnetzwerkkarte in Arbeit übersetzen, die ein Host-Hilfsprogramm ausführt.
gVisor
gVisor schaltet einen Kernel im Benutzeradressraum für Container-Systemaufrufe dazwischen und verringert so den direkten Kontakt der Arbeitslast mit dem Hostkernel.
gVisor behandelt einen großen Teil der Systemaufruffläche einer Sandbox, bevor ausgewählte Operationen den realen Hostkernel erreichen.

H

Hypercall
Ein Hypercall ist eine ausdrückliche Anfrage von Gastsoftware an den Hypervisor, eine Operation im Auftrag des Gastbetriebssystems auszuführen.
Ein Hypercall kann den Monitor bitten, den Zustand der virtuellen Maschine eines Gastbetriebssystems zu ändern, ohne vorzugeben, den Host zu besitzen.
Hypervisor
Ein Hypervisor ist die Softwareebene, die VMs erzeugt, ihnen Ressourcen zuweist und die Kontrolle über die physische Maschine behält.
Der Hypervisor sichert den CPU-Zustand eines Gastbetriebssystems, bevor er ein anderes auf demselben physischen Kern einplant.

I

IOMMU
Eine IOMMU übersetzt Geräteadressen und setzt Abbildungen durch, die begrenzen, auf welchen Speicher jedes DMA-fähige Gerät zugreifen darf.
Die IOMMU verhindert, dass ein durchgereichtes Netzwerkgerät außerhalb des seiner VM zugewiesenen Speichers schreibt.

K

Kata Containers
Kata Containers platziert jede Container-Sandbox in einer schlanken VM und gibt so getrennten Sandboxes separate Gastkernel.
Kata Containers kann mehrere Container eines Pods in einer Sandbox unterbringen, die sich einen geschützten Gastkernel teilen.
Kernel-Seitentabellenisolation
Die Kernel-Seitentabellenisolation entfernt während der Ausführung im Benutzermodus die meisten Kernelabbildungen, um das Risiko auf von Meltdown betroffenen Prozessoren zu verringern.
Die Kernel-Seitentabellenisolation wechselt die aktiven Abbildungen, wenn die Ausführung die Grenze zwischen Benutzer und Kernel überschreitet.
Kernelmodus
Der Kernelmodus ist die CPU-Privilegstufe, die dem Betriebssystem erlaubt, geschützte Befehle auszuführen und Hardware zu verwalten.
Ein Treiber im Kernelmodus kann Maschinenzustände ändern, die eine gewöhnliche Anwendung nicht direkt kontrollieren kann.
Kontrollgruppe
Eine Kontrollgruppe organisiert Prozesse hierarchisch zur Ressourcenmessung und -steuerung, wobei Beschränkungen übergeordneter Gruppen vererbt werden.
Eine Kontrollgruppe kann die CPU-Nutzung eines Stapelauftrags begrenzen, ohne die Prozessnamen des Hosts vor ihm zu verbergen.
Kostenfaktor des Passwort-Hashings
Der Kostenfaktor des Passwort-Hashings bestimmt den bewusst erzeugten Rechenaufwand und manchmal auch Speicherbedarf, um einen Passwortprüfwert zu berechnen.
Ein höherer Kostenfaktor des Passwort-Hashings verlangsamt sowohl eine legitime Anmeldeprüfung als auch jeden Rateversuch eines Angreifers.

L

Linux-Capability
Eine Linux-Capability ist ein separat zuweisbarer Teil der Privilegien von root, der eine Klasse privilegierter Operationen erlaubt.
Die Linux-Capability CAP_NET_BIND_SERVICE erlaubt das Binden niedriger Ports, ohne alle Root-Befugnisse zu gewähren.
Livemigration
Livemigration überträgt eine laufende VM zwischen Hosts und kopiert gewöhnlich den Speicher vor einem kurzen abschließenden Wechsel der Ausführung.
Ein durchgereichtes Gerät kann die Livemigration erschweren, weil auch sein aktiver Hardwarezustand behandelt werden muss.

M

Measured Boot
Measured Boot zeichnet Hashes von Startkomponenten auf, häufig in einem TPM, sodass eine andere Partei überprüfen kann, was geladen wurde.
Measured Boot liefert Startmesswerte für die Attestierung, ohne selbst der signaturbasierte Verweigerungsmechanismus zu sein.
Mehrfaktorauthentifizierung
Mehrfaktorauthentifizierung erfordert Nachweise aus unterschiedlichen Faktorarten, etwa Wissen und den Besitz eines Geräts.
Ein Passwort und ein Code einer Authentifizierungs-App bieten Mehrfaktorauthentifizierung, anders als zwei Wissensfragen.
memory.high
memory.high ist ein Cgroup-Speicherdruckschwellenwert, der oberhalb davon Tasks bei Speicherzuweisungen verlangsamt und verstärkte Rückgewinnung auslöst.
Eine Gruppe kann memory.high überschreiten, während der Rückgewinnungsdruck zunimmt, anders als bei einer einfachen festen Zuweisungsgrenze.
memory.max
memory.max ist eine feste Cgroup-Speichergrenze, die eine lokale OOM-Beendigung auslösen kann, wenn Rückgewinnung den Bedarf nicht decken kann.
Nachdem Cache-Rückgewinnung und nutzbare Auslagerung ausgeschöpft sind, kann memory.max die Beendigung eines geeigneten Tasks in der Gruppe erzwingen.
MicroVM
Eine MicroVM ist eine kleine virtuelle Maschine, die mit einem minimalen Gerätemodell für die effiziente Isolation schlanker Arbeitslasten entworfen wurde.
Eine Plattform kann eine nicht vertrauenswürdige Funktion in einer Firecracker-MicroVM platzieren, um ihr eine Grenze durch einen separaten Gastkernel zu geben.
Mount-Namensraum
Ein Mount-Namensraum trennt die Liste eingehängter Dateisysteme einer Prozessgruppe und ermöglicht so einen privaten sichtbaren Dateibaum.
Ein Mount-Namensraum lässt eine Laufzeitumgebung ein Container-Wurzelverzeichnis zusammenstellen, ohne die eigene Einhängeliste des Hosts zu ersetzen.

N

Namensraum
Ein Namensraum gibt Prozessen eine eigene Instanz oder Sicht auf eine Kategorie normalerweise globaler Linux-Systemzustände.
Ein Namensraum kann Einhängelisten trennen, ohne die CPU-Nutzung der Prozesse zu begrenzen, die diese Sicht verwenden.
Netzwerknamensraum
Ein Netzwerknamensraum stellt separate Schnittstellen, Adressen, Routen, Ports und andere zu einem Netzwerkstack gehörende Zustände bereit.
Zwei Dienste in unterschiedlichen Netzwerknamensräumen können beide an Port 80 lauschen, ohne dass innerhalb eines Namensraums ein Portkonflikt entsteht.
no_new_privs
no_new_privs ist ein Linux-Prozessflag, das verhindert, dass die Ausführung durch Setuid oder verwandte Mechanismen neue Privilegien gewährt.
Bei gesetztem no_new_privs kann ein Containerprozess nicht allein durch das Starten einer ausführbaren Setuid-Datei Befugnisse gewinnen.
NX-Bit
Ein NX-Bit ist eine Seitenberechtigung, die die Ausführung von Befehlen auf der Seite verhindert, während andere Zugriffe getrennt gesteuert werden.
Eine Stackseite mit gesetztem NX-Bit kann Daten enthalten, löst aber einen Fehler aus, wenn das Programm versucht, sie auszuführen.

O

Objekt-Capability
Eine Objekt-Capability ist ein unfälschbares Token, das ein Objekt und die Operationen bezeichnet, die sein Besitzer auf diesem Objekt ausführen darf.
Ein Elternprozess kann eine Objekt-Capability für eine Eingabedatei weitergeben, ohne seinem Worker Zugriff auf das ganze Verzeichnis zu geben.
Offlineangriff
Ein Offlineangriff prüft Rateversuche anhand gestohlener Prüfwerte auf der Hardware des Angreifers, ohne den Anmeldedienst zu kontaktieren.
Ein Offlineangriff läuft in seinem eigenen Tempo weiter, selbst wenn das echte Konto nach fehlgeschlagenen Anmeldungen gesperrt wird.
Oktale Berechtigungsdarstellung
Eine oktale Berechtigungsdarstellung kodiert Unix-Berechtigungsklassen mit Lesen 4, Schreiben 2 und Ausführen 1 sowie optionalen Spezialbits.
Die oktale Berechtigungsdarstellung 640 gewährt dem Eigentümer Lesen und Schreiben, der Gruppe Lesen und der Klasse für andere keinen Zugriff.

P

PAM
PAM ist ein Linux-Authentifizierungsrahmen, mit dem Anmeldedienste konfigurierte Module für die Prüfung von Anmeldeinformationen und zugehörige Regeln nutzen können.
Ein SSH-Anmeldedienst kann PAM nutzen, um Anmeldeinformationen zu prüfen, bevor er die Prozessidentität des Benutzers setzt.
Paravirtualisierung
Paravirtualisierung ändert eine Gastschnittstelle so, dass sie virtuelle Operationen ausdrücklich anfordert, statt sich vollständig auf das Abfangen zu verlassen.
CPU-Paravirtualisierung ändert einen Gastkernel so, dass er für Operationen, die Hypervisorkontrolle erfordern, Hypercalls ausführt.
Passkey
Ein Passkey ist ein Public-Key-Anmeldenachweis für die an eine Website gebundene Authentifizierung, der auf einem Gerät gespeichert oder sicher zwischen Geräten synchronisiert wird.
Ein synchronisierter Passkey ermöglicht die Anmeldung auf einem anderen Gerät und bezieht zugleich das Plattformkonto in den Schutz der Anmeldeinformationen ein.
Passwort-Hash
Ein Passwort-Hash ist ein Einweg-Prüfwert, der zur Prüfung einer Anmeldung aus einem eingegebenen Passwort und gespeicherten Parametern neu berechnet wird.
Ein gestohlener Passwort-Hash kann anhand von Rateversuchen geprüft werden, ohne ein Passwort durch Entschlüsselung preiszugeben.
Physische Gastadresse
Eine physische Gastadresse bezeichnet Speicher in der physischen Sicht des Gastbetriebssystems und muss in eine reale Maschinenadresse übersetzt werden.
Eine physische Gastadresse von null kann in zwei VMs auf einem Host auf unterschiedliche Maschinenseitenrahmen abgebildet werden.
PID-Namensraum
Ein PID-Namensraum gibt Prozessen eine separate Nummerierungs- und Sichtbarkeitshierarchie mit einem eigenen Lebenszyklus für PID 1.
Ein Prozess kann innerhalb eines PID-Namensraums PID 1 sein, während der Host denselben Prozess mit einer anderen Nummer identifiziert.
pids.max
pids.max ist eine Cgroup-Taskgrenze, die sowohl Prozesse als auch Threads zählt und die Erzeugung über die erlaubte Gesamtzahl hinaus verhindert.
Ein Dienst mit mehreren Threads kann pids.max erreichen, selbst wenn seine Anzahl unterschiedlicher Prozesse klein erscheint.
POSIX-ACL-Maske
Eine POSIX-ACL-Maske begrenzt die effektiven Rechte benannter Benutzereinträge, benannter Gruppeneinträge und des Eintrags der Eigentümergruppe.
Eine POSIX-ACL-Maske mit reinem Leserecht macht den Lese-Schreib-Eintrag eines benannten Benutzers effektiv schreibgeschützt.
Privilegierter Befehl
Ein privilegierter Befehl führt eine geschützte Operation nur mit ausreichenden CPU-Privilegien aus und löst andernfalls einen Trap aus.
Der Versuch einer Anwendung, auf x86 den privilegierten Befehl HLT auszuführen, löst eine Schutzverletzung aus.
Public-Key-Authentifikator
Ein Public-Key-Authentifikator beweist den Besitz eines privaten Schlüssels, indem er eine Herausforderung signiert, die ein Server mit dem öffentlichen Schlüssel prüft.
Ein Public-Key-Authentifikator kann eine Anmeldung abschließen, ohne seinen privaten Signaturschlüssel an den Server zu übertragen.
Pufferüberlauf
Ein Pufferüberlauf ist ein Schreibzugriff über die Schranken eines Puffers hinaus, der benachbarte Daten beschädigen kann, darunter eine gespeicherte Adresse für den Kontrollfluss.
Ein Pufferüberlauf auf dem Stack kann eine Rücksprungadresse ersetzen, obwohl die vorgesehene Operation nur Text kopiert hat.

R

Referenzmonitor
Ein Referenzmonitor ist ein geschützter Mechanismus, der Zugriffe vermittelt, nicht umgangen werden kann und klein genug für eine sorgfältige Prüfung ist.
Der Referenzmonitor prüft eine Abbildungsanfrage; anschließend setzt die Hardware den bereits in der Seitentabelle gewährten Zugriff durch.
Return-Oriented Programming
Return-Oriented Programming erzeugt vom Angreifer gewähltes Verhalten, indem kurze, bereits im ausführbaren Speicher vorhandene Befehlsfolgen verkettet werden.
Return-Oriented Programming kann Bibliotheksbefehle wiederverwenden, ohne eingeschleuste Bytes von einer Datenseite auszuführen.
Rollenbasierte Zugriffskontrolle
Die rollenbasierte Zugriffskontrolle weist Tätigkeitsrollen Berechtigungen zu und gibt Benutzern diese Berechtigungen über Rollenzugehörigkeit.
Die rollenbasierte Zugriffskontrolle ermöglicht bei einem Tätigkeitswechsel, Rollenzugehörigkeiten zu ersetzen, ohne jede einzelne Dateiregel zu bearbeiten.
Rootless-Container
Ein Rootless-Container läuft mit unprivilegierten Hostbefugnissen und bildet seine interne Root-Identität normalerweise über einen Benutzernamensraum ab.
Ein Rootless-Container verringert Hostprivilegien, ist aber weiterhin darauf angewiesen, dass der Hostkernel unsichere Operationen zurückweist.

S

Salt
Ein Salt ist ein Zufallswert pro Passwort, der mit dessen Hash gespeichert wird, um zu verhindern, dass sich Prüfaufwand bei gleichen Passwörtern wiederverwenden lässt.
Unterschiedliche Salts bewirken, dass zwei Konten mit demselben Passwort unterschiedliche Passwort-Hashes speichern.
Schattenseitentabelle
Eine Schattenseitentabelle bildet virtuelle Gastadressen direkt auf Maschinenseitenrahmen ab und wird vom Hypervisor per Software verwaltet.
Eine Schattenseitentabelle muss aktualisiert werden, wenn das Gastbetriebssystem Abbildungen ändert, die die Hardware tatsächlich nutzen wird.
Schutzring
Ein Schutzring ist eine x86-Privilegstufe; Ring 0 ist am stärksten und Ring 3 am wenigsten privilegiert.
Linux platziert Anwendungscode normalerweise in Schutzring 3 und seinen Kernelcode in Schutzring 0.
Seccomp
Seccomp ist eine Linux-Funktion, die die Systemaufrufe eines Prozesses filtert und damit die ihm verfügbaren Kernel-Dienste beschränkt.
Eine Seccomp-Regel für einen Browserprozess zur Darstellung von Webseiten kann Programmstartaufrufe selbst nach dessen Kompromittierung blockieren.
Secure Boot
Secure Boot prüft vertrauenswürdige Signaturen entlang der Bootkette und weist Komponenten zurück, die seine konfigurierten Vertrauensprüfungen nicht bestehen.
Secure Boot kann einen veränderten Bootloader zurückweisen, bevor dieser die Kontrolle über den Rechner erhält.
Seitenfehler
Ein Seitenfehler ist eine Ausnahme aufgrund einer fehlgeschlagenen Seitenübersetzung oder Berechtigungsprüfung, die der Kernel deuten muss.
Ein Seitenfehler bei einer Copy-on-Write-Abbildung kann zu einer privaten Seitenkopie und einer erfolgreichen Wiederholung des Befehls führen.
SELinux-Domäne
Eine SELinux-Domäne ist eine Prozesskennzeichnung, mit der die Regeln zur Typdurchsetzung bestimmen, auf welche Objekttypen der Prozess zugreifen darf.
Eine SELinux-Domäne für einen Webserver kann das Lesen von Webseiten erlauben und zugleich das Lesen von Dateitypen aus Benutzerverzeichnissen verweigern.
Sensitiver Befehl
Ein sensitiver Befehl ändert die Maschinenkonfiguration oder verhält sich abhängig von der Ausführungsprivilegstufe anders.
Ein sensitiver Befehl, der sein Verhalten stillschweigend ändert, kann das Abfangen durch klassisches Trap-and-Emulate unwirksam machen.
Setgid-Verzeichnis
Ein Setgid-Verzeichnis lässt neu erstellte Dateien seine Gruppe erben und hilft einem Team so, gemeinsam genutzte Dateien unter einer Gruppenidentität zu halten.
Ein Setgid-Verzeichnis eines Projekts ordnet neue Dokumente weiterhin der Projektgruppe statt der primären Gruppe des jeweiligen Autors zu.
Setuid
Setuid ist ein Mechanismus für ausführbare Dateien, der ein Programm unter normalen Ausführungsregeln mit der effektiven Benutzeridentität seines Eigentümers startet.
Setuid erlaubt dem Passwort-Hilfsprogramm, eine geschützte Prüfwertdatei zu aktualisieren, während sein Code prüft, welches Konto geändert werden darf.
Sicherheitssubjekt
Ein Sicherheitssubjekt ist eine Einheit, etwa eine Person oder ein Dienstkonto, der Rechte zugewiesen werden und in deren Auftrag Prozesse handeln.
Ein Sicherungsdienst läuft als separates Sicherheitssubjekt, damit seine Dateirechte unabhängig von denen eines menschlichen Benutzers verwaltet werden können.
SMAP
SMAP ist ein x86-Schutzmechanismus, der Datenzugriffe im Supervisormodus auf Benutzerseiten außerhalb ausdrücklich erlaubter Kopiervorgänge begrenzt.
SMAP verlangt, dass Kernel-Kopiercode den für einen geprüften Puffer benötigten Benutzerspeicherzugriff gezielt erlaubt.
SMEP
SMEP ist ein x86-Schutzmechanismus, der verhindert, dass Code im Supervisormodus Befehle auf als benutzerzugänglich markierten Seiten ausführt.
SMEP blockiert, dass ein manipulierter Kernelrücksprung zu angreiferkontrollierten Befehlen auf einer Benutzerseite springt.
Snapshot
Ein Snapshot sichert den Zustand einer VM zur späteren Wiederherstellung; ein Snapshot des laufenden Zustands umfasst neben Festplatten auch Ausführung und Speicher.
Das Wiederherstellen eines vollständigen Snapshots versetzt eine Test-VM in ihren gespeicherten CPU-, Speicher- und Datenträgerzustand zurück.
Socket der Containerlaufzeitumgebung
Ein Socket der Containerlaufzeitumgebung ist eine Schnittstelle zur Steuerung einer Laufzeitumgebung, deren Befugnisse hostweite privilegierte Operationen zugänglich machen können.
Der Zugriff auf einen root gehörenden Socket der Containerlaufzeitumgebung kann den von einer unprivilegierten UID-Zuordnung erwarteten Schutz unwirksam machen.
Speicherüberbuchung
Speicherüberbuchung sagt VMs insgesamt mehr Speicher zu, als der Host besitzt, und verlässt sich darauf, dass ihr aktiver Bedarf nicht gleichzeitig Spitzen erreicht.
Speicherüberbuchung kann zu schlechter Leistung führen, wenn jedes Gastbetriebssystem beginnt, seine volle Zuweisung zu nutzen.
Speicherverwaltungseinheit
Die Speicherverwaltungseinheit übersetzt virtuelle CPU-Adressen und prüft Seitenberechtigungen, bevor sie Speicherzugriffe erlaubt.
Die Speicherverwaltungseinheit blockiert einen Schreibzugriff aus dem Benutzermodus auf eine Seite, die in der Seitentabelle für ausschließlichen Kernelzugriff markiert ist.
Sticky-Bit
Das Sticky-Bit beschränkt das Löschen und Umbenennen in einem Verzeichnis auf Dateieigentümer, den Verzeichniseigentümer oder privilegierte Prozesse.
Das Sticky-Bit verhindert, dass ein gewöhnlicher Benutzer den Eintrag eines anderen Benutzers in einem gemeinsam genutzten temporären Verzeichnis mit Modus 1777 löscht.
Systemaufruf
Ein Systemaufruf ist eine kontrollierte Anfrage eines Benutzerprogramms an den Kernel nach einer Leistung, die Kernelbefugnisse erfordert.
Der Wrapper open() führt einen Systemaufruf aus, damit der Kernel den Zugriff prüfen kann, bevor er einen Dateideskriptor zurückgibt.
Systembestimmte Zugriffskontrolle
Die systembestimmte Zugriffskontrolle setzt vom Administrator festgelegte Regeln unabhängig von den benutzerbestimmten Entscheidungen eines Objekteigentümers durch.
Die systembestimmte Zugriffskontrolle kann einem Webserver einen Lesezugriff auf ein Home-Verzeichnis verweigern, den der gewöhnliche Dateimodus erlaubt.

T

Timerinterrupt
Ein Timerinterrupt ist ein Hardwareereignis, das die CPU-Kontrolle nach einem programmierten Intervall an den Kernel zurückgibt.
Der Timerinterrupt ermöglicht dem Scheduler, einen Prozess zu ersetzen, selbst wenn dieser nie freiwillig die CPU abgibt.
TOCTTOU-Wettlaufsituation
Eine TOCTTOU-Wettlaufsituation entsteht, wenn sich ein geprüftes Objekt oder eine geprüfte Bedingung vor der Verwendung ändert und die frühere Entscheidung nicht mehr anwendbar ist.
Eine TOCTTOU-Wettlaufsituation ermöglicht es einem ersetzten symbolischen Link, ein privilegiertes Hilfsprogramm nach dessen Berechtigungsprüfung umzuleiten.
TOTP
Ein TOTP ist ein kurzlebiger Code, der aus einem gemeinsamen Geheimnis und einem Zeitschritt abgeleitet wird und häufig den Besitz eines Authentifikators nachweist.
Eine gefälschte Anmeldeseite kann ein TOTP an den echten Dienst weiterleiten, solange der Code noch gültig ist.
Trap-and-Emulate
Trap-and-Emulate fängt geschützte Operationen eines Gastbetriebssystems mit verringerten Privilegien ab und wendet ihre Wirkung auf den Zustand der virtuellen Maschine an.
Trap-and-Emulate aktualisiert das virtuelle Interrupt-Flag eines Gastbetriebssystems, ohne ihm zu erlauben, Hostinterrupts abzuschalten.

Ü

Überwachungsprotokoll
Ein Überwachungsprotokoll zeichnet sicherheitsrelevante Ereignisse auf, damit Administratoren Missbrauch erkennen und Geschehenes rekonstruieren können.
Ein geschütztes entferntes Überwachungsprotokoll kann die Aufzeichnung eines privilegierten Befehls erhalten, nachdem ein Angreifer lokale Dateien gelöscht hat.

U

UID-Zuordnung
Eine UID-Zuordnung verbindet einen Bereich von Benutzerkennungen innerhalb eines Namensraums mit einem Bereich außerhalb, anhand zweier Startwerte und einer Länge.
Eine UID-Zuordnung mit dem internen Startwert 0 und dem Hoststartwert 100000 übersetzt die interne Kennung 1000 in die Hostkennung 101000.
umask
Eine umask ist eine Prozesseinstellung, die ausgewählte Berechtigungsbits aus dem bei der Objekterstellung angeforderten Modus löscht.
Bei einer umask von 027 erzeugt die Anforderung 666 eines Programms für eine reguläre Datei den Modus 640 und keine ausführbare Datei.

V

Verschachtelte Seitenverwaltung
Bei der verschachtelten Seitenverwaltung führt die Hardware die Adressübersetzung von virtuellen zu physischen Gastadressen und von physischen Gastadressen zu Maschinenadressen aus.
Verschachtelte Seitenverwaltung erlaubt Änderungen an Gastseitentabellen, ohne dass jede Änderung per Software abgefangen werden muss.
Vertrauenswürdige Rechenbasis
Die vertrauenswürdige Rechenbasis umfasst die Hardware, Firmware und Software, von deren korrekter Funktion die Sicherheit des Systems abhängt.
Eine Schwachstelle in einem vertrauenswürdigen Anmelde-Hilfsprogramm kann die vertrauenswürdige Rechenbasis kompromittieren, selbst wenn der Kernel korrekt ist.
Verzeichnisdurchsuchung
Verzeichnisdurchsuchung ist das Nachschlagen durch ein Verzeichnis, um einen Eintrag zu erreichen, und erfordert die Ausführungsberechtigung für dieses Verzeichnis.
Verzeichnisdurchsuchung kann das Öffnen eines bekannten Namens erlauben, selbst wenn die Leseberechtigung das Auflisten aller Namen nicht erlaubt.
Veth-Paar
Ein Veth-Paar besteht aus zwei verbundenen virtuellen Netzwerkschnittstellen, die einen Containernetzwerknamensraum mit seinem Host verbinden können.
Ein Ende eines Veth-Paars kann innerhalb eines Containers und das andere an einer Bridge im Netzwerkstack des Hosts liegen.
Virtio
Virtio ist eine paravirtuelle Geräteschnittstelle, die gastbewusste Treiber und gemeinsam genutzte Warteschlangen nutzt, um den Aufwand der Gerätebehandlung zu verringern.
Ein Virtio-Treiber reiht mehrere Speicheranfragen ein, bevor er das Backend benachrichtigt, und verringert so wiederholte Übergänge.
Virtuelle CPU
Eine virtuelle CPU ist ein für das Gastbetriebssystem sichtbarer Prozessor, dessen Ausführungszustand der Hypervisor auf einem physischen Prozessor einplant.
Eine untätige virtuelle CPU kann auf ihren virtuellen Interrupt warten, während der physische Kern ein anderes Gastbetriebssystem ausführt.
Virtuelle Maschine
Eine virtuelle Maschine stellt einem Gastbetriebssystem einen vollständigen virtuellen Computer bereit, während ein Hypervisor reale Ressourcen kontrolliert.
Eine virtuelle Maschine kann einen Windows-Kernel auf kompatibler Hardware ausführen, die von einem Linux-basierten Host verwaltet wird.
VM-Ausbruch
Ein VM-Ausbruch überwindet die Gastgrenze durch eine Schwachstelle im Hypervisor oder in einem zugänglichen virtuellen Gerät und erreicht Hostbefugnisse.
Ein fehlerhaftes emuliertes Gerät kann einen VM-Ausbruch ermöglichen, selbst wenn die gewöhnlichen Seitenabbildungen des Gastbetriebssystems getrennt sind.
VM-Entry
Ein VM-Entry stellt die Ausführung des Gastbetriebssystems unter Hardwarevirtualisierung wieder her, nachdem der Hypervisor dessen Zustand ausgewählt und vorbereitet hat.
Nach der Behandlung einer Gerätebenachrichtigung führt der Hypervisor einen VM-Entry aus, um das betroffene Gastbetriebssystem fortzusetzen.
VM-Exit
Ein VM-Exit ist ein hardwaregesteuerter Übergang von der Ausführung des Gastbetriebssystems zum Hypervisor nach einem zum Abfangen konfigurierten Ereignis.
Ein VM-Exit bei HLT des Gastbetriebssystems erlaubt dem Hypervisor, die untätige vCPU nicht weiter einzuplanen und eine andere Arbeitslast auszuführen.

W

W^X
W^X ist eine Speicherstrategie, die verbietet, dass eine Seite gleichzeitig beschreibbar und ausführbar ist.
Unter W^X schreibt ein Just-in-Time-Compiler zuerst Code und ändert die Berechtigungen, bevor er ihn ausführt.
Wörterbuchangriff
Ein Wörterbuchangriff errät wahrscheinliche Passwörter, darunter geleakte Passwörter und vorhersehbare Varianten, vor weniger wahrscheinlichen Zeichenfolgen.
Ein Wörterbuchangriff kann „Winter2027!“ trotz seiner Mischung aus Buchstaben, Ziffern und Satzzeichen früh finden.

Z

Zugriffskontrollliste
Eine Zugriffskontrollliste speichert die einem Objekt zugeordneten Subjekte und Rechte und entspricht einer Spalte der Zugriffsmatrix.
Die Zugriffskontrollliste eines Berichts kann einem Konto Schreibzugriff und einem zweiten Konto Lesezugriff geben.
Zugriffsmatrix
Eine Zugriffsmatrix stellt erlaubte Operationen mit einem Subjekt pro Zeile, einem Objekt pro Spalte und Rechten in jeder Zelle dar.
Eine Zugriffsmatrix kann zeigen, dass ein Sicherungsprozess einen Bericht lesen darf, aber kein Recht zur Nutzung eines Druckers hat.
Zugriffssteuerungseintrag
Ein Zugriffssteuerungseintrag ist eine einzelne Windows-ACL-Regel, die eine SID und die zu erlaubenden, zu verweigernden oder zu überwachenden Rechte nennt.
Ein Zugriffssteuerungseintrag, der einer zutreffenden Gruppe das Schreiben verweigert, kann dazu führen, dass eine Anfrage mit Schreibzugriff abgelehnt wird.
Zugriffstoken
Ein Zugriffstoken ist ein Windows-Anmeldeinformationsobjekt mit Benutzer- und Gruppen-SIDs sowie Privilegien, die bei Zugriffsprüfungen genutzt werden.
UAC startet ein gewöhnliches Programm eines Administrators mit einem gefilterten Zugriffstoken, bevor eine Rechteerhöhung genehmigt wird.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten