Dirty COW erklärt – Einmal alles rebooten…

Dirty Cow erklärt

Mit CVE-2016-5195 alias Dirty COW wurde vor ein paar Tagen eine Schwachstelle im Linux-Kernel bekannt, die es Nutzern ermöglicht, Dateien mit Inhalten zu beschreiben, obwohl sie für diese eigentlich nur Leserechte zugewiesen bekommen haben. Durch diese Lücke wird es möglich, die eigenen Nutzerrechte zu erweitern. Kenny vom Team Security erklärt, was Dirty COW so gefährlich macht.

Was macht Dirty COW?

Dirty COW selbst ist ein Exploit für die Kernel-Schwachstelle mit der Bezeichnung CVE-2016-5195. Dabei kommt eine Race-Condition zum Einsatz, die in vier Schritten abläuft.

1. Initialisierung

Im ersten Schritt wird ein Memory-Mapping der Datei erzeugt, die modifiziert werden soll. Dadurch wird die Datei in virtueller Form im Speicherbereich der Anwendung eingebunden. Anstatt die Datei in den Speicher zu laden, wird bei Lesevorgängen direkt aus der Datei gelesen und bei Schreibvorgängen direkt in die Datei geschrieben. Da für die Datei eigentlich keine Schreibrechte vorhanden sind, wird sie nur read-only geladen. Zudem wird ein Flag gesetzt, das bewirken soll, dass bei Schreibversuchen auf den Speicherbereich der gemappten Datei nicht die eigentliche Datei beschrieben wird, sondern eine Kopie der Datei im Speicher erzeugt und anschließend diese Kopie bearbeitet wird. Dieses Vorgehen bezeichnet man als Copy-on-Write (CoW) und ist der Namensgeber für den Exploit. Abschließend werden zwei Threads gestartet, die die Race-Condition provozieren sollen.

2. Thread 1: procselfmemThread

Im ersten der beiden Threads öffnet der Exploit die Datei „/proc/self/mem“ mit Lese- und Schreibrechten. Bei dieser Datei handelt es sich um eine virtuelle Datei, die den Speicherbereich des Prozesses darstellt. In dieser Datei sucht der Exploit nach dem Speicherbereich, in dem das read-only Memory-Mapping hinterlegt ist, und schreibt dort den Inhalt hinein, der in die angegriffene Datei geschrieben werden soll.

3. Thread 2: madviseThread

Im zweiten Thread weist der Exploit den Kernel an, dass der Speicherbereich, der für das Memory-Mapping der Datei verwendet wird, in nächster Zeit nicht mehr benötigt wird und deshalb vorerst freigegeben und anderweitig verwendet werden kann. Gleichzeitig wird durch das Ansprechen des Speicherbereichs in Thread 1 dafür gesorgt, dass der durch den Exploit verwendete Speicherbereich immer wieder neu geladen wird.

4. Race-Condition

Beide Threads laufen mit hoher Geschwindigkeit parallel ab. Im Normalfall versucht Thread 1 den Inhalt der Datei zu ändern. Durch Copy-on-Write wird ein beschreibbares Abbild der Datei erstellt und geändert. Durch den Aufruf von Thread 2 wird der Speicher weggeräumt. Dadurch, dass beide Abläufe – das Beschreiben des Speichers und das Wegräumen/Laden des Speichers – in hoher Geschwindigkeit parallel ablaufen, kann es offenbar passieren, dass der Speicherbereich bereits geändert wird, noch bevor durch Copy-on-Write die private Kopie erzeugt worden ist. Diese Änderung wird durch das Memory-Mapping der angegriffenen Datei auch in diese geschrieben.

Warum ist Dirty COW so gefährlich?

Ein Großteil der Sicherheit in Linux-Systemen entsteht durch die strikte Trennung von Zugriffsrechten. Nutzer, die eine Datei lesen können, dürfen diese noch nicht zwingend beschreiben. Selbst Dateien, die sie lesen und beschreiben dürfen, können sie nicht automatisch auch ausführen. Durch das Beschreiben von Dateien, die nur lesbar sein sollten, besteht bereits die Möglichkeit, Konfigurationen und Shellskripte zu ändern, die bei einem späteren Neustart potentiell zur Ausführung von Befehlen führen können.

Eine besondere Art von Dateien birgt ein unmittelbares Risiko: Dateien mit gesetztem SUID-Flag. Dateien mit diesem Flag werden beim Aufrufen nicht mit den Rechten des aktuellen Nutzers gestartet, sondern mit den Rechten des Dateibesitzers. Diese Funktion ermöglicht es Nutzern, Funktionen auszuführen, für die ihnen normalerweise die Berechtigungen fehlen würden. Ein Beispiel für typische SUID-Befehle ist die Anwendung „ping“. Diese benötigt erweiterte Netzwerkberechtigungen, weshalb typischerweise der Nutzer root als Besitzer eingetragen und das SUID-Flag gesetzt ist. So können alle Nutzer den Ping-Befehl verwenden.

Mit Hilfe von Dirty COW und dem Modifzieren einer Anwendung mit gesetztem SUID-Flag ist es lokalen Nutzern möglich, in kurzer Zeit ein Linux-System vollständig zu kompromittieren.

Das unternimmt SysEleven

Wir bei SysEleven sind aktuell dabei, alle von uns betriebenen Systeme zu aktualisieren, sodass unsere Systeme und die Systeme, die wir für unsere Kunden managen, nicht mehr durch Dirty COW angegriffen werden können. Da sich die Lücke im Linux-Kernel befindet, bedeutet das leider auch, dass wir nach und nach alle Systeme einmal rebooten müssen, damit anschließend die neue, fehlerbereinigte Kernel-Version verwendet wird.

Alle unsere Kunden erhalten eine Mail mit allen notwendigen Details zum Reboot. Sollten Sie Fragen zum Exploit oder Ihrem System haben, wenden Sie sich gerne an Ihren zuständigen Admin.