
Copy Fail - CVE-2026-31431 - Implementazione C rinforzata per operazioni di red team e test di penetrazione autorizzati. ⚠️ Avviso legale: Questo strumento è destinato esclusivamente a ricerca sulla sicurezza autorizzata, test di penetrazione autorizzati e analisi difensiva. Usalo solo su sistemi di tua proprietà o per i quali hai ricevuto esplicito permesso scritto. L'accesso non autorizzato a sistemi informatici è illegale.
Implementazione C robusta per operazioni di red team e penetration testing autorizzato.
⚠️ Avviso legale: Questo strumento è destinato esclusivamente a ricerche di sicurezza autorizzate, penetration testing autorizzato e analisi difensiva. Utilizzalo solo su sistemi di tua proprietà o per i quali hai ottenuto esplicita autorizzazione scritta per il test. L'accesso non autorizzato ai sistemi informatici è illegale.
🚀 Lo sviluppo principale è stato spostato su GitLab.
Questo repository è attivamente mantenuto qui. Per problemi e contributi, si prega di utilizzare GitLab.
Questo progetto è una implementazione C robusta e pronta per la produzione dell'exploit di escalation dei privilegi locale CVE-2026-31431 ("Copy Fail"), originariamente divulgato da Theori e Xint il 29 aprile 2026.
Il proof-of-concept originale era scritto in Python e progettato per dimostrazione di ricerca. Questa implementazione lo trasforma in un toolkit di livello red team con:
| Attributo | Valore |
|---|---|
| Data di divulgazione | 29 aprile 2026 |
| Ricercatori | Theori (Jinoh Kang, Yonghwi Jin, Seunghyun Lee), Xint |
| Writeup | https://copy.fail/ |
| PoC originale | theori-io/copy-fail-CVE-2026-31431 (Python) |
| Porting C (Base) | tgies/copy-fail-c di Tony Gies |
| Kernel affetti | Linux 4.14 -- 6.14 (prima del commit di correzione a664bf3d603d) |
| Gravità | CVSS 7.8 (Alta) -- Escalation dei privilegi locale |
La vulnerabilità risiede nel sottosistema crypto AF_ALG del kernel Linux. Il template AEAD authencesn implementa un'ottimizzazione in-place per la decrittografia: quando il testo cifrato viene fornito tramite splice() dalla cache di pagina di un file, il kernel riutilizza la stessa pagina sia come sorgente che come destinazione.
Il flusso dell'attacco:
/usr/bin/su) in sola letturaauthencesn(hmac(sha256),cbc(aes)) tramite AF_ALGsplice() dalla cache di pagina del file targetexecve() sul target -- il kernel carica le pagine mutate dalla cache, concede credenziali setuid-rootPunto chiave: L'inode su disco non viene mai modificato. Viene mutata solo la cache di pagina in memoria, rendendo il rilevamento forense significativamente più difficile rispetto agli exploit tradizionali di sovrascrittura dei file.
Questo progetto estende la ricerca originale con indurimento orientato al red team attraverso nove moduli.
patch_chunk.c)| Caratteristica | Originale | La nostra implementazione |
|---|---|---|
| Gestione socket | Socket fresco per chunk | Riutilizzo socket (~60% meno chiamate di sistema) |
| Verifica | Nessuna | mmap + memcmp con tentativi automatici (3 tentativi) |
| Scritture parallele | Solo sequenziali | Parallelo basato su fork (fino a 16 processi) |
| Codici di errore | Successo/fallimento binario | Granulare: 0=verificato, 1=kernel corretto, -1=fatale |
| Allocazioni heap | malloc nel percorso critico | Solo stack (nessun jitter di allocazione) |
target_discovery.c)su, sudo, passwd, pkexec, mount, ping, ecc./snap (setuid non tradizionale)anti_forensics.c)| Tecnica | Scopo |
|---|---|
posix_fadvise(POSIX_FADV_DONTNEED) | Evizione della cache di pagina per file |
echo 3 > /proc/sys/vm/drop_caches | Cancellazione globale della cache (post-root) |
utimensat() timestomp | Ripristino di atime/mtime originali |
| Autodistruzione | Sovrascrivi il binario dropper con zeri prima di exec |
| Pulizia memoria | Azzeramento volatile dei buffer sensibili |
memfd_exec.c)kworker, anon_inode, eventfd (si confonde in /proc/$pid/fd/)stage1.c)| Canale | Furtività | Velocità | Priorità di fallback |
|---|---|---|---|
| Incorporato | Massima | Istantanea | Ultima (airgap) |
| HTTP diretto | Media | <1s | Prima |
| curl/wget di sistema | Bassa | 1-3s | Seconda (supporto HTTPS) |
| DNS TXT | Alta | Lenta | Terza (bypass firewall) |
stage2_template.c)SIGUSR1 (attiva), SIGUSR2 (stato), SIGTERM (spegnimento)[kworker/N:0] in ps/topproc_hide.c)/proc/$pid/cmdlineSSH_*, AWS_*, TOKEN*, ecc.setsid() + setpgid() per indipendenza dal terminalesignal_trigger.c)| Modalità | Comportamento | Caso d'uso |
|---|---|---|
trigger_oneshot() | Sleep → attiva → esegui → esci | Colpisci e scappa |
trigger_daemon() | Sleep → attiva → esegui → loop | Impianto persistente |
trigger_auto() | Sleep con timeout di fallback | Operazioni senza supervisione |
Attesa a zero CPU: sigsuspend() invece di cicli di polling.
sleep_jitter.c)getrandom(2), /dev/urandom, fallback rdtscsleep_scheduled() mantiene l'intervallo medio nonostante il jittercheck_sandbox_acceleration() rileva sleep() corretto