🔍 Contexte

Publié le 8 mai 2026 sur GitHub par le chercheur Hyunwoo Kim (@v4bel), ce write-up technique détaille Dirty Frag, une classe de vulnérabilités Linux permettant d’obtenir les privilèges root sur la majorité des distributions Linux en chaînant deux primitives d’écriture arbitraire en page cache.

🧩 Vulnérabilités impliquées

Dirty Frag repose sur deux vulnérabilités distinctes :

  • CVE-2026-43284 — xfrm-ESP Page-Cache Write : Dans esp_input(), lorsqu’un skb non-linéaire sans frag_list est traité, le code contourne skb_cow_data() et effectue un déchiffrement AEAD en place directement sur la page cache. Via splice(), un attaquant peut planter une page cache en lecture seule dans le frag du skb. La fonction crypto_authenc_esn_decrypt() effectue un STORE de 4 octets contrôlés (via seq_hi de l’attribut XFRMA_REPLAY_ESN_VAL) à un offset de fichier choisi. L’authentification AEAD échoue mais le STORE est déjà persisté. Nécessite CAP_NET_ADMIN (user namespace suffisant).

  • CVE-2026-43500 — RxRPC Page-Cache Write : Dans rxkad_verify_packet_1(), un déchiffrement pcbc(fcrypt) en place sur 8 octets est effectué directement sur la page cache via skb_to_sgvec(). La valeur STOREée est fcrypt_decrypt(C, K) où K est la session_key d’un token RxRPC enregistré sans privilège via add_key(). Ne nécessite aucun privilège (pas de user namespace).

💥 Exploitation

Variante ESP :

  • Cible : /usr/bin/su (setuid-root)
  • 192 octets d’un ELF root-shell statique sont écrits en 48 chunks de 4 octets via 48 SA XFRM distincts
  • Utilise unshare(CLONE_NEWUSER | CLONE_NEWNET) pour obtenir CAP_NET_ADMIN
  • Chaque trigger : vmsplice + splice + envoi UDP encapsulé ESP
  • Résultat : execve("/usr/bin/su") exécute directement un shell root

Variante RxRPC :

  • Cible : /etc/passwd ligne 1 (entrée root)
  • Objectif : transformer root:x:0:0:... en root::0:0:GGGGGG:... (champ passwd vide)
  • Brute-force en espace utilisateur de clés K_A/K_B/K_C (~18M/s, ~5ms à ~1s)
  • Trois STOREs de 8 octets aux offsets 4, 6, 8 avec correction de ciphertext chaîné
  • Résultat : PAM nullok accepte le mot de passe vide → shell root via /usr/bin/su

🔗 Chaînage

Les deux variantes se complètent :

  • ESP : disponible sur la plupart des distros mais bloqué sur Ubuntu (AppArmor + user namespace)
  • RxRPC : ne nécessite pas de user namespace mais rxrpc.ko absent sur RHEL, présent sur Ubuntu
  • Un binaire unique tente ESP en premier, puis bascule sur RxRPC en cas d’échec

🛠️ Correctifs

  • ESP (CVE-2026-43284) : Ajout du flag SKBFL_SHARED_FRAG sur les frags issus de splice ; vérification de skb_has_shared_frag() dans esp_input/esp6_input. Mergé dans mainline le 2026-05-08.
  • RxRPC (CVE-2026-43500) : Ajout de || skb->data_len dans la condition de skb_cloned() pour forcer skb_copy() sur les skbs non-linéaires. Patch soumis, non encore mergé upstream.

📅 Chronologie de divulgation

  • 2026-04-29/30 : Soumission à security@kernel.org et patches publiés
  • 2026-05-07 : Embargo rompu par un tiers non identifié → divulgation complète
  • 2026-05-08 : CVE-2026-43284 et CVE-2026-43500 assignés ; patch ESP mergé dans mainline

📄 Type d’article : Analyse technique et rapport de vulnérabilité détaillé publié par le découvreur, incluant root cause analysis, code d’exploitation et patches correctifs.

🧠 TTPs et IOCs détectés

TTP

  • T1068 — Exploitation for Privilege Escalation (Privilege Escalation)
  • T1203 — Exploitation for Client Execution (Execution)
  • T1548 — Abuse Elevation Control Mechanism (Privilege Escalation)
  • T1222.002 — File and Directory Permissions Modification: Linux and Mac File and Directory Permissions Modification (Defense Evasion)
  • T1565.001 — Data Manipulation: Stored Data Manipulation (Impact)

🟡 Indice de vérification factuelle : 50/100 (moyenne)

  • ⬜ github.com — source non référencée (0pts)
  • ✅ 29524 chars — texte complet (fulltext extrait) (15pts)
  • ✅ 8 IOCs (IPs/domaines/CVEs) (10pts)
  • ⬜ 0/1 IOCs confirmés externellement (0pts)
  • ✅ 5 TTPs MITRE identifiées (15pts)
  • ✅ date extraite du HTML source (10pts)
  • ⬜ aucun acteur de menace nommé (0pts)
  • ⬜ 0/2 CVE(s) confirmée(s) (0pts)

🔗 Source originale : https://github.com/V4bel/dirtyfrag/blob/master/assets/write-up.md