Im Linux-Kernel wurde eine Sicherheitslücke (CVE-2022-0847) entdeckt, die es ermöglicht, den Inhalt des Seiten-Cache für beliebige Dateien, einschließlich solcher im Nur-Lese-Modus, die mit dem O_RDONLY-Flag geöffnet oder in im Nur-Lese-Modus eingebundenen Dateisystemen gespeichert sind, umzuschreiben. Praktisch gesehen kann die Schwachstelle genutzt werden, um Code in beliebige Prozesse einzuschleusen oder Daten in geöffneten Dateien zu manipulieren. Zum Beispiel kann der Inhalt der Datei authorized_keys für den Prozess sshd verändert werden. Ein Prototyp eines Exploits steht für Tests zur Verfügung.
Das Problem trägt den Codenamen Dirty Pipe, analog zu der im Jahr 2016 entdeckten kritischen Schwachstelle Dirty COW. Es wird festgestellt, dass Dirty Pipe in Bezug auf die Gefahrenstufe auf dem gleichen Niveau wie Dirty COW steht, jedoch erheblich leichter auszunutzen ist. Die Schwachstelle wurde im Rahmen von Beschwerden über periodische Beschädigungen von über das Netzwerk geladenen Dateien in einem System entdeckt, das komprimierte Archive von einem Log-Server herunterlädt (37 Beschädigungen in 3 Monaten auf einem stark belasteten System), bei deren Erstellung die splice()-Operation und nicht benannte Pipes verwendet wurden.
Die Schwachstelle tritt seit dem Linux-Kernel 5.8 auf, der im August 2020 veröffentlicht wurde. Sie ist also in Debian 11 vorhanden, betrifft jedoch nicht den Basiskernel von Ubuntu 20.04 LTS. Die Kernel-Versionen RHEL 8.x und openSUSE/SUSE 15 basieren ursprünglich auf älteren Zweigen, es ist jedoch möglich, dass die problematische Änderung in diese integriert wurde (genaue Informationen liegen derzeit nicht vor). Updates für Pakete in den Distributionen können auf den folgenden Seiten verfolgt werden: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Die Schwachstelle wurde in den Ausgaben 5.16.11, 5.15.25 und 5.10.102 behoben. Die Korrektur ist ebenfalls im Kernel enthalten, der in der Android-Plattform verwendet wird.
Die Schwachstelle entsteht durch die fehlende Initialisierung des Wertes „buf->flags“ im Code der Funktionen copy_page_to_iter_pipe() und push_pipe(). Da der Speicher beim Zuweisen der Struktur nicht gelöscht wird, können bei bestimmten Manipulationen mit unbenannten Pipes in „buf->flags“ Werte anderer Operationen erscheinen. Ein nicht privilegierter lokaler Benutzer kann diese Besonderheit ausnutzen, um das Flag PIPE_BUF_FLAG_CAN_MERGE zu setzen, welches es erlaubt, Daten im Seiten-Cache durch einfaches Schreiben neuer Daten in eine speziell vorbereitete unbenannte Pipe zu überschreiben.
Für einen Angriff muss die Zieldatei lesbar sein. Da beim Schreiben in eine Pipe die Zugriffsrechte nicht überprüft werden, kann die Ersetzung im Seiten-Cache auch für Dateien erfolgen, die nur in schreibgeschützten Partitionen eingebunden sind (z. B. für Dateien auf 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 Betrieb besteht darin, einen unbenannten Kanal zu erstellen und ihn mit beliebigen Daten zu füllen, um das Flag PIPE_BUF_FLAG_CAN_MERGE in allen damit verbundenen Ringstrukturen zu setzen. Danach werden die Daten aus dem Kanal gelesen, aber das Flag bleibt in allen Exemplaren der Struktur pipe_buffer in den Ringstrukturen pipe_inode_info gesetzt. Anschließend wird der Aufruf splice() durchgeführt, um Daten aus der Zieldatei in den unbenannten Kanal zu lesen, beginnend mit dem gewünschten Offset. Beim Schreiben von Daten in diesen unbenannten Kanal werden aufgrund des gesetzten Flags PIPE_BUF_FLAG_CAN_MERGE die Daten im Seiten-Cache überschrieben, anstatt ein neues Exemplar der Struktur pipe_buffer zu erstellen.
Quelle: opennet.ru
