[English]In so gut wie allen Linux-Distributionen gibt es die als Dirty Pipe bezeichnete Linux-Schwachstelle CVE-2022-0847. Diese ermöglicht unprivilegierten Nutzern – ab dem Linux Kernel 5.8 und höher – root-Rechte zu erlangen. Gefährdet sind Linux-Distributionen, IoT-Geräte (und möglicherweise auch Android-Systeme, falls dort bereits der Kernel 5.8 und höher zum Einsatz kommt). Zu allem Überfluss ist inzwischen ein Exploit öffentlich bekannt.
Schwachstelle CVE-2022-0847 ermöglicht root
Der Entwickler Max Kellermann hat die Schwachstelle CVE-2022-0847 in diesem Beitrag der IONOS-Tochter CM4All offen gelegt (siehe auch diese IONOS-Meldung). Die als Dirty Pipe bezeichnete Schwachstelle steckt ab Version 5.8 im Linux-Kernel und ermöglicht das Überschreiben von Daten in beliebigen schreibgeschützten Dateien. Dies kann zu einer Privilegienerweiterung ausgenutzt werden, da unprivilegierte Prozesse Code in Root-Prozesse einschleusen können. Mitre beschreibt die Schwachstelle (für Debian) so:
A flaw was found in the way the „flags“ member of the new pipe buffer structure was lacking proper initialization in copy_page_to_iter_pipe and push_pipe functions in the Linux kernel and could thus contain stale values. An unprivileged local user could use this flaw to write to pages in the page cache backed by read only files and as such escalate their privileges on the system. This flaw affects Linux kernel versions prior to 5.17-rc6.
Die Schwachstelle ähnelt laut Kellermann der als Dirty Cow bekannten und 2016 gefixten CVE-2016-5195, ist aber leichter auszunutzen. Die Sicherheitslücke wurde in Linux 5.16.11, 5.15.25 und 5.10.102 behoben. Problem werden die Systeme im Bereich IoT-Geräte und Android sein, die keine Updates des Linux-Kernels mehr erhalten.
Entdeckung durch Zufall
Die Entdeckung erfolgte durch einen Zufall mit einem einem Support-Ticket über beschädigte Dateien. Ein Kunde beschwerte sich, dass die im .gzip-Format heruntergeladenen Zugriffsprotokolle nicht dekomprimiert werden konnten. Bei der Analyse konnte eine beschädigte Protokolldatei auf einem der Protokollserver gefunden werden, die sich zwar dekomprimiert ließ. Aber gzip meldete einen CRC-Fehler. Eine Erklärung für die Beschädigung gab es nicht.
Als dieser CRC-Fehler Monate später wiederholt bei der Protokolldatei und anderen Dateien auftrat, begann Kellermann mit Nachforschungen. Dabei stieß er auf die Schwachstelle im Linux-Kernel ab Version 5.8. Die Sicherheitslücke CVE-2022-0847 tritt in der Pipe-Funktion auf, die für die unidirektionale Kommunikation zwischen Prozessen verwendet wird.
Schwachstelle im Pipe-Mechanismus
Der Linux-Kernel implementiert dies durch einen Ring von struct pipe_buffer, die jeweils auf eine Seite verweisen. Ein Ende dient dazu, Daten hineinzuschieben, das andere Ende kann diese Daten abrufen. Beim ersten Schreiben in eine Pipe wird eine Seite (mit max. Platz für 4 kB Daten) reserviert. Wenn der letzte Schreibvorgang die Seite nicht vollständig füllt, kann ein nachfolgender Schreibvorgang an die bestehende Seite angehängt werden, anstatt eine neue Seite zuzuweisen. So funktionieren „anonyme“ Pipe-Puffer (anon_pipe_buf_ops).
Werden jedoch Daten per splice() aus einer Datei in die Pipe eingefügt, lädt der Kernel die Daten zunächst in den Seiten-Cache. Dann erstellt er eine struct pipe_buffer-Struktur, die in den Seiten-Cache zeigt (Null-Kopie). Im Gegensatz zu anonymen Pipe-Puffern dürfen zusätzliche Daten, die in die Pipe geschrieben werden, nicht an eine solche Seite angehängt werden, da die Seite dem Seiten-Cache gehört, nicht der Pipe. Diese Mechanismus ermöglicht es einem nicht privilegierten Benutzer über die Dirty Pipe-Schwachstelle, Daten in schreibgeschützte Dateien zu injizieren und zu überschreiben, einschließlich SUID-Prozesse, die als Root laufen.
Fixes, Offenlegung und Proof of Concept
Das oben erwähnte Support-Ticket nach einer Kundenbeschwerde über kaputte .gz-Archive stammt vom 29. April 2021 – aber erst am 19. Februar 2022 konnte Kellermann die Schwachstelle im Linux-Kernel ausmachen. Am 20. Februar 2022 wurde das Linux Kernel-Sicherheitsteam informiert. Diese begannen mit der Entwicklung einer bereinigten Kernel-Version.
- 2022-02-23: Linux Stable Releases mit Fix freigegeben (5.16.11, 5.15.25, 5.10.102)
- 2022-02-24: Google fügt den Fix in den Android-Kernel ein
Am 28. Februar wurde die Linux-Distros Mailing-Liste informiert und am 7. März 2022 erfolgte die Offenlegung der Schwachstelle in diesem Blog-Beitrag. Dort sind auch weitere Details sowie ein Proof of Concept zu finden.
Die Kollegen von Bleeping Computer weisen hier darauf hin, dass es ein zweites Proof of Concept existiert, bei dem ein Sicherheitsforscher die passwd-Datei eines Linux-Nutzers zurück setzt. So kann er ein leeres Passwort vorgeben, wodurch Angreifer sich über su root Super User-Berechtigungen holen. Und ein weiterer Sicherheitsforscher hat einen Weg skizziert, um eine Web-Shell über die Schwachstelle in einem Linux-System zu injizieren.
Der Angreifer muss aber auf dem lokalen System angemeldet sein, um die Pipes nutzen zu können. Hier ist die Frage, ob Anwendungen wie Browser, Mail-Clients oder aus Downloads einen solchen Angriff mit Privilegien-Erhöhungen fahren können.
Der Linux-Kernel 5.8 wurde im August 2020 veröffentlicht (siehe diesen heise-Beitrag). Das Problem, was jetzt besteht: Es gibt zwar Kernel-Patches für die meisten Linux-Distributionen, aber nicht alle Linux-Systeme werden bereits gepatcht sein. Speziell bei IoT-Geräten könnte es einige Firmware-Implementierungen betreffen – obwohl dort möglicherweise noch die älteren Kernel vor Version 5.8 verwendet werden.
Entwarnung für Android
Bezüglich Android habe ich mal nachgesehen: Auf Wikipedia heißt es, dass Android 11 erst die Kernelversionen 4.14, 4.19 sowie 5.4 verwendet. Hier würde ich vorsichtig Entwarnung geben – da nur experimentelle Versionen von Android 12 einen Kernel 5.10 verwenden (siehe hier und hier). Die Android 12-Geräte, die eine betroffene Kernel-Version verwenden, dürften (sofern betroffen) auch Sicherheitsupdates bekommen. Die Annahme setzt natürlich voraus, dass die älteren Kernel-Versionen nicht betroffen sind.
Am Rande betr. Pipe und „unidirektionale Kommunikation zwischen Prozessen“, Klugscheissmodus an, rein didaktisch:
„Unidirektional“ ist eine Einschränkung von anonymous pipes, named pipes können in beide Richtungen kommunizieren; s. https://de.wikipedia.org/wiki/Pipe_(Informatik)#Pipe-Varianten