Racebedingung im Linux-Kernel-Garbage Collector, die zu einer Rechteausweitung führen kann

Jann Horn vom Google Project Zero-Team, der einst die Schwachstellen Spectre und Meltdown identifizierte, veröffentlichte eine Technik zum Ausnutzen einer Schwachstelle (CVE-2021-4083) im Linux-Kernel-Garbage Collector. Die Sicherheitslücke ist auf eine Race-Bedingung beim Bereinigen von Dateideskriptoren auf Unix-Sockets zurückzuführen und ermöglicht möglicherweise einem lokalen unprivilegierten Benutzer, seinen Code auf Kernel-Ebene auszuführen.

Das Problem ist interessant, da das Zeitfenster, in dem die Race Condition auftritt, als zu klein eingeschätzt wurde, um echte Exploits zu erstellen. Der Autor der Studie zeigte jedoch, dass selbst solche zunächst skeptischen Schwachstellen zur Quelle echter Angriffe werden können, wenn der Exploit-Ersteller dies getan hat die nötigen Fähigkeiten und Zeit. Yann Horn zeigte, wie man mit Hilfe filigraner Manipulationen die Race Condition, die beim gleichzeitigen Aufruf der Funktionen close() und fget() auftritt, in eine vollständig ausnutzbare Use-After-Free-Schwachstelle reduzieren und Zugriff auf bereits freigegebene Daten erhalten kann Struktur innerhalb des Kernels.

Während des Schließens eines Dateideskriptors bei gleichzeitigem Aufruf von close() und fget() tritt eine Race-Bedingung auf. Der Aufruf von close() kann vor der Ausführung von fget() erfolgen, was den Garbage Collector verwirrt, da die Dateistruktur laut Refcount keine externen Referenzen hat, sondern an den Dateideskriptor gebunden bleibt, d. h. Der Garbage Collector geht davon aus, dass er exklusiven Zugriff auf die Struktur hat, tatsächlich zeigt der verbleibende Eintrag in der Dateideskriptortabelle jedoch für kurze Zeit immer noch auf die freigegebene Struktur.

Um die Wahrscheinlichkeit, in einen Race Condition zu geraten, zu erhöhen, kamen mehrere Tricks zum Einsatz, die es ermöglichten, bei der Einführung systemspezifischer Optimierungen die Erfolgswahrscheinlichkeit der Ausnutzung auf 30 % zu erhöhen. Um beispielsweise die Zeit für den Zugriff auf eine Struktur mit Dateideskriptoren um mehrere hundert Nanosekunden zu erhöhen, wurden Daten aus dem Prozessor-Cache verdrängt, indem der Cache mit Aktivität auf einem anderen CPU-Kern übersät wurde, was es ermöglichte, die Struktur aus dem Speicher statt aus dem Speicher abzurufen der schnelle CPU-Cache.

Das zweite wichtige Merkmal war die Verwendung von Interrupts, die von einem Hardware-Timer generiert wurden, um die Race-Condition-Zeit zu verlängern. Der Zeitpunkt wurde so gewählt, dass der Interrupt-Handler bei Auftreten einer Race-Bedingung ausgelöst wird und die Ausführung des Codes für einige Zeit unterbricht. Um die Rückkehr der Kontrolle weiter zu verzögern, wurden mithilfe von Epoll etwa 50 Einträge in der Warteschlange generiert, was ein Durchsuchen des Interrupt-Handlers erforderte.

Die Technik zur Ausnutzung der Schwachstelle wurde nach einer 90-tägigen Geheimhaltungsfrist offengelegt. Das Problem tritt seit Kernel 2.6.32 auf und wurde Anfang Dezember behoben. Der Fix war im Kernel 5.16 enthalten und wurde auch auf die LTS-Zweige des Kernels und die in den Distributionen enthaltenen Kernelpakete übertragen. Bemerkenswert ist, dass die Schwachstelle bei der Analyse eines ähnlichen Problems CVE-2021-0920 identifiziert wurde, das sich im Garbage Collector bei der Verarbeitung des MSG_PEEK-Flags manifestiert.

Source: opennet.ru

Kommentar hinzufügen