
CVE-2025-40271 Modifié par MadEploits
Preuve de concept pour une vulnérabilité d'escalade de privilèges locale dans le système de fichiers proc du noyau Linux. Le bogue est un use-after-free dans proc_readdir_de() causé par rb_erase() sans RB_CLEAR_NODE(), laissant des liens d'arbre rouge-noir obsolètes qui peuvent être exploités par une course lors de l'énumération de répertoire.
Auteur : MadExploits
Recherche originale sur la vulnérabilité et PoC C par Aviral Srivastava (N-DAY RESEARCH). Ce dépôt inclut un portage shell (
exploit.sh) pour les environnements où la compilation n'est pas pratique.
| Champ | Détail |
|---|---|
| CVE | CVE-2025-40271 |
| Composant | fs/proc — proc_readdir_de() / remove_proc_entry() |
| Type | Use-after-free (liens rb-tree obsolètes) |
| Impact | Escalade de privilèges locale (LPE) |
| Architecture | x86_64 |
| Affecté | Noyaux Linux jusqu'à 6.18-rc5 |
Lorsqu'une entrée de répertoire proc est supprimée, rb_erase() est appelée sur le nœud rb de l'entrée sans RB_CLEAR_NODE(). Les nœuds libérés peuvent rester accessibles via des liens d'arbre obsolètes. Si getdents64() entre en course avec la suppression d'interface sous /proc/self/net/dev_snmp6/, le noyau peut lire de la mémoire libérée — souvent récupérée par des objets msg_msg pulvérisés — et renvoyer des valeurs d_ino anormales qui divulguent des pointeurs de tas du noyau.
Le PoC vérifie la version du noyau en cours et se ferme sur les versions corrigées :
| Branche |
|---|
| Fichier | Description |
|---|---|
exploit.c | PoC C complet — gestion des veth netlink, course pthread, spray msg_msg |
exploit.sh | Portage shell sans compilation — unshare, ip, Python 3 embarqué pour les appels système / course |
Les deux implémentations suivent le même flux d'exploitation :
CAP_NET_ADMIN dans le ns réseau)/proc/self/net/dev_snmp6/getdents64() contre la suppression rapide de veth + pulvérisation du tasd_ino qui ressemblent à des pointeurs du noyaucat /proc/sys/kernel/unprivileged_userns_clone
# doit être 1
exploit.cgcc avec pthreadslinux/netlink.h, etc.)gcc -o exploit exploit.c -lpthread
exploit.shbashpython3ip (iproute2)unshare (util-linux avec support de --map-root-user)Aucun compilateur requis.
chmod +x exploit.sh
./exploit.sh
gcc -o exploit exploit.c -lpthread
./exploit
Noyau vulnérable — UAF déclenché (succès partiel) :
[+] Kernel X.Y.Z — VULNERABLE
[+] Namespace ready...
[+] Created 32 veth pairs (/proc/self/net/dev_snmp6 populated)
[+] UAF HIT! d_ino=0xffff8880........ (kernel heap pointer)
[+] Kernel heap leak: 0xffff8880........
[*] PARTIAL SUCCESS: UAF + heap leak DEMONSTRATED
Noyau corrigé :
[-] Kernel X.Y.Z — PATCHED
[*] Kernel is patched. Nothing to do.
d_ino contient une valeur correspondant au motif de pointeur du noyau x86_64 (0xffff000000000000), provenant généralement de l'en-tête msg_msg m_list chevauchant les données proc_dir_entry libérées.modprobe_path nécessite le décalage entre l'adresse de tas divulguée et la base du texte du noyau — celui-ci est spécifique à la build (KASLR). Le PoC démontre l'UAF et la fuite ; une chaîne complète nécessite des offsets pour votre image noyau cible.sysctl -w kernel.unprivileged_userns_clone=0
Ce projet est fourni à des fins de recherche en sécurité autorisée, d'éducation et de tests défensifs uniquement.
| Rôle | Nom |
|---|---|
| Auteur du dépôt | MadExploits |
| Recherche CVE originale & PoC C | Aviral Srivastava — N-DAY RESEARCH |
Utilisation à vos risques et périls. Aucune garantie n'est fournie.
| Corrigé dans |
|---|
| 5.10.x | 5.10.247+ |
| 6.1.x | 6.1.159+ |
| 6.6.x | 6.6.123+ |
| 6.12.x | 6.12.73+ |
| 6.18+ | 6.18-rc6+ |
| 7.x+ | Corrigé |