Eine Schwachstelle im Linux-Kernel, die es ermöglicht, nur schreibgeschützte Dateien zu verändern.

Im Linux-Kernel wurde eine Schwachstelle (CVE-2022-0847) entdeckt, die es ermöglicht, den Inhalt des Seitencaches für beliebige Dateien zu überschreiben, einschließlich solcher, die im Nur-Lese-Modus mit dem Flag O_RDONLY geöffnet oder in Dateisystemen gemountet sind, die im Nur-Lese-Modus betrieben werden. Praktisch kann die Schwachstelle ausgenutzt werden, um Code in beliebige Prozesse einzufügen oder Daten in geöffneten Dateien zu verfälschen. Beispielsweise kann der Inhalt der Datei authorized_keys für den Prozess sshd geändert werden. Ein Prototyp des Exploits steht zum Testen zur Verfügung.

Das Problem wurde unter dem Codenamen Dirty Pipe zusammengefasst, analog zur kritischen Schwachstelle Dirty COW, die 2016 entdeckt wurde. Es wird festgestellt, dass Dirty Pipe hinsichtlich der Gefährlichkeit auf einer Stufe mit Dirty COW steht, jedoch deutlich einfacher auszunutzen ist. Die Schwachstelle wurde bei der Analyse von Beschwerden über sporadische Beschädigungen von über das Netzwerk geladenen Dateien in einem System entdeckt, das komprimierte Archive von einem Log-Server lädt (37 Schäden in 3 Monaten auf einem stark belasteten System), wobei hierbei die Operation splice() und unbenannte Pipes verwendet wurden.

Die Schwachstelle tritt seit dem Linux-Kernel 5.8 auf, der im August 2020 veröffentlicht wurde, d.h. sie ist in Debian 11 vorhanden, betrifft jedoch nicht den Basis-Kernel in Ubuntu 20.04 LTS. Die Kernels RHEL 8.x und openSUSE/SUSE 15 basieren ursprünglich auf älteren Zweigen, aber es ist nicht ausgeschlossen, dass die problematische Änderung in diese übernommen wurde (genaue Informationen liegen derzeit nicht vor). Aktualisierungen der Pakete in den Distributionen können auf diesen Seiten verfolgt werden: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Die Schwachstelle wurde in den Versionen 5.16.11, 5.15.25 und 5.10.102 behoben. Die Behebung ist auch im Kernel enthalten, der auf der Android-Plattform verwendet wird.

Die Schwachstelle entsteht durch das Fehlen der Initialisierung des Wertes „buf->flags“ im Code der Funktionen copy_page_to_iter_pipe() und push_pipe(), wobei der Speicher bei der Zuweisung der Struktur nicht gereinigt wird und unter bestimmten Manipulationen mit unbenannten Pipes im „buf->flags“ ein Wert von einer anderen Operation vorhanden sein kann. Durch diese Besonderheit kann ein unprivilegierter lokaler Benutzer erreichen, dass im Flag der Wert PIPE_BUF_FLAG_CAN_MERGE erscheint, der es ermöglicht, Daten im Seitencache durch einfaches Schreiben neuer Daten in eine speziell vorbereitete unbenannte Pipe (pipe) zu überschreiben.

Um eine Angriffsquelle zu ermöglichen, muss die Zieldatei lesbar sein. Da beim Schreiben in die Pipe keine Zugriffsrechte überprüft werden, kann die Ersetzung im Seiten-Cache auch für Dateien erfolgen, die sich in nur lesbaren gemounteten Bereichen befinden (zum Beispiel für Dateien von einer CD-ROM). Nach der Ersetzung der Informationen im Seiten-Cache erhält der Prozess beim Lesen der Daten aus der Datei nicht die tatsächlichen, sondern die manipulierten Daten.

Der Angriff besteht darin, ein anonymes Pipe zu erstellen und dieses mit beliebigen Daten zu füllen, um das Setzen des Flags PIPE_BUF_FLAG_CAN_MERGE in allen zugehörigen ringpuffer-Strukturen zu erreichen. Anschließend werden die Daten aus der Pipe gelesen, wobei das Flag in allen Instanzen der pipe_buffer-Struktur in den ringpuffer-Strukturen pipe_inode_info gesetzt bleibt. Danach wird der Aufruf von splice() ausgeführt, um Daten aus der Zieldatei in die anonyme Pipe zu lesen, beginnend mit dem erforderlichen Offset. Beim Schreiben von Daten in diese anonyme Pipe werden aufgrund des gesetzten Flags PIPE_BUF_FLAG_CAN_MERGE die Daten im Seiten-Cache überschrieben, statt eine neue Instanz der pipe_buffer-Struktur zu erstellen.

Quelle: opennet.ru

60GB SSD 8Gb DDR4