Hierbei handelt es sich um eine sehr spezielle Art von Exploit, der alle Arten von Software heimsucht.

Use-After-Free (UAF) ist eine primitive Sicherheitslücke im Zusammenhang mit Speicherbeschädigung, die weiterhin eine erhebliche Bedrohung für alle Arten von Software darstellt, von Betriebssystemen bis hin zu Anwendungssoftware. Diese kritische Sicherheitslücke tritt auf, wenn eine Anwendungskomponente versucht, auf Daten in einer bereits freigegebenen Speicheradresse zuzugreifen, daher der Name „Use-after-free“.

UAF-Schwachstellen können zur potenziellen Ausnutzung von Software oder sogar zur Kompromittierung des Systems führen. Hier erfahren Sie, was die UAF-Schwachstelle ist, warum sie auftritt und wie Sie Ihre Software vor einer UAF-Schwachstelle schützen können.

Was ist die Use-After-Free (UAF)-Schwachstelle?

Bevor wir uns mit der Use-After-Free-Schwachstelle befassen, gehen wir einen Schritt zurück und verstehen einige Grundlagen der Speicherverwaltung. Wenn ein Programm ausgeführt wird, werden seine Daten und sein Code in den Speicher geladen.

Bei der Speicherverwaltung handelt es sich um den Prozess, bei dem es darum geht, Daten und Code im Speicher optimal zu speichern (Speicherzuweisung genannt) und zu entfernen (Speicherfreigabe genannt). Die beiden primären Speichersegmente, in denen Programmdaten gespeichert werden, sind der Stapel und der Heap.

Programmen kann Speicherplatz statisch auf dem Stapel und dynamisch auf dem Heap zugewiesen werden. Eine Use-After-Free-Schwachstelle entsteht, wenn Programmierer die dynamische Speicherzuweisung und -freigabe in ihren Programmen nicht ordnungsgemäß verwalten. Dies bedeutet, dass es sich bei der UAF-Schwachstellenklasse um eine Art Heap-Ausnutzung handelt. Um diese Schwachstelle besser zu verstehen, ist es hilfreich, ein umfassendes Verständnis davon zu haben wie Zeiger in der Programmierung funktionieren.

Use-After-Free (UAF) ist, wie der Name schon sagt, eine Art primitiver Speicherbeschädigungsanfälligkeit, die auftritt, wenn ein Objekt bereits vorhanden ist Auf freigegebene Dateien aus dem Speicher wird erneut zugegriffen, was zu Abstürzen oder unbeabsichtigten Folgen wie Speicherlecks, Escalation of Privilege (EOP) oder willkürlichem Code führt Ausführung. Lassen Sie uns lernen, wie dieser Zustand überhaupt auftritt und wie er ausgenutzt wird.

Wie wird Use-After-Free (UAF) ausgenutzt?

Wie der Name schon sagt, handelt es sich bei „Use-After-Free“ (UAF) um eine primitive Sicherheitsanfälligkeit bezüglich Speicherbeschädigung, die auftritt, wenn ein Programm weiterhin auf freigegebene Speicherbereiche zugreift. Schauen wir uns einen Beispielcode an:

#enthalten <stdio.H>
#enthalten <stdlib.H>

inthauptsächlich(){
int *MUO = malloc (sizeof(int));
*MUO = 69420;
printf(„Wert: %d\n“, *MUO);
kostenlos (MUO);
printf(„Wert?: %d\n“, *MUO);
zurückkehren0;
}

Konnte die Schwachstelle erkannt werden? Wie Sie in diesem Code sehen können, ist die MUO Der Zeiger wird mithilfe von aus dem Speicher freigegeben frei() Funktion, wird jedoch in der nächsten Zeile erneut mit aufgerufen printf() Funktion. Dies führt zu unerwartetem Programmverhalten und je nachdem, wo die Schwachstelle in der Software vorhanden ist, kann sie ausgenutzt werden, um eine Rechteausweitung und Speicherlecks zu erreichen.

Wie lässt sich die Nutzung nach dem kostenlosen Gebrauch eindämmen?

UAF entsteht aufgrund von Fehlern bei der Programmierung einer Anwendung. Sie können einige Vorsichtsmaßnahmen treffen, um Use-After-Free-Schwachstellen in Ihrer Software zu vermeiden.

Hier sind einige Best Practices, die Sie anwenden können, um Schwachstellen durch Speicherbeschädigung in Ihrer Software zu minimieren:

  • Verwendung speichersicherer Programmiersprachen wie Rust mit integrierten Mechanismen zur Vermeidung primitiver Speicherbeschädigungslücken wie UAF, Pufferüberläufe usw. Wenn Sie Programmiersprachen wie C/C++ verwenden, ist die Wahrscheinlichkeit größer, dass Sie Speicherfehler in Ihren Code einführen. Aus dem gleichen Grund migrieren sogar Betriebssysteme wie Windows und Linux langsam zu Rust. Sie sollten auch darüber nachdenken etwas über Rust lernen wenn Sie Low-Level-Programme erstellen.
  • Neben der Verwendung einer speichersicheren Sprache wird empfohlen, dass Sie Best Practices befolgen, wie z. B. das Setzen eines Zeigers auf den NULL-Wert nach der Freigabe, um die Einführung einer Use-After-Free-Schwachstelle zu vermeiden.
  • Sie können auch Techniken wie One Time Allocation (OTA) implementieren, die Angreifer daran hindern, auf freigegebenen Speicher zuzugreifen Objekte und eine strenge Objektlebenszyklusrichtlinie, die dabei hilft, den Überblick über jedes zugewiesene Speicherobjekt zu behalten freigegeben. Beachten Sie jedoch, dass diese Implementierungen den Speicher- und Leistungsaufwand erhöhen können.

Beispiele aus der Praxis für Use-After-Free (UAF)-Schwachstellen

Die Use-After-Free (UAF)-Schwachstelle wurde in verschiedenen realen Szenarien entdeckt und ausgenutzt, von Webbrowsern über den Android-Kernel bis hin zu alltäglichen Anwendungen. Dies zeigt die Notwendigkeit proaktiver Sicherheitsmaßnahmen. Einige reale Beispiele für UAF sind:

  • Internetbrowser: UAF-Schwachstellen in Webbrowsern wurden ausgenutzt, um beliebigen Code auszuführen, die Privatsphäre der Benutzer zu gefährden und Remote-Codeausführungsangriffe auszuführen. Ein aktuelles Beispiel wäre CVE-2021-38008, das eine UAF-Schwachstelle in Google Chrome ausnutzte und es Bedrohungsakteuren ermöglichte, beliebigen Code aus der Ferne auf dem Computer des Opfers auszuführen.
  • Betriebssysteme: UAF-Schwachstellen in Windows-/Linux-/Android-Kerneln haben es Angreifern ermöglicht, erhöhte Berechtigungen zu erlangen, Sicherheitsmechanismen zu umgehen und Persistenz zu erlangen. Es wurden zahlreiche UAF-Schwachstellen gefunden, die auch heute noch in Betriebssystemkerneln zu finden sind. Zum Zeitpunkt der Erstellung dieses Artikels wurde CVE-2023-3269, eine weitere UAF-Schwachstelle im Linux-Kernel, die zu einer Rechteausweitung führt, öffentlich veröffentlicht. CVE-2022-23270 ist ein Beispiel für eine UAF-Schwachstelle im Windows-Kernel.
  • Softwareanwendungen: UAF-Schwachstellen in Softwareanwendungen wurden ausgenutzt, um Programme zu manipulieren Verhalten, das zur Offenlegung von Informationen, zur Ausführung willkürlichen Codes, zum Programmabsturz und im schlimmsten Fall zu Privilegien führt Eskalation. Mehrere Softwareanwendungen waren und sind anfällig für UAF-Angriffe. Bei dieser Software handelt es sich meist um C/C++-Programme, die mit ineffizienten und unsicheren Speicherverwaltungsansätzen entwickelt wurden.

Weitere Informationen zu Use-After-Free-Schwachstellen in realen Anwendungen finden Sie unter offizieller MITRE CVE Listenseite und Sortierung nach Use-After-Free-Schlüsselwort.

Eine effiziente Speicherzuweisung trägt dazu bei, Software sicher zu machen

Eine optimale und gut durchdachte Speicherzuweisung trägt wesentlich dazu bei, Ihre Anwendungen davor zu schützen, Opfer häufiger Schwachstellen durch primitive Speicherbeschädigung zu werden.

UAF gehören zusammen mit Time Of Check Time of Use (TOCTOU), Race Conditions und Buffer Overflows (BOF) zu den am häufigsten ausgenutzten Speicherschwachstellen. All dies kann vermieden werden, indem Sie lernen, wie der Speicher Ihres Programms von der Plattform verwaltet wird, auf der es ausgeführt wird. Dies gibt Ihnen Klarheit darüber, wie das Betriebssystem Ihr Programm im Speicher zuordnet, und stattet Sie mit den Werkzeugen aus, um Software für optimale Leistung und Sicherheit zu entwerfen.

Wenn Sie es noch nicht getan haben, können Sie damit beginnen, zu verstehen, wie die Speicherverwaltung unter Linux erfolgt, dem weltweit am häufigsten verwendeten Server-Betriebssystem.