Im Asynchronous Input/Output-Interface io_uring, das vom Linux-Kernel bereitgestellt wird, wurde eine Schwachstelle (CVE-2024-0582) entdeckt, die es einem nicht privilegierten Benutzer ermöglicht, Root-Rechte im System zu erlangen. Um die Schwachstelle auszunutzen, ist lediglich einfacher lokaler Zugriff auf das System erforderlich, ohne dass Manipulationen an Namensräumen nötig sind. Derzeit ist ein funktionierender Exploit öffentlich verfügbar, und eine zweite Ausnutzungstechnik wurde detailliert 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 Ringpuffers, der mit dem Flag IORING_REGISTER_PBUF_RING erstellt wurde, auftritt. Bei der Anwendung einer mmap()-Operation auf den Puffer bleibt dieser nach der Freigabeoperation (IORING_UNREGISTER_PBUF_RING) im Benutzeradressraum sichtbar. Diese Besonderheit ermöglicht es einem Angreifer, Daten in die von der Speicherverwaltung des Kernels zurückgegebenen Seiten zu lesen und zu schreiben.
Das Problem tritt ab der Kernel-Version 6.4 auf und wurde in den Versionen 6.7 und 6.6.5 sowie im Paket mit dem Kernel 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 am 8. Januar Zugang zu einem Fehlerbericht über die Schwachstelle gewährte, und das Paket mit dem behobenen Kernel 6.5 für Ubuntu erst am 22. Februar 2024 erstellt wurde. Bei anderen Distributionen kann man die Behebung und Verwundbarkeit auf Seiten wie Debian, Gentoo, RHEL, SUSE, Fedora, Arch nachverfolgen.
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 Seiten im Speicher zuzugreifen, indem der Inhalt bestimmter, auf eine bestimmte Weise ausgefüllter Netzwerk-Socket-Strukturen als Wegweiser verwendet wird. Zum Ausführen des Codes im Exploit wird ein 'Gadget' verwendet (eine Folge von im Kernel vorhandenen Anweisungen), die zur Ausführung der Funktion call_usermodehelper_exec führt, die dafür vorgesehen ist, Prozesse im Benutzermodus aus dem Kernel heraus zu starten.
Die zweite Exploit basiert darauf, dass, wenn alle slab-Blöcke im Cache erschöpft sind (zum Beispiel bei mehrfacher Öffnung einer Datei), die freien Speicherseiten, auf die der Angreifer zugreifen kann, von dem Speichermanagement-System verwendet werden, um einen neuen slab-Block zu erstellen, und alle neuen Dateistrukturen in diesem Block platziert werden. Entsprechend gelangen einige Dateistrukturen auf die Speicherseiten, die vom Angreifer gelesen und beschrieben werden können. Der Exploit reduziert sich darauf, den gewünschten Dateizugriff im Dateicache zu organisieren und das Feld f_mode in den dazugehörigen Dateistrukturen zu ersetzen, das die Zugriffsrechte definiert, wodurch die erforderliche Systemdatei, wie z.B. /etc/passwd, zum Schreiben verfügbar gemacht wird.
Quelle: opennet.ru
