
CVE-2025-40271 Modificato da MadEploits
Proof-of-concept per una vulnerabilità di escalation dei privilegi locali nel filesystem proc del kernel Linux. Il bug è un use-after-free in proc_readdir_de() causato da rb_erase() senza RB_CLEAR_NODE(), che lascia collegamenti stantii nell'albero rosso-nero sfruttabili tramite race condition durante l'enumerazione delle directory.
Autore: MadExploits
Ricerca originale sulla vulnerabilità e PoC in C a cura di Aviral Srivastava (N-DAY RESEARCH). Questa repository include una versione shell (
exploit.sh) per ambienti in cui la compilazione non è pratica.
| Campo | Dettaglio |
|---|---|
| CVE | CVE-2025-40271 |
| Componente | fs/proc — proc_readdir_de() / remove_proc_entry() |
| Tipo | Use-after-free (collegamenti stantii nell'albero rb) |
| Impatto | Escalation dei privilegi locali (LPE) |
| Architettura | x86_64 |
| Versioni interessate | Kernel Linux fino alla 6.18-rc5 |
Quando una voce di directory in proc viene rimossa, rb_erase() viene chiamato sul nodo rb della voce senza RB_CLEAR_NODE(). I nodi liberati possono rimanere raggiungibili tramite collegamenti stantii dell'albero. Se getdents64() entra in race condition con la rimozione dell'interfaccia in /proc/self/net/dev_snmp6/, il kernel potrebbe leggere memoria liberata — spesso rioccupata da oggetti msg_msg iniettati tramite heap spray — e restituire valori anomali di d_ino che rivelano puntatori dell'heap del kernel.
Il PoC controlla la versione del kernel in esecuzione e termina sulle build patchate:
| Branch |
|---|
| File | Descrizione |
|---|---|
exploit.c | PoC completo in C — gestione veth via netlink, race con pthread, spray di msg_msg |
exploit.sh | Versione shell senza compilazione — unshare, ip, Python 3 integrato per syscall/race |
Entrambe le implementazioni seguono lo stesso flusso di sfruttamento:
CAP_NET_ADMIN nel net ns)/proc/self/net/dev_snmp6/getdents64() in race con la rapida eliminazione delle veth + heap sprayd_ino simili a puntatori del kernelcat /proc/sys/kernel/unprivileged_userns_clone
# must be 1
exploit.cgcc con pthreadslinux/netlink.h, ecc.)gcc -o exploit exploit.c -lpthread
exploit.shbashpython3ip (iproute2)unshare (util-linux con supporto a --map-root-user)Nessun compilatore richiesto.
chmod +x exploit.sh
./exploit.sh
gcc -o exploit exploit.c -lpthread
./exploit
Kernel vulnerabile — UAF innescato (successo parziale):
[+] 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
Kernel patchato:
[-] Kernel X.Y.Z — PATCHED
[*] Kernel is patched. Nothing to do.
d_ino contiene un valore che corrisponde al pattern dei puntatori del kernel x86_64 (0xffff000000000000), tipicamente dovuto all'header m_list di msg_msg che si sovrappone ai dati del proc_dir_entry liberato.modprobe_path richiede l'offset tra l'indirizzo dell'heap rivelato e la base del testo del kernel — questo è specifico della build (KASLR). Il PoC dimostra l'UAF e il leak; una catena completa richiede gli offset per l'immagine del kernel di destinazione.sysctl -w kernel.unprivileged_userns_clone=0
Questo progetto è fornito solo per ricerca sulla sicurezza autorizzata, formazione e test difensivi.
| Ruolo | Nome |
|---|---|
| Autore della repository | MadExploits |
| Ricerca originale sulla CVE e PoC in C | Aviral Srivastava — N-DAY RESEARCH |
Uso a proprio rischio. Nessuna garanzia fornita.
| Corretta in |
|---|
| 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+ | Patchata |