
Analisi - POC - Mitigazione
Solo a scopo educativo. NON utilizzare su sistemi senza autorizzazione esplicita.
| Campo | Valore |
|---|---|
| CVE | CVE-2026-31431 |
| Alias | Copy Fail |
| CVSS | 7.8 (High) |
| Tipo | Local Privilege Escalation (LPE) |
| Kernel interessato | 2017 – 2026 (commit 72548b093ee3 in poi) |
| Fix upstream | commit a664bf3d603d (revert del 2017) |
| Divulgazione | 29 aprile 2026 (Theori / Xint Code) |
Copy Fail è un bug logico deterministico (non richiede race condition) nel sottosistema crittografico del kernel Linux. Permette a un utente senza privilegi di scrivere 4 byte controllati nella page cache di qualsiasi file leggibile del sistema, inclusi binari setuid come su o sudo.
A differenza di vulnerabilità precedenti simili:
Linux kernel — crypto/authencesn.c
└── algif_aead (modulo AF_ALG)
└── ottimizzazione in-place (commit 72548b093ee3, 2017)
└── scrittura scratch AEAD → supera il confine dello scatterlist
└── scrive 4 byte nella page cache di un file esterno
Distribuzioni interessate: Ubuntu, Debian, RHEL, Amazon Linux, SUSE, Fedora, Arch, AlmaLinux — qualsiasi distribuzione con kernel ≥ 2017.
Nel 2017 è stata introdotta un'ottimizzazione per cui req->src e req->dst puntano allo stesso scatterlist combinato. Questo fa sì che le pagine della page cache (provenienti da splice()) vengano collegate direttamente nello scatterlist di destinazione scrivibile.
1. Aprire un socket AF_ALG con algoritmo authencesn
2. Usare splice() per alimentare pagine della page cache del binario target
verso il socket AF_ALG (es: /usr/bin/sudo)
3. Eseguire un'operazione di decifratura AEAD
4. authencesn usa il buffer di destinazione come scratch pad →
scrive seqno_hi (4 byte controllati) FUORI dall'output legittimo,
superando il confine dello scatterlist
5. I 4 byte finiscono nella pagina della page cache del binario target
6. Il file su disco NON cambia → i controlli di integrità non rilevano nulla
7. Il binario modificato in memoria esegue il payload → root
La scrittura bypassa il normale percorso VFS di scrittura. Il file su disco rimane intatto. Strumenti come sha256sum, aide, tripwire o inotify non rilevano la modifica perché operano sul file su disco o sull'inode, non sulla page cache in memoria.
Il lab utilizza un kernel vulnerabile per dimostrare la corruzione della page cache. In ambienti Docker, l'escalation completa dei privilegi dipende dalla configurazione dell'host (kernel condiviso).
# Clonare il repo
cd cve-2026-31431
# Costruire l'immagine vulnerabile
docker build -t copyfail-lab -f docker/Dockerfile.vulnerable .
# Eseguire il lab
docker run --rm -it \
--cap-add=NET_ADMIN \
--security-opt seccomp=unconfined \
copyfail-lab bash
# All'interno del contenitore:
cd /lab
python3 exploit/poc.py
os.splice)Vedi exploit/poc.py e exploit/README.md.
Il PoC dimostra:
Vedi mitigation/README.md per istruzioni dettagliate.
TL;DR — Mitigazione immediata (senza riavvio):
# Disabilitare il modulo interessato
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo modprobe -r algif_aead 2>/dev/null || true
Fix definitivo: Aggiornare il kernel a una versione patchata (dopo a664bf3d603d).
cve-2026-31431/
├── README.md ← questo file
├── docs/
│ ├── technical-analysis.md ← analisi tecnica approfondita
│ └── affected-kernels.md ← tabella versioni affette/patchate
├── exploit/
│ ├── README.md ← documentazione del PoC
│ └── poc.py ← proof of concept (Python 3.10+)
├── mitigation/
│ ├── README.md ← guida alla mitigazione
│ ├── disable-algif.conf ← configurazione modprobe
│ └── check-vulnerable.sh ← script di rilevamento
├── docker/
│ ├── Dockerfile.vulnerable ← lab vulnerabile
│ └── Dockerfile.patched ← lab con mitigazione applicata
└── scripts/
└── setup-lab.sh ← automazione del lab
a664bf3d603d| Vuln | Tipo | Richiede race? | Portabile? | Dimensione exploit |
|---|
| Dirty Cow (CVE-2016-5195) | CoW race | Sì | Parziale | ~KB |
| Dirty Pipe (CVE-2022-0847) | pipe buffer | No | Limitate | ~KB |
| Copy Fail (CVE-2026-31431) | Logico | No | Totale | 732 byte |
| Data | Evento |
|---|
| 2017 | Commit 72548b093ee3 introduce il bug nel kernel |
| ~2025 | Theori/Xint Code inizia l'analisi del sottosistema crypto |
| 28 apr 2026 | Coordinamento con i distributori |
| 29 apr 2026 | Divulgazione pubblica + PoC pubblicato |
| 1 mag 2026 | Kernel patchati disponibili nei repo di produzione |
| 1 mag 2026 | Aggiunto al catalogo CISA KEV |