
Analyse technique de CVE-2026-43284 (Dirty Frag), une élévation de privilèges locale dans le sous-système xfrm ESP du noyau Linux permettant des écritures dans le page-cache de fichiers en lecture seule en vue d'une compromission root.
Analyse technique détaillée de la faille d'élévation de privilèges locale CVE-2026-43284 (Dirty Frag) dans le noyau Linux.
CVE-2026-43284 (communément désignée comme faisant partie de la suite de vulnérabilités Dirty Frag) est une faille critique d'élévation de privilèges locale (LPE) dans le noyau Linux. Elle découle d'un défaut de logique au sein du sous-système d'entrée xfrm ESP (Encapsulating Security Payload). Le bug permet à un attaquant local non privilégié de contourner les protections classiques de copie sur écriture (Copy-on-Write, CoW) et d'obtenir une primitive d'écriture arbitraire dans le page-cache vers des fichiers système en lecture seule (tels que /usr/bin/su), aboutissant en fin de compte à une compromission complète de root.
Décomposition de la vulnérabilité et vecteur d'attaque1.
La contrainte : Interagir avec la configuration IPsec du noyau nécessite normalement la capacité CAP_NET_ADMIN, un privilège réservé à l'utilisateur normal. Le contournement : Un utilisateur local non privilégié peut créer un User Namespace et un Network Namespace non privilégiés distincts (à l'aide de drapeaux tels que CLONE_NEWUSER | CLONE_NEWNET). À l'intérieur de cet espace conteneur isolé non privilégié, l'attaquant devient le processus « root » de ce namespace, ce qui lui octroie les privilèges CAP_NET_ADMIN dans ce contexte délimité.
Avec CAP_NET_ADMIN à l'intérieur du namespace réseau personnalisé, l'attaquant configure une fausse Security Association (SA) et des politiques IPsec.
À l'aide d'appels système tels que splice(2) ou vmsplice(2), l'attaquant attache des pages appartenant à un fichier cible en lecture seule (par exemple, /usr/bin/su) dans un fragment de tampon de socket (skb).
La contrainte : L'attaquant doit forcer le noyau à analyser les données via la routine esp_input().
La stratégie : L'attaquant crée une structure réseau d'encapsulation ESP-in-UDP et dirige la transmission vers l'interface de boucle locale de l'hôte (127.0.0.1).
Lorsque le paquet est reçu localement via le canal de boucle locale, la pile réseau du noyau identifie l'enveloppe du paquet UDP, le décapsule et transmet la charge utile interne à esp_input() pour traitement.
En raison d'un bug de logique dans les chemins d'ajout de datagrammes IPv4/IPv6, le noyau ne parvient pas à marquer correctement les fragments de tampon de socket sous-jacents avec le drapeau SKBFL_SHARED_FRAG lors du splice de pages dans des sockets UDP.
Par conséquent, esp_input() interprète à tort le paquet comme un tampon privé non cloné et emprunte un chemin rapide d'optimisation de performance « sans COW ».
Au lieu de copier les données vers un tampon utilisateur sûr, esp_input() effectue un déchiffrement en place directement sur les pages mémoire empruntées au page cache du système
En ajustant finement les données de charge utile chiffrées et en utilisant la configuration de l'algorithme cryptographique (tel que les Extended Sequence Numbers), le processus de déchiffrement écrase de manière déterministe le binaire ciblé dans le page cache.
Une fois le page cache d'un binaire tel que /usr/bin/su empoisonné en mémoire avec la charge utile de l'attaquant, l'exécution du binaire déclenche l'exécution de la charge utile en tant que root sans jamais toucher ni modifier le binaire stocké sur le disque physique réel.
Impact : Élévation de privilèges locale déterministe et hautement fiable sur les principales distributions Linux d'entreprise, sans risque de panique du noyau.
Remédiation : Mettre à jour le noyau Linux vers des versions intégrant le correctif qui impose la gestion de SKBFL_SHARED_FRAG pour les splices de datagrammes et introduit un repli sûr vers skb_cow_data() dans la logique de traitement ESP.