Sicherheitslücke im Linux-Kernel, die schreibgeschützte Dateien manipulieren kann

Im Linux-Kernel wurde eine Schwachstelle identifiziert (CVE-2022-0847), die es ermöglicht, den Inhalt des Seitencaches für alle Dateien zu überschreiben, einschließlich solcher, die sich im schreibgeschützten Modus befinden, mit dem O_RDONLY-Flag geöffnet sind oder sich auf Dateisystemen befinden im schreibgeschützten Modus gemountet. In der Praxis könnte die Sicherheitslücke dazu genutzt werden, Code in beliebige Prozesse einzuschleusen oder Daten in geöffneten Dateien zu beschädigen. Sie können beispielsweise den Inhalt der Datei „authorized_keys“ für den sshd-Prozess ändern. Ein Prototyp des Exploits steht zum Testen zur Verfügung.

Das Problem trägt den Codenamen Dirty Pipe, ähnlich der kritischen Schwachstelle, die Dirty COW 2016 identifiziert hat. Es ist anzumerken, dass Dirty Pipe in Bezug auf die Gefahrenstufe auf dem gleichen Niveau wie Dirty COW liegt, aber viel einfacher zu bedienen ist. Die Schwachstelle wurde bei der Analyse von Beschwerden über die periodische Beschädigung von über das Netzwerk heruntergeladenen Dateien in einem System entdeckt, das komprimierte Archive von einem Protokollserver herunterlädt (37 Beschädigungen in 3 Monaten auf einem ausgelasteten System), bei dessen Vorbereitung die Operation splice() zum Einsatz kam und unbenannte Pfeifen.

Die Schwachstelle tritt ab dem im August 5.8 veröffentlichten Linux-Kernel 2020 auf, d. h. ist in Debian 11 vorhanden, wirkt sich jedoch nicht auf den Basiskernel in Ubuntu 20.04 LTS aus. Die RHEL 8.x- und openSUSE/SUSE 15-Kernel basieren zunächst auf alten Zweigen, es ist jedoch möglich, dass die das Problem verursachende Änderung in diese zurückportiert wurde (genaue Daten gibt es noch nicht). Sie können die Veröffentlichung von Paketaktualisierungen in Distributionen auf diesen Seiten verfolgen: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Eine Behebung der Schwachstelle wurde in den Versionen 5.16.11, 5.15.25 und 5.10.102 vorgeschlagen. Der Fix ist auch im Kernel der Android-Plattform enthalten.

Die Schwachstelle wird durch die fehlende Initialisierung des „buf->flags“-Werts im Code der Funktionen copy_page_to_iter_pipe() und push_pipe() verursacht, obwohl der Speicher beim Zuweisen einer Struktur und bei bestimmten Manipulationen mit nicht gelöscht wird unbenannte Pipes, ein Wert aus einer anderen Operation. Mit dieser Funktion kann ein nicht privilegierter lokaler Benutzer das Erscheinen des PIPE_BUF_FLAG_CAN_MERGE-Werts im Flag erreichen, wodurch Sie das Überschreiben von Daten im Seitencache organisieren können, indem Sie einfach neue Daten in eine speziell vorbereitete unbenannte Pipe schreiben.

Für einen Angriff muss die Zieldatei lesbar sein, und da die Zugriffsrechte beim Schreiben in die Pipe nicht überprüft werden, kann eine Ersetzung im Seitencache auch für Dateien vorgenommen werden, die sich in schreibgeschützten Partitionen befinden (z. B. für Dateien c CD-ROM) ROM). Nach dem Ersetzen der Informationen im Seitencache erhält der Prozess beim Lesen von Daten aus einer Datei nicht die tatsächlichen Daten, sondern die ersetzten Daten.

Bei der Operation geht es darum, einen unbenannten Kanal zu erstellen und ihn mit beliebigen Daten zu füllen, um sicherzustellen, dass das Flag PIPE_BUF_FLAG_CAN_MERGE in allen damit verbundenen Ringstrukturen gesetzt ist. Als nächstes werden die Daten aus dem Kanal gelesen, aber das Flag bleibt in allen Instanzen der Pipe_buffer-Struktur in den Pipe_inode_info-Ringstrukturen gesetzt. Anschließend wird splice() aufgerufen, um Daten aus der Zieldatei in eine unbenannte Pipe zu lesen, beginnend am gewünschten Offset. Beim Schreiben von Daten in diese unbenannte Pipe werden aufgrund des gesetzten Flags PIPE_BUF_FLAG_CAN_MERGE die Daten im Seitencache überschrieben, anstatt eine neue Instanz der Pipe_buffer-Struktur zu erstellen.

Source: opennet.ru

Kommentar hinzufügen