HeadlinesBriefing HeadlinesBriefing.com

37 Jahre alter OpenBSD-Kernelbug: Root-Zugriff

Hacker News •
×

Calif, eine Sicherheitsforschungsfirma, hat Details zu einer Schwachstelle in OpenBSD veröffentlicht, die rund 37 Jahre zurück bis zu den ursprünglichen BSD-Quellen reicht. Ein Zähler für Shared-Memory-Anhänge war als vorzeichenbehafteter 16-Bit-Short definiert. Wiederholtes Forken eines Prozesses mit Shared-Memory-Anhangseinträgen konnte den Zähler über seinen Maximalwert von 32.767 hinaus treiben, sodass er in einen negativen Wert umschlug. Dieser Integer-Überlauf konnte über eine Race Condition zu einem Use-after-free führen. In Kombination mit einem separaten Out-of-bounds-Schreibzugriff im Kernel ermöglichte er eine lokale Rechteausweitung zu Root. Die Probleme wurden in den Errata 026 und 018 behoben.

Die Forscher beschrieben einen Exploit-Pfad, der lokalen Root-Zugriff auf OpenBSD mit aktiviertem KARL, SMAP und SMEP erreichte, ohne eine Schwachstelle zur Informationsoffenlegung zu nutzen. Die Methode umfasste das Mappen von 127 System-V-Shared-Memory-Segmenten, deren Unmapping und das Forken von 259 Prozessen, um den Anhangszähler umschlagen zu lassen. Anschließend wurden Heap-Grooming und eine Race Condition genutzt, um Allokationen auszurichten, eine Multicast-Struktur zu korrumpieren und schließlich durch Überschreiben eines vorhersagbaren Kernel-Zeigers Codeausführung im Kernel zu erlangen.

Der Exploit beruhte auf einem Write-what-where-Primitive: Der Schreibvorgang stammte aus einer TAILQ_REMOVE-Operation, das Ziel war Userland-Speicher, der für den Supervisor-Modus zugänglich gemacht wurde, und der Ort war ein vorhersagbarer Kernel-Zeiger. KARL in OpenBSD randomisiert Funktions- und Datenadressen, doch die Speicherallokatoren des Kernels bleiben deterministisch, weshalb bestimmte frühe Boot-Allokationen verlässliche Ziele wurden.

Um ähnliche Angriffe zu erschweren, schlagen die Autoren Maßnahmen wie Safe-Unlinking vor. Dabei werden die Invarianten doppelt verketteter Listen vor dem Unlink-Schreibvorgang geprüft, und bei einer Verletzung wird über abort() oder panic() abgebrochen. Calif erklärte, dass man Schwachstellen regelmäßig an Open-Source-Projekte melde, oft zusammen mit vorgeschlagenen Patches.

Quelle: Hacker News · Zusammengefasst von HeadlinesBriefing