
Proof of Concept für CVE-2022-0847
CSE 5380: Informationssicherheits-Paper CVE-2022-0847 (Dirty Pipe)
Von
Karan Vasudevamurthy (UTA-ID: 1002164438)
Was ist CVE?
Common Vulnerabilities and Exposures (CVE) ist eine Liste öffentlich bekannt gemachter Informationssicherheits-Schwachstellen und -Gefährdungen. Die MITRE Corporation führte CVE 1999 ein, um Schwachstellen in Software und Firmware zu identifizieren und zu klassifizieren. MITRE ist eine gemeinnützige Organisation, die bundesfinanzierte Forschungs- und Entwicklungszentren in den Vereinigten Staaten betreibt. CVE zielt darauf ab, den Austausch von Informationen über bekannte Schwachstellen zu erleichtern, damit Cybersicherheitspläne aktualisiert werden können, um die neuesten Sicherheitsprobleme und -schwächen widerzuspiegeln. Zu diesem Zweck weist CVE jeder Schwachstelle oder Gefährdung eine eindeutige Kennung zu, die sogenannte CVE-Kennung, auch bekannt als CVE-Name oder CVE-Nummer. Das Common Vulnerability Scoring System (CVSS) ist eine Reihe offener Standards, um einer Schwachstelle eine Zahl zur Bewertung ihres Schweregrads zuzuweisen. Der Bereich eines CVSS-Scores reicht von 0,0 bis 10,0. Der Grad der Sicherheitsgefährdung steigt mit zunehmender Zahl. Jede CVE-ID hat das Format CVE-YYYY-NNNNN. Der Teil YYYY steht für das Jahr, in dem die CVE-ID vergeben wurde oder die Schwachstelle öffentlich gemacht wurde.
Was sind Pipes?
Im Zusammenhang mit CVE-2022-0847 ist es entscheidend, die internen Abläufe von Pipes zu verstehen, insbesondere die Attribute, die mit dem Pipe-Puffer verbunden sind. Pipes in Linux helfen beim Übertragen von Daten zwischen Prozessen, wobei die Ausgabe eines Prozesses zur Eingabe eines anderen wird. Dieser Mechanismus ermöglicht die Kommunikation und Koordination zwischen verschiedenen Prozessen, die auf dem System laufen. Pipes sind in Linux unidirektional, das heißt, Daten fließen nur in eine Richtung. Ein Pipe-Puffer besteht typischerweise aus einer Datenstruktur mit fester Größe nach dem First-in-First-out-Prinzip (FIFO), die die zwischen Prozessen übertragenen Daten vorübergehend speichert. Wenn ein Prozess Daten in eine Pipe schreibt, werden sie im Puffer gespeichert, bis ein anderer Prozess daraus liest. Sobald die Daten gelesen wurden, werden sie aus dem Puffer entfernt, sodass neue Daten geschrieben werden können.
Die Schwachstelle
Für CVE-2022-0847 ist es wichtig, zwei Funktionen innerhalb des Pipe-Puffers zu verstehen:
Seite | 1
Max Kellermann entdeckte, dass der Linux-Kernel Unix-Pipes falsch behandelte. Die Schwachstelle entsteht durch eine unzureichende Initialisierung bestimmter Attribute, insbesondere des Parameters „flags“, in den Funktionen „copy_page_to_iter_pipe“ und „push_pipe“. Dieses Versehen kann dazu führen, dass veraltete oder falsche Werte an die Flags zugewiesen werden, was die Sicherheit und Integrität des Systems gefährden kann. Ein nicht privilegierter lokaler Benutzer konnte diesen Fehler ausnutzen, um in Seiten im Page Cache zu schreiben, die durch schreibgeschützte Dateien gestützt werden, und so seine Privilegien auf dem System zu erweitern.
Angriffsmethodik
Sie ähnelt CVE-2016-5195 „Dirty Cow“, ist aber einfacher auszunutzen. Die Ausnutzung von CVE-2022-0847 erfordert lokalen Zugriff auf das Zielsystem und betrifft Linux-Kernelversionen neuer als 5.8. Wir können neue Pipe-Puffer mit dem falsch gesetzten Flag PIPE_BUF_FLAG_CAN_MERGE erzeugen, da die ordnungsgemäße Initialisierung fehlt. Dieses Flag steuert die Zusammenführung von Schreibvorgängen in einen Pipe-Puffer und ermöglicht dadurch das Schreiben in eine vorhandene Seite, die in die Pipe eingefügt wurde. Wenn eine Datei diese eingefügte Seite zulässt, wird die Änderung in der gemeinsamen systemweiten Sicht der Datei im Speicher sichtbar. Jede weitere Cache-Leerung ignoriert die aktuellen Linux-Berechtigungseinstellungen und kopiert die veränderten Daten auf die Festplatte. Dies würde es einem nicht privilegierten Benutzer ermöglichen, bestimmte Inhalte einer Datei (entweder auf der Festplatte oder im Speicher) zu ändern, selbst wenn die Datei nur durch schreibgeschützte Zugriffskontrollen wie SELinux, standardmäßige Linux-Berechtigungen, erweiterte Zugriffskontrolle und unveränderliche Dateien vor Änderungen geschützt ist. Daher können wir annehmen, dass der Angreifer ein beliebiger nicht privilegierter lokaler Benutzer mit Grundkenntnissen über Linux-Systeme und der Fähigkeit zur Ausführung von Schadcode sein könnte. Eine solche Person könnte ihre Privilegien erweitern und möglicherweise das gesamte System gefährden, was ein erhebliches Sicherheitsrisiko darstellt.
Proof of Concept
Nachfolgend sind die Schritte aufgeführt, die ich befolgt habe, um CVE-2022-0847 auf einer virtuellen Maschine mit Linux auszunutzen.
Prüfen, ob Ihre Linux-Distribution ausgenutzt werden kann-
Jeder Linux-Kernel neuer als 5.8 ist betroffen. Allerdings können die Versionen 5.16.11, 5.15.25 und 5.10.102 nicht für CVE-2022-0847 ausgenutzt werden. Um Ihre Kernel-Version zu ermitteln, führen Sie einfach *uname -r* aus. Sie können auch dieses Bash-Skript ausführen, wenn Sie unsicher sind, ob ein Zielsystem verwundbar ist.
Herunterladen des richtigen Linux-Kernels-
Für die Demonstration habe ich mich für Ubuntu 20.04.1 LTS entschieden. Diese Ubuntu-Version läuft jedoch derzeit auf Linux-Kernel 5.15, und CVE-2022-0847 kann auf dieser Kernel-Version nicht ausgenutzt werden. Um Linux-Kernel 5.8 herunterzuladen, können wir einfach *sudo apt install linux-image-5.8.0-63-generic linux-headers-5.8.0-63-generic* ausführen.
Herunterladen des Exploits-
Der Exploit ist auf GitHub. zu finden. Er zeigt, wie man beliebige Dateiinhalte im Page Cache überschreiben kann, selbst wenn die Datei nicht beschrieben werden darf, unveränderlich ist oder sich auf einem schreibgeschützten Mount befindet. Sie könnten auch *git clone[ https://github.com/karanlvm/Infosec.git* ](https://github.com/karanlvm/Infosec.git%60)*im Terminal ausführen.
Kopieren der ursprünglichen passwd-Datei-
Wir können *cp /etc/passwd /tmp/passwd.bak* ausführen. Dies hilft uns, den Unterschied in der passwd-Datei vor und nach der Ausführung des Exploits zu erkennen.
Kompilieren des Exploits-
Um den Exploit erfolgreich zu kompilieren, muss GCC installiert sein. Sie können GCC mit *sudo apt-get install gcc* installieren. Zum Kompilieren des Exploits können Sie ausführen.
Einschränkungen
Es gibt zwei wesentliche Einschränkungen dieses Exploits:
Aktueller Status und Behebung
Stand 2024-01-12 beträgt die Wahrscheinlichkeit von Ausnutzungsaktivitäten in den nächsten 30 Tagen 7,58 % (Exploit Prediction Scoring System (EPSS)). Nachfolgend ist der CVSS (Common Vulnerability Scoring System) für CVE-2022-0487 angegeben:
Diese Schwachstelle kann auf jedem Linux-Kernel neuer als 5.8 ausgenutzt werden. Die Schwachstelle wurde jedoch in Linux 5.16.11, 5.15.25 und 5.10.102 behoben . Daher können wir einfach die von den Linux-Distributionsbetreuern bereitgestellten Patches oder Updates anwenden, um die Schwachstelle zu beheben. Dazu können wir einfach die folgenden
Befehle *sudo apt update* und *sudo apt upgrade* ausführen.
Referenzen
Seite | 5
*gcc exp.c -o exp*Ausführen des Exploits-
Zum Ausführen des Exploits müssen die schreibgeschützte Datei, der Offset und einige einzufügende Zeichen als Parameter angegeben werden. In diesem Fall führen wir *./exp /etc/passwd 1 ootz:* aus. Wenn Sie eine Ausgabe erhalten, die „It worked !“ lautet, bedeutet das, dass wir die Dirty-Pipe-Schwachstelle erfolgreich ausgenutzt haben und nun ohne Passwort Root-Zugriff erhalten können.
Zur Root-Berechtigung wechseln-
Jetzt können wir einfach *su rootz* ausführen und sollten Root-Zugriff haben. Zur Bestätigung können wir den Befehl id ausführen.