🐧 Dirty Frag : anatomie d’une nouvelle Ă©lĂ©vation de privilĂšges critique dans le noyau Linux

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 :

  1. le contenu disque est chargé en mémoire
  2. stocké dans des pages RAM
  3. 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 un pipe_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 Write
  • RxRPC 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éristiqueDirty PipeDirty Frag
Sous-systÚmePipesRéseau
Structure vulnérablepipe_buffersk_buff
Primitive clésplice()Fragments réseau
CiblePage cachePage cache
Race conditionNonNon
Difficulté exploitationFaibleFaible
ImpactRoot localRoot local
TypePage-cache overwritePage-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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *