Sicherheitsforscher von Calif haben einen Proof-of-Concept-Exploit veröffentlicht, der laut eigener Aussage einem lokalen Benutzer Root-Rechte auf OpenBSD 7.9 verschafft. Die Kette kombiniert einen Integer-Überlauf im Shared Memory, eine Use-after-free-Schwachstelle beim Referenzzählen und einen Schreibzugriff außerhalb der Grenzen im Kernel.
Laut dem Bericht von The Hacker News zu Califs Forschung hat die Firma die Schwachstellen „früher in diesem Jahr“ an OpenBSD gemeldet und anschließend eine detaillierte technische Analyse sowie den vollständigen PoC-Code auf GitHub veröffentlicht.
Der beschriebene Angriff setzt lokalen Zugriff voraus. Im Bericht gibt es keinen Hinweis darauf, dass die Schwachstellen in realen Angriffen ausgenutzt wurden. Zum Zeitpunkt der Veröffentlichung hatte keine der beiden Schwachstellen eine CVE-Kennung erhalten.
Eine 16-Bit-Zählvariable eröffnet die Exploit-Kette
Das Grundproblem liegt in der Attach-Funktion von shmat(4), die einen Prozess mit einem Shared-Memory-Segment verbindet. OpenBSD erfasst die Zahl der Anhänge über shm_nattch, einen vorzeichenbehafteten 16-Bit-Short-Integer mit einem Maximalwert von 32.767.
Calif führte diesen Datentyp auf BSD-Quellcode aus dem Jahr 1988 zurück. Da das Feld nicht erweitert wurde, kann eine ausreichend starke Erhöhung der Anzahl der Anhänge dazu führen, dass der Wert seine positive Obergrenze überschreitet und in einen negativen Wert umspringt.
Im PoC der Forscher werden 127 Shared-Memory-Segmente abgebildet und 259 Prozesse geforkt. Dieser Ablauf treibt den Zähler laut Bericht über sein Maximum hinaus und setzt seinen Wert auf −32.643.
Der Überlauf allein verschafft keine erhöhten Rechte. Calif zufolge führt eine Race Condition nach dem Umspringen zu fehlerhaftem Referenzzählen und einem Use-after-free: Der Kernel gibt Speicher frei, den andere Prozesse weiterhin referenzieren.
Ein separater Schreibzugriff außerhalb der Grenzen verfälscht anschließend die Zähler für Multicast-Mitgliedschaften im Kernel. Wenn der betreffende Socket geschlossen wird, verändern Dekrementierungen dieser Zähler Seitentabelleneinträge. Laut den Forschern wird dadurch ein Benutzerspeicher-Mapping im Supervisor-Modus zugänglich.
Die letzte Stufe überschreibt einen Funktionszeiger an einer vorhersehbaren Kernel-Adresse, sodass attackergesteuerter Code mit Kernel-Rechten ausgeführt werden kann. Calif zufolge setzt die Kette keine separate Schwachstelle zur Informationsoffenlegung voraus.
Deterministische Speicherzuweisung schwächt die Kernel-Randomisierung
Der Exploit stützt sich außerdem auf die vorhersagbare Platzierung von Kernel-Strukturen. Laut Bericht randomisieren die Boot-Zeit-Allokatoren und der Best-Fit-Allokator von OpenBSD ihre Basisadressen nicht. Frühe Strukturen können daher nach Neustarts auf derselben Hardware dieselben Positionen einnehmen.
Die relevanten Funktionszeiger sind mit Handlern für die Netzwerkschnittstellen lo0 und enc0 verknüpft.
Forscher Andrew Griffiths erklärte, dass KARL den Kernel neu verlinkt, um die Positionen von Funktionen und Daten zu verändern, die Allokatoren selbst aber deterministisch bleiben. Calif behauptet, die Kette umgehe KARL, SMAP und SMEP.
Diese Befunde betreffen unterschiedliche Schutzebenen: Die Randomisierung des Kernel-Images randomisiert nicht zwingend jedes danach zugewiesene Objekt. Ein vorhersagbares Allokatorverhalten kann dem Exploit deshalb stabile Ziele liefern, selbst wenn Kernel-Code und -Daten neu verlinkt wurden.
Korrekturen sind über syspatch verfügbar
Der Integer-Überlauf im Shared Memory wurde mit Errata 018 behoben, ausgeliefert am 14. September. Laut Bericht stufte OpenBSD dieses Update als Zuverlässigkeitskorrektur und nicht als Sicherheitsfix ein. Es wurde außerdem an OpenBSD 7.8 ausgeliefert.
Der Use-after-free wurde mit Errata 026 korrigiert, ausgeliefert am 30. September und als Sicherheitsfix eingestuft. Beide Updates sind über syspatch verfügbar, gelten für alle Architekturen und sollten dort installiert werden, wo sie zutreffen.
Administratoren mit OpenBSD 7.9 sollten prüfen, ob sowohl Errata 018 als auch 026 installiert sind, statt das erste Update lediglich als betriebliche Stabilitätskorrektur zu behandeln. OpenBSD-7.8-Nutzer sollten sicherstellen, dass sie die für ihre Version relevanten syspatch-Updates erhalten haben, einschließlich des für diesen Release dokumentierten Errata-018-Fixes.
Calif schlug außerdem vier breitere Schutzmaßnahmen vor: Safe Unlinking für Kernel-Linked-Lists, Randomisierung der selbstreferenziellen Seitentabellen-Zuordnung, Randomisierung des Kernel-Allokators und compilerunterstützte Prüfung der Grenzen. Dabei handelt es sich um Härtungsempfehlungen, nicht um Fixes, die laut Bericht mit den beiden Errata ausgeliefert wurden.




