Im Interface der asynchronen Ein-/Ausgabe io_uring, das vom Linux-Kernel bereitgestellt wird, wurde eine Sicherheitsanfälligkeit (CVE-2024-0582) entdeckt, die es einem nicht priviligierten Benutzer ermöglicht, Root-Rechte im System zu erlangen. Um die Schwachstelle auszunutzen, ist lediglich normaler lokaler Zugriff auf das System erforderlich, ohne dass Manipulationen an Namespaces notwendig sind. Derzeit ist ein funktionierender Exploit öffentlich verfügbar, und eine zweite Ausnutzungstechnik wurde ausführlich beschrieben.
Die Schwachstelle wird durch den Zugriff auf einen bereits freigegebenen Speicherblock (use-after-free) im io_uring-Subsystem verursacht, der beim Registrieren und Freigeben eines mit dem Flag IORING_REGISTER_PBUF_RING erstellten Ringspeichers auftritt. Bei der Anwendung der mmap()-Operation auf den Puffer bleibt dieser im Adressraum des Benutzers nach der Freigabeoperation (IORING_UNREGISTER_PBUF_RING) abgebildet. Diese Besonderheit ermöglicht es dem Angreifer, Daten in die Speicherseiten zu lesen und zu schreiben, die vom Kernel-Speichermanagementsystem zurückgegeben werden.
Das Problem tritt ab der Kernelversion 6.4 auf und wurde in den Versionen 6.7 und 6.6.5 sowie im Kernelpaket 6.5.0-21, das für Ubuntu 22.04 und 23.10 vorbereitet wurde, behoben. Bemerkenswert ist, dass das Problem im Hauptkern im Dezember 2023 behoben wurde, das Google-Zero-Projekt Zugang zur Sicherheitsmeldung erhielt am 8. Januar, und das Paket mit dem gefixeten Kernel 6.5 für Ubuntu wurde erst am 22. Februar 2024 erstellt. In anderen Distributionen kann man die Behebung und die Verwundbarkeit auf den Seiten verfolgen: Debian, Gentoo, RHEL, SUSE, Fedora, Arch.
Der erste Exploit manipuliert die Erstellung einer großen Anzahl von vom Angreifer kontrollierten Seiten im Speicher, um das Layout des Speichers im Kernel zu bestimmen und auf benachbarte physische Speicherseiten zuzugreifen, indem als Leuchtfeuer der Inhalt bestimmter Strukturen von Netzwerksockets verwendet wird. Zur Ausführung des Codes im Exploit wird ein „Gadget“ (eine Folge vorhandener Anweisungen im Kernel) eingesetzt, das zur Ausführung der Funktion call_usermodehelper_exec führt, die dazu dient, Prozesse im Benutzermodus aus dem Kernel heraus zu starten.
Der zweite Exploit basiert darauf, dass beim Erschöpfen aller Slab-Blöcke im Cache (z. B. beim wiederholten Öffnen einer Datei) freie Speicherseiten, auf die der Angreifer Zugriff hat, vom Speichermanagementsystem verwendet werden, um einen neuen Slab-Block zu erstellen. Alle neuen Dateistrukturen werden in diesem Block abgelegt. Folglich gelangen bestimmte Dateistrukturen auf die Speicherseiten, die der Angreifer lesen und schreiben kann. Der Exploit reduziert sich darauf, den notwendigen Datei im Datei-Cache zu platzieren und das Feld f_mode in den zugehörigen Dateistrukturen zu ändern, das die Zugriffsrechte definiert, wodurch der Zugriff auf eine benötigte Systemdatei wie /etc/passwd zum Schreiben möglich wird.
Quelle: opennet.ru
