
Ansible playbook per il rilevamento e la correzione di CVE-2026-31431 (Copy Fail) - vulnerabilità di escalation dei privilegi locali nel kernel Linux
Copia Fallita Diagnosi e Risoluzione
Una suite di ruoli Ansible e playbook per rilevare e risolvere CVE-2026-31431 (Copy Fail), una vulnerabilità critica di escalation dei privilegi locali nel modulo algif_aead del kernel Linux.
🔗 GitHub: https://github.com/parmstro/cfDr
Il nome cfDr è un gioco di parole su "Copy Fail Doctor" - la tua cura affidabile per CVE-2026-31431.
CVE-2026-31431 (CVSS 7.8) è un difetto logico nell'interfaccia socket AEAD del kernel Linux (AF_ALG) scoperto nel 2026. La vulnerabilità consente a qualsiasi utente locale non privilegiato di elevare i propri privilegi a root in pochi secondi.
algif_aead (interfaccia crittografica AF_ALG)Versioni del Kernel: kernel Linux >= 4.10 (rilasciato nel 2017)
Distribuzioni Interessate:
Nota: Qualsiasi distribuzione Linux con kernel 4.10 o successivo è potenzialmente vulnerabile.
Questa vulnerabilità è particolarmente pericolosa perché:
Una volta che un attaccante ha qualsiasi forma di accesso locale (SSH, web shell, fuga dal container, ecc.), può:
In attesa delle patch del kernel fornite dai vendor, sono disponibili diverse strategie di mitigazione. cfDr le implementa tutte, con raccomandazioni intelligenti basate sulla configurazione del tuo sistema.
Non tutte le risoluzioni sono uguali. Ecco cosa devi sapere:
| Metodo | Root Può Bypassare? | Copertura | Supporto Enterprise Linux |
|---|---|---|---|
| Blacklist del Modulo | ✅ Sì (tramite insmod) | Impedisce il caricamento tramite modprobe | Tutte le versioni |
| Policy SELinux | ❌ NO (livello LSM) | Solo domini configurati | Tutte le versioni (predefinito) |
| seccomp di systemd | ❌ NO (filtro syscall) | Solo servizi configurati | Tutte le versioni |
| eBPF LSM | ❌ NO (livello LSM) | A livello di sistema (se configurato) | RHEL 9+, Fedora 34+ |
Raccomandazione predefinita di cfDr: Flag 3 (Blacklist del Modulo + SELinux)
Questo fornisce due livelli di protezione indipendenti:``` ┌─────────────────────────────────────────────────┐ │ Layer 1: Module Blacklist │ │ • Prevents modprobe algif_aead │ │ • Persists across reboots │ │ • CAN be bypassed by malicious root (insmod) │ ├─────────────────────────────────────────────────┤ │ Layer 2: SELinux Policy │ │ • Blocks AF_ALG socket() at syscall level │ │ • Works even if module is loaded │ │ • CANNOT be bypassed from userspace │ │ • Covers user_t, unconfined_t (majority cases) │ └─────────────────────────────────────────────────┘
Result: If either layer fails, the other still protects
### Perché la sola blacklist dei moduli non basta
Un attaccante determinato con accesso root può aggirare la blacklist dei moduli:```bash
# Module blacklist DOES NOT prevent:
insmod /lib/modules/$(uname -r)/kernel/crypto/algif_aead.ko.xz
Tuttavia, questo è accettabile perché:
Per una protezione completa e non aggirabile, è necessario:
Blacklist dei moduli + almeno uno dei seguenti:
cfDr utilizza flag bitwise per abilitare più mitigazioni:
| Valore Flag | Mitigazioni Abilitate | Caso d'Uso |
|---|---|---|
| 1 | Solo blacklist dei moduli | Protezione minima, sistemi senza SELinux |
| 2 | Solo SELinux | Ambienti solo SELinux |
| 3 | Blacklist dei moduli + SELinux | Predefinito CONSIGLIATO |
| 5 | Blacklist dei moduli + seccomp | Non-SELinux con hardening dei servizi |
| 7 | Blacklist dei moduli + SELinux + seccomp | Protezione avanzata |
| 15 | Tutte le mitigazioni | Protezione massima (solo RHEL 9+) |
Calcolo dei flag: 1 (blacklist) + 2 (SELinux) + 4 (seccomp) + 8 (eBPF) = somma
Protezione SELinux:
user_t, unconfined_t, httpd_t, postgresql_t, mysqld_tuser_t e unconfined_t coprono la stragrande maggioranza degli scenari d'attaccoProtezione seccomp di systemd:
httpd, nginx, postgresql, mariadb, redis, memcachedProtezione eBPF LSM:
cfDr esegue una valutazione completa su più dimensioni:
uname -r
- Determina se la versione del kernel è >= 4.10 (intervallo vulnerabile)
- Identifica la release del kernel e la distribuzione
#### 2. Verifica della disponibilità del modulo```bash
modinfo algif_aead
algif_aead esiste nel kernellsmod | grep algif_aead
- Determina se il modulo è attualmente caricato
- **Critico**: Modulo caricato = attivamente sfruttabile