
Detector + PoC per le vulnerabilità di scrittura nella cache delle pagine di Linux: Copy Fail (CVE-2026-31431) e Dirty Frag (CVE-2026-43284/43500). Solo ricerca sulla sicurezza autorizzata.
Un rilevatore e harness PoC unificati per le famiglie di vulnerabilità di scrittura cache di pagina Linux Copy Fail e Dirty Frag.``` ██████╗ ██╗██████╗ ████████╗██╗ ██╗███████╗ █████╗ ██╗██╗ ██╔══██╗██║██╔══██╗╚══██╔══╝╚██╗ ██╔╝██╔════╝██╔══██╗██║██║ ██║ ██║██║██████╔╝ ██║ ╚████╔╝ █████╗ ███████║██║██║ ██║ ██║██║██╔══██╗ ██║ ╚██╔╝ ██╔══╝ ██╔══██║██║██║ ██████╔╝██║██║ ██║ ██║ ██║ ██║ ██║ ██║██║███████╗ ╚═════╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝╚══════╝
DIRTYFAIL è un piccolo strumento C ben documentato per ricercatori di sicurezza. Rileva se un host Linux è vulnerabile alle tre CVE di questa famiglia e — con conferma esplicita e digitata — esegue una vera prova di concetto che fa cadere il chiamante in una shell di root su un sistema vulnerabile.
| CVE / variante | Nome | Copertura DIRTYFAIL |
|---|---|---|
| **CVE-2026-31431** | Copy Fail (algif_aead `authencesn` page-cache write) | Rilevamento + PoC completo |
| **CVE-2026-43284 v4** | Dirty Frag — IPv4 xfrm-ESP page-cache write | Rilevamento + PoC completo |
| **CVE-2026-43284 v6** | Dirty Frag — IPv6 xfrm-ESP page-cache write (`esp6`) | Rilevamento + PoC completo |
| **CVE-2026-43500** | Dirty Frag — RxRPC page-cache write | Rilevamento + PoC completo |
| Variante Copy Fail GCM | xfrm-ESP `rfc4106(gcm(aes))` page-cache write | Rilevamento + PoC completo |
**Modalità bonus:**
- **`--scan --active`** — sonde attive sentinel-STORE. Per default, `--scan` riporta le precondizioni per CVE (kernel, moduli, stato LSM) più una sonda attiva della primitiva Copy Fail. Aggiungendo `--active` si estende la sonda STORE del file sentinella a tutte le altre quattro primitive (ESP v4, ESP v6, RxRPC, GCM): ciascuna attiva il trigger del kernel contro una sentinella `/tmp` e segnala VULNERABILE solo se i byte marcatori atterrano effettivamente. Questo è l'unico modo per distinguere un kernel con patch backportata (le precondizioni dicono vulnerabile ma la sonda dice intatto) da uno senza patch senza eseguire l'exploit completo. `/etc/passwd` non viene mai toccato. Autocalibra lo spostamento V6 STORE per build del kernel.
- **`--exploit-backdoor`** — backdoor persistente uid-0: sovrascrittura con corrispondenza di lunghezza di una riga `nologin`/`false`/`sync` in `/etc/passwd` con `dirtyfail::0:0:<pad>:/:/bin/bash`. Sopravvive all'uscita della shell finché la pagina non viene espulsa. Stato salvato in `/var/tmp/.dirtyfail.state` per `--cleanup-backdoor`. Il nome utente `dirtyfail` è deliberatamente abbinato a questo progetto in modo che sia immediatamente identificabile in qualsiasi audit — cambia `NEW_USER` in `src/backdoor.c` se hai bisogno di un identificatore diverso per un impegno autorizzato di red team.
- **AppArmor bypass** — sconfigge la policy `apparmor_restrict_unprivileged_userns=1` di Ubuntu tramite una re-esecuzione `change_onexec("crun")` a salto singolo in un profilo non confinato che mantiene le capacità userns. Ogni modalità di exploit gestisce questo internamente tramite una fork: il genitore rimane nel namespace init, il figlio esegue la danza di bypass, il genitore legge la cache di pagina globale ed esegue `su` per ottenere root reale del namespace init. Il flag legacy `--aa-bypass` esiste ancora per il debug isolato della meccanica di bypass. Vedi [§8.5 Architettura](#85-architecture-outerinner-fork-based-bypass).
## Verificato funzionante su
DIRTYFAIL è stato convalidato empiricamente end-to-end su più distribuzioni e versioni del kernel. La matrice seguente riflette i risultati dei test per modalità dell'esecuzione di ciascuna modalità `--exploit-*` su un'installazione pulita di ciascuna distribuzione.
| Distro | Kernel | LSM | Copy Fail | xfrm-ESP v4 | xfrm-ESP v6 | RxRPC | GCM | Backdoor | SU shellcode |
|---|---|---|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| Ubuntu 24.04 LTS | `6.8.0-111-generic` | AppArmor | 🛡² | ✅ | ✅ | ✅ | ✅¹ | ✅¹ | (non testato) |
| Debian 13.4 | `6.12.86+deb13` | nessuno | 🛡 | 🛡 | 🛡 | 🛡 | 🛡 | 🛡 | 🛡⁵ |
| AlmaLinux 10.1 | `6.12.0-124.8.1.el10_1` | SELinux | ✅ | ✅ | ✅ | ⏭³ | ✅ | ✅ | ✅ |
| Fedora 44 (Server) | `6.19.10-300.fc44` | SELinux | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Ubuntu 26.04 LTS | `7.0.0-15-generic` | AppArmor (rafforzato) | 🛡 | 🛡⁴ | 🛡⁴ | 🛡⁴ | 🛡⁴ | 🛡⁴ | 🛡⁵ |
**Legenda:** ✅ exploit atterrato e ha prodotto root reale del namespace init · 🛡 mitigato — l'exploit non può raggiungere il bug del kernel (kernel patchato O LSM blocca il percorso non privilegiato) · ⏭ non applicabile (precondizione mancante)
### Convalida sonda attiva (`--scan --active`)
Il flag `--active` aggiunge una sonda STORE per file sentinella per CVE durante il rilevamento. Abbiamo convalidato gli output della sonda contro le stesse 4 distribuzioni sopra (Debian, Fedora, AlmaLinux, Ubuntu 26.04) — la matrice seguente mostra il verdetto della sonda per modalità e corrisponde uno-a-uno con la verità di base dell'exploit completo:
| Distro | Sonda Copy Fail | Sonda ESP v4 | Sonda ESP v6 | Sonda RxRPC | Sonda GCM |
|---|:-:|:-:|:-:|:-:|:-:|
| Debian 13.4 | intatta 🛡 | intatta 🛡 | intatta 🛡 | intatta 🛡 | intatta 🛡 |
| Fedora 44 | marker @0 ✅ | STORE @0 ✅ | STORE @8 ✅ | byte cambiato ✅ | sentinel[0] 0x41→0x27 ✅ |
| AlmaLinux 10.1 | marker @0 ✅ | STORE @0 ✅ | STORE @8 ✅ | precondizioni ⏭ | sentinella cambiata ✅ |
| Ubuntu 26.04 | intatta 🛡 | bloccata da LSM 🛡 | bloccata da LSM 🛡 | bloccata da LSM 🛡 | bloccata da LSM 🛡 |
L'offset di atterraggio STORE della sonda V6 (8 su Fedora e Alma) corrisponde allo `V6_STORE_SHIFT` empirico che `calibrate_v6_shift()` scopre in esecuzione — confermando che l'autocalibrazione sostituisce correttamente la costante precedentemente hard-coded tra le build del kernel.
¹ GCM e Backdoor richiedono che `algif_aead` sia caricabile. Ubuntu 24.04 include `/etc/modprobe.d/disable-algif_aead.conf` che lo mette in blacklist come mitigazione di Copy Fail. Rimossa la blacklist (ad esempio su un kernel precedente alla mitigazione), entrambe le modalità funzionano end-to-end.
² Il percorso `algif_aead` di Copy Fail è mitigato dalla blacklist modprobe; la primitiva CVE sottostante nel kernel è la stessa sia che `authencesn` sia raggiungibile o meno. xfrm-ESP, RxRPC e la variante GCM atterrano tutte sullo stesso kernel perché non passano attraverso `algif_aead`.
³ Il pacchetto `kernel-modules-extra` di AlmaLinux 10 non è installato per default su un'installazione Minimal, quindi `rxrpc.ko` manca sul disco. Installando `kernel-modules-extra-$(uname -r)` da EPEL o dal repository extras di AlmaLinux si riporta il modulo; su un'installazione minimal standard RxRPC non è raggiungibile.
⁴ **Ubuntu 26.04 LTS blocca in modo completo lo sfruttamento non privilegiato.** Il kernel in distribuzione `7.0.0-15.15` (rilasciato il 22-04-2026) **precede la patch mainline `f4c50a4034e6` (incorporata il 07-05-2026) di circa 2 settimane** — quindi il bug È ancora presente nel kernel. La difesa di Ubuntu è **difesa in profondità tramite rafforzamento di AppArmor**, non una patch del kernel: