
Introduction
Quelques annĂ©es aprĂšs Dirty COW puis Dirty Pipe, une nouvelle vulnĂ©rabilitĂ© baptisĂ©e Dirty Frag vient rappeler une rĂ©alitĂ© fondamentale : le page cache Linux reste une surface dâattaque extrĂȘmement sensible.
Dirty Frag est une faille dâĂ©lĂ©vation de privilĂšges locale (Local Privilege Escalation – LPE) affectant une trĂšs large portion des noyaux Linux modernes. Le bug permet Ă un utilisateur non privilĂ©giĂ© de modifier indirectement des pages mĂ©moire associĂ©es Ă des fichiers protĂ©gĂ©s, puis dâobtenir un accĂšs root de maniĂšre particuliĂšrement fiable. Contrairement Ă de nombreuses LPE historiques, lâexploitation ne repose ni sur un race condition fragile, ni sur un comportement alĂ©atoire difficile Ă stabiliser.
LâintĂ©rĂȘt technique de Dirty Frag est immense, car cette vulnĂ©rabilitĂ© illustre une nouvelle Ă©volution dâune famille de bugs trĂšs spĂ©cifique du noyau Linux : les corruptions du page cache via des mĂ©canismes zero-copy.
Contexte : la lignĂ©e Dirty COW â Dirty Pipe â Copy Fail â Dirty Frag
Pour comprendre Dirty Frag, il faut dâabord comprendre la logique commune derriĂšre ces vulnĂ©rabilitĂ©s.
Toutes exploitent un invariant dangereux :
le noyau Linux manipule des pages mĂ©moire partagĂ©es entre fichiers, cache disque et buffers rĂ©seau afin dâĂ©viter les copies inutiles.
Cette optimisation est au cĆur des performances Linux modernes.
Le problĂšme apparaĂźt lorsque :
- une page supposée read-only
- ou une page issue dâun fichier protĂ©gĂ©
- est réinjectée dans une structure noyau modifiable
- sans que les vérifications de permissions soient correctement réappliquées
Dans Dirty COW, le problÚme concernait le mécanisme Copy-On-Write.
Dans Dirty Pipe, le problĂšme concernait les pipe_buffer.
Dans Dirty Frag, le problÚme se déplace vers :
- les fragments réseau
- les structures
sk_buff - et certains chemins réseau zero-copy du noyau
Le rĂŽle central du Page Cache Linux
Le page cache est une couche fondamentale du noyau Linux.
Lorsquâun fichier est lu :
- le contenu disque est chargé en mémoire
- stocké dans des pages RAM
- puis partagé entre différents sous-systÚmes du noyau
Schématiquement :
Disque
â
Page Cache
â
read(), mmap(), splice(), sendfile(), réseau, etc.
Lâobjectif est simple :
- éviter les copies mémoire
- limiter les accĂšs disque
- accélérer les E/S
Le problĂšme est quâune mĂȘme page mĂ©moire peut ĂȘtre :
- référencée par plusieurs objets noyau
- utilisée par des mécanismes différents
- parfois supposée immuable
- parfois modifiable
La sécurité repose donc entiÚrement sur :
- les flags ;
- les références ;
- les permissions ;
- et la cohérence des chemins de traitement.
Une simple erreur logique suffit Ă transformer une page read-only en page modifiable.
Dirty Pipe : la base conceptuelle
Dirty Frag dérive directement des concepts introduits par Dirty Pipe.
Dans Dirty Pipe :
splice()injectait une rĂ©fĂ©rence vers une page du page cache dans unpipe_buffer- certains flags nâĂ©taient pas correctement rĂ©initialisĂ©s
- lâĂ©criture dans le pipe permettait ensuite dâĂ©craser la page cache associĂ©e au fichier cible
Conceptuellement :
Fichier read-only
â
Page cache
â
splice()
â
pipe_buffer corrompu
â
write()
â
Modification du cache mémoire
Le disque nâĂ©tait mĂȘme pas forcĂ©ment modifiĂ© immĂ©diatement :
- seule la vue mémoire du fichier changeait
- ce qui suffisait pour exécuter du code arbitraire
Dirty Frag applique exactement la mĂȘme philosophie ⊠mais via la pile rĂ©seau.
Le cĆur technique de Dirty Frag
Selon les premiĂšres analyses publiques, Dirty Frag exploite deux classes de bugs :
xfrm-ESP Page-Cache WriteRxRPC Page-Cache Write
La vulnérabilité cible le champ frag des structures sk_buff.
Les structures sk_buff
Dans Linux, presque tout le trafic réseau transite via :
struct sk_buff
Cette structure représente un paquet réseau.
Elle contient :
- les headers
- les métadonnées
- les pointeurs
- les fragments mémoire associés au paquet
Exemple simplifié :
struct sk_buff {
...
skb_frag_t frags[MAX_SKB_FRAGS];
...
};
Les frags permettent :
- dâĂ©viter les copies mĂ©moire
- de référencer directement des pages existantes
- notamment dans les chemins réseau zero-copy
Câest prĂ©cisĂ©ment lĂ que Dirty Frag devient dangereux.
Le mécanisme « zero-copy »
Linux utilise massivement des optimisations zero-copy :
splice()sendfile()MSG_ZEROCOPY- chemins DMA réseau
- transferts page-cache â socket
Le principe :
Au lieu de :
fichier â buffer â socket
Linux fait :
page cache â socket
Donc :
- aucune copie
- meilleures performances
- moins de CPU
Mais cela implique quâune page issue dâun fichier peut ĂȘtre directement attachĂ©e Ă un buffer rĂ©seau.
Et si ce buffer réseau devient modifiable ⊠la page cache originale devient modifiable aussi.
Lâerreur logique exploitĂ©e
Dirty Frag semble provenir dâun problĂšme de gestion :
- des références mémoire
- des droits dâĂ©criture
- et des flags associés aux fragments réseau
Le scénario général ressemble à ceci :
1. Référence vers page cache protégée
2. Injection dans skb->frag
3. Réutilisation incorrecte du fragment
4. Ăcriture autorisĂ©e
5. Corruption du page cache
6. Exécution privilégiée
Autrement dit, le noyau croit manipuler un buffer rĂ©seau modifiable, alors quâil manipule en rĂ©alitĂ© une page issue dâun fichier systĂšme protĂ©gĂ©.
Pourquoi lâexploitation est particuliĂšrement grave
Plusieurs Ă©lĂ©ments rendent Dirty Frag extrĂȘmement critique.
1. Pas de race condition
Contrairement Ă Dirty COW :
- pas besoin de synchronisation complexe
- pas de compétition entre threads
- pas de timing précis
Le bug est déterministe.
2. TrÚs forte stabilité
Les premiers retours indiquent :
- taux de réussite élevé
- absence fréquente de kernel panic
- exploitation reproductible
Câest extrĂȘmement rare pour une LPE noyau moderne.
3. Surface dâimpact Ă©norme
La faille affecterait :
- Ubuntu
- Debian
- Fedora
- RHEL
- AlmaLinux
- Arch
- OpenSUSE
- WSL2
- et probablement la majorité des noyaux ℠4.14
ChaĂźne dâexploitation typique
Une exploitation réaliste pourrait suivre cette logique :
Utilisateur non privilégié
â
CrĂ©ation dâun chemin rĂ©seau vulnĂ©rable
â
RĂ©fĂ©rence vers page cache dâun fichier SUID
â
Corruption du contenu mémoire
â
Injection de payload
â
Exécution du binaire SUID
â
root
Le scénario le plus classique consiste à cibler :
/usr/bin/su/usr/bin/sudo/etc/passwd- ou dâautres fichiers utilisĂ©s par des processus privilĂ©giĂ©s.
Pourquoi les modules ESP et RxRPC sont impliqués
Les mitigations temporaires recommandent de désactiver :
esp4
esp6
rxrpc
Cela suggĂšre fortement que :
- certains chemins IPsec (
xfrm) - et certains mécanismes RxRPC
- exposent les primitives vulnérables
Le point intéressant est que :
- ces modules manipulent énormément de fragments réseau
- utilisent des chemins optimisés
- et réemploient agressivement des pages mémoire
Autrement dit, Dirty Frag semble ĂȘtre un effet secondaire classique de lâoptimisation zero-copy poussĂ©e Ă lâextrĂȘme.
Comparaison Dirty Pipe vs Dirty Frag
| Caractéristique | Dirty Pipe | Dirty Frag |
|---|---|---|
| Sous-systÚme | Pipes | Réseau |
| Structure vulnérable | pipe_buffer | sk_buff |
| Primitive clé | splice() | Fragments réseau |
| Cible | Page cache | Page cache |
| Race condition | Non | Non |
| Difficulté exploitation | Faible | Faible |
| Impact | Root local | Root local |
| Type | Page-cache overwrite | Page-cache overwrite |
Dirty Frag démontre surtout une chose importante :
la classe entiĂšre des « page-cache write primitives » est loin dâĂȘtre Ă©radiquĂ©e.
Pourquoi cette famille de bugs continue dâapparaĂźtre
Le problĂšme est structurel.
Linux moderne repose massivement sur :
- le partage mémoire
- les optimisations zero-copy
- les références croisées
- les buffers réutilisables
Plus les performances augmentent, plus les frontiĂšres deviennent floues entre :
- mémoire réseau
- mémoire fichier
- mémoire utilisateur
- cache disque
Chaque optimisation réduit les copies, mais augmente le couplage entre sous-systÚmes.
Et chaque couplage augmente le risque :
- dâalias mĂ©moire
- de confusion de permissions
- ou de corruption logique
Dirty Frag illustre parfaitement cette tendance.
Implications sécurité réelles
MĂȘme si Dirty Frag est une LPE (donc locale), la menace est Ă©norme car aujourdâhui :
- un conteneur compromis
- un shell web
- une clé SSH volée
- un utilisateur low-privilege
- une sandbox cassée
suffisent à obtenir root immédiatement.
Dans une infrastructure moderne :
- Kubernetes
- Docker
- CI/CD
- hébergement mutualisé
- environnements cloud
une LPE fiable devient souvent lâĂ©tape finale dâune compromission complĂšte.
Mitigations actuelles
En attendant les correctifs noyau :
cat <<EOF | sudo tee /etc/modprobe.d/disable-dirtyfrag.conf
install esp4 /bin/false
install esp6 /bin/false
install rxrpc /bin/false
EOF
sudo modprobe -r esp4 esp6 rxrpc
Mais attention :
- cela peut casser IPsec
- certains VPN
- certaines fonctionnalités réseau avancées
Conclusion
Dirty Frag est probablement lâune des vulnĂ©rabilitĂ©s Linux les plus intĂ©ressantes techniquement depuis Dirty Pipe.
Elle démontre plusieurs réalités fondamentales :
- les primitives zero-copy restent extrĂȘmement dangereuses
- le page cache Linux constitue une surface dâattaque critique
- les frontiÚres entre réseau et fichiers deviennent de plus en plus poreuses
- les bugs logiques sont désormais plus dangereux que les corruptions mémoire classiques
Surtout, Dirty Frag montre que la classe entiĂšre des vulnĂ©rabilitĂ©s « Dirty-* » nâest pas un accident isolĂ©, mais probablement une consĂ©quence structurelle de lâarchitecture moderne du noyau Linux.
Et tant que Linux continuera à privilégier :
- les performances
- le partage mémoire
- les chemins sans copie
de nouvelles variantes apparaĂźtront probablement encore.
2 Comments