
Eine Go-Implementierung von dirtyfrag (CVE-2026-43284 / CVE-2026-43500)
Zwei Bugs. Eine Shell. Keine Schreibzugriffe auf die Platte.
Go-Port von dirtyfrag (CVE-2026-43284 / CVE-2026-43500).
Die Fehlerklasse befindet sich im XFRM-Subsystem des Linux-Kernels. Wenn eine Dateiseite per splice() in eine Pipe und dann in einen ESP-verschlüsselten Socket eingefügt wird, entschlüsselt der Kernel die ESP-Nutzlast direkt an Ort und Stelle – in die Page-Cache-Seite der Quelldatei. Die Datei ist schreibgeschützt. Der Page Cache ist es nicht.
dirtyfrag verknüpft zwei unabhängige Bugs, die diese Primitive ausnutzen:
CVE-2026-43284 – ESP/XFRM-Pfad
Installiert 48 XFRM-SAs im Transportmodus über NETLINK_XFRM. Jede SA kodiert 4 Bytes Shellcode-Nutzlast im Feld seq_hi ihres ESN-Replay-Zustands. Eine vmsplice- + splice-Kette löst für jede SA die ESP-Entschlüsselung in-place aus und schreibt diese 4 Bytes in den Page-Cache-Eintrag von /usr/bin/su. 48 Trigger, 192 geschriebene Bytes, keine Race-Condition.
CVE-2026-43500 – RxRPC/rxkad-Pfad
Brute-forct 3 PCBC(fcrypt)-Sitzungsschlüssel offline, die beim Entschlüsseln die Ziel-Bytesequenzen erzeugen. Löst für jeden Schlüssel einen AF_RXRPC-Socket-Trigger aus, um den Root-Eintrag in /etc/passwd auf root::0:0 (nullok) zu patchen. su - akzeptiert danach ein leeres Passwort.
Beide Pfade laufen in einem User- und Network-Namespace (CLONE_NEWUSER | CLONE_NEWNET), um auf dem Host kein CAP_NET_ADMIN zu benötigen.
go build -o dirtyfrag-go .
./dirtyfrag-go
# Force a specific path
./dirtyfrag-go --force-esp
./dirtyfrag-go --force-rxrpc
# Verbose output
./dirtyfrag-go -v
Die Binärdatei versucht zuerst den ESP-Pfad. Wenn /usr/bin/su danach nicht gepatcht ist, weicht sie auf den RxRPC-Pfad aus (bis zu 3 Wiederholungen). Bei Erfolg öffnet sie über ein frisches PTY eine Root-Shell.
Der Exploit berührt nur den Page Cache. Die Binärdateien auf der Platte und /etc/passwd bleiben unberührt. Ein Neustart stellt alles wieder her. Um den Cache ohne Neustart sofort zu leeren:
echo 1 | tee /proc/sys/vm/drop_caches
esp4, esp6 (ESP-Pfad) und/oder rxrpc (RxRPC-Pfad)Alle Kernel vor den Patches:
rmmod esp4 esp6 rxrpc
printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' \
> /etc/modprobe.d/dirtyfrag.conf
Die Go-Laufzeit ist von Anfang an multithreaded, daher ist unshare(CLONE_NEWUSER) nicht erlaubt. Der Go-Port führt sich selbst als Kindprozess mit gesetztem SysProcAttr.Cloneflags erneut aus, wodurch clone() aufgerufen wird, bevor die Go-Laufzeit initialisiert wird.
| C (original) | Go |
|---|
| Externe Abhängigkeiten | keine | keine |
| Einzelne Datei | nein | nein |
| Statisches Binary | ja | ja |
| RxRPC-Pfad | ja | ja |
| ESP-Pfad | ja | ja |
| Namespace-Isolation | unshare() | Re-exec mit Cloneflags |