← Alle Beiträge

OpenBSD root exploit chain durch September-Patches behoben

OpenBSD root exploit chain durch September-Patches behoben

Der von der Sicherheitsfirma Calif demonstrierte OpenBSD root exploit kann einem lokalen Benutzer unter OpenBSD 7.9 root verschaffen, also die höchste administrative Kontrolle über das Betriebssystem. Das proof-of-concept verkettet einen integer overflow in shared memory mit einer weiteren Schwachstelle im kernel, dem Kern des Betriebssystems. Zusammen umgehen die Schwachstellen OpenBSDs Randomisierung der kernel-Adressen sowie die Prozessorschutzmechanismen SMAP and SMEP, die verhindern sollen, dass der kernel unzulässig auf benutzergesteuerten Speicher zugreift oder darin enthaltenen Code ausführt.

OpenBSD behob die beiden zugrunde liegenden Probleme mit separaten Updates im September. Errata 018, veröffentlicht am 14. September, korrigierte den integer overflow in der Funktion shmat(4), mit der shared memory eingebunden wird, sodass Prozesse auf denselben Speicherbereich zugreifen können. OpenBSD stufte dieses Update als Zuverlässigkeitskorrektur und nicht als Sicherheitskorrektur ein. Errata 026 folgte am 30. September und behob den use-after-free bei der Referenzzählung, einen Zustand, bei dem der kernel Speicher weiterverwendet, nachdem dieser freigegeben wurde. Dieses Update wurde als Sicherheitskorrektur eingestuft.

Beide Korrekturen sind über syspatch, das Patch-Werkzeug von OpenBSD, verfügbar und gelten für alle unterstützten Hardwarearchitekturen. OpenBSD 7.8 erhielt ebenfalls die Korrektur für den integer overflow. Zum Zeitpunkt der Veröffentlichung war keiner der beiden Schwachstellen eine CVE-Kennung zugewiesen worden, und es gab keine Hinweise darauf, dass Angreifer sie ausgenutzt hatten. Calif erklärte, die Schwachstellen bereits Anfang dieses Jahres an OpenBSD gemeldet und nach Bereitstellung der Patches eine detaillierte technische Analyse sowie den vollständigen proof-of-concept-Code auf GitHub veröffentlicht zu haben.

Die erste Stufe zielt auf shm_nattch, den Zähler, der erfasst, wie viele Prozesse ein shared-memory-Segment eingebunden haben. Er wird als vorzeichenbehafteter 16-Bit-Short-Integer mit einem Maximalwert von 32.767 gespeichert. Calif führte dieses Design auf ursprünglichen BSD-Quellcode aus dem Jahr 1988 zurück; OpenBSD übernahm den Typ, ohne ihn zu vergrößern. Der Exploit bindet 127 shared-memory-Segmente ein und erstellt 259 Prozesse. Dadurch wird der Zähler über seinen Grenzwert hinaus erhöht und springt auf den negativen Wert -32.643 um.

Eine race condition, bei der das Ergebnis vom zeitlichen Ablauf gleichzeitiger Vorgänge abhängt, verwandelt den beschädigten Zähler anschließend in einen use-after-free. Der kernel gibt Speicher frei, obwohl andere Prozesse ihn weiterhin verwenden. Ein separater out-of-bounds write, bei dem Daten außerhalb des ihnen zugewiesenen Speicherbereichs geschrieben werden, verändert Zähler, die mit Multicast-Netzwerkmitgliedschaften verknüpft sind. Wenn der betroffene socket geschlossen wird, verändern nachfolgende Verringerungen der Zähler page-table entries, also die Einträge, die steuern, wie Speicher abgebildet wird und wie darauf zugegriffen werden kann.

Durch diese Änderungen wird ein Mapping von Benutzerspeicher im Supervisor-Modus zugänglich, wodurch Supervisor Mode Access Prevention (SMAP) und Supervisor Mode Execution Prevention (SMEP) umgangen werden. Der Exploit kann anschließend an einer vorhersehbaren Stelle im kernel einen function pointer ersetzen, also eine gespeicherte Adresse, die dem System mitteilt, welcher Code ausgeführt werden soll, und eigenen Code mit root-Rechten ausführen. Da es sich um eine local privilege escalation handelt, eröffnet sie für sich genommen keinen Remote-Zugangsweg zu einem System. Relevant wird sie, wenn jemand bereits Code ausführen oder ein Konto auf einem ungepatchten OpenBSD-Host verwenden kann.

OpenBSDs KARL-Mechanismus verknüpft den kernel beim Booten neu, um die Positionen von Funktionen und Daten zu verändern. Calif stellte fest, dass die memory allocators, die kernel-Speicher zuweisen, weiterhin deterministisch arbeiten. Weder der early boot allocator noch der best-fit allocator randomisiert seine Basisadresse. Dadurch erscheinen Strukturen, die früh während des Systemstarts erstellt werden, einschließlich der function pointers der Handler für die Netzwerkschnittstellen lo0 und enc0, nach wiederholten Neustarts auf derselben Hardware an denselben Adressen. Die demonstrierte exploit chain benötigt daher nicht zuerst eine information-disclosure-Schwachstelle, um kernel-Adressen offenzulegen.

Über die Installation der beiden Errata hinaus schlug Calif vier umfassendere Hardening-Maßnahmen vor: safe-unlinking-Prüfungen für verkettete Listen des kernel, wie sie bereits von FreeBSD und NetBSD verwendet werden; die Randomisierung des selbstreferenziellen page-table-Mappings; die Ergänzung der kernel-Speicherzuweisung um Randomisierung; sowie compilerbasierte bounds checks, um Speicherzugriffe außerhalb der zulässigen Grenzen zu erkennen. Dabei handelt es sich um vorgeschlagene Schutzmaßnahmen und nicht um Korrekturen, die als bereits in OpenBSD vorhanden beschrieben wurden.

Für Hostinganbieter und Unternehmen, die OpenBSD-Infrastruktur betreiben, besteht die unmittelbare Maßnahme darin, syspatch zu verwenden und zu bestätigen, dass die jeweils geltenden September-Korrekturen auf jedem betroffenen System installiert sind. Administratoren sollten außerdem prüfen, welche Benutzer und Dienste lokalen Code ausführen dürfen, da der veröffentlichte Exploit lokalen Zugriff benötigt, bevor er Rechte erhöhen kann. Organisationen, die die Sicherheit OpenBSD-basierter Umgebungen überprüfen, können AEU-I für sicherheitsorientierte IT, Infrastruktur und Beratung nutzen.

Auch verfügbar in: EnglishItalianoShqip