
Toolkit di ricerca e rilevamento per la LPE del kernel Linux CVE-2026-31431, che include analisi degli exploit, regole YARA, rilevamento auditd/Falco, guida alla patch e ambiente di laboratorio.
algif_aeadCISA KEV | CVSS 7.8 ALTO | Interessa i kernel Linux 4.14 – inizio 2026 (~9 anni)
CVE-2026-31431, soprannominata "Copy Fail", è una vulnerabilità di escalation dei privilegi locali (LPE) ad alta gravità nel sottosistema crittografico del kernel Linux. Un utente locale con privilegi bassi può ottenere root in pochi secondi su qualsiasi sistema non patchato.
| Attributo | Valore |
|---|---|
| CVE | CVE-2026-31431 |
| Soprannome | Copy Fail |
| CVSS v3.1 | 7.8 ALTO |
| Vettore di Attacco | Locale |
| Privilegi Richiesti | Bassi |
| Interazione Utente | Nessuna |
| Componente | crypto/algif_aead.c — template authencesn |
| Introdotta | 2017 (commit 72548b093ee3) |
| Divulgata | 2026 |
| Anni di Silenzio | ~9 anni |
| CISA KEV | Sì |
| PoC Pubblico | Sì (script Python autonomo da 732 byte) |
detection/check_vulnerable.sh prima e dopo la correzione.CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
| Metrica | Valore | Motivazione |
|--------|-------|-----------|
| Vettore di attacco | **Locale** | Richiede accesso alla shell (SSH, exec in container, fisico) |
| Complessità dell'attacco | **Bassa** | Affidabile, completamente automatizzato — nessuna race condition richiesta |
| Privilegi richiesti | **Bassi** | Qualsiasi account utente non privilegiato |
| Interazione utente | **Nessuna** | Nessuna interazione con la vittima richiesta |
| Riservatezza | **Alta** | Compromissione completa del sistema |
| Integrità | **Alta** | Compromissione completa del sistema |
| Disponibilità | **Alta** | Compromissione completa del sistema |
### Panorama delle minacce
| Fattore | Valutazione |
|--------|-----------|
| Disponibilità del PoC | Pubblico, armato, Python standalone da 732 byte |
| Affidabilità dell'exploit | Alta — funziona sulle distro testate senza modifiche |
| Difficoltà di rilevamento | Alta — nessuna scrittura su disco, nessuna dirty page |
| Competenza richiesta all'attaccante | Bassa — script kiddie con PoC pubblico |
| CISA KEV | Aggiunto nel 2026 — monitorato attivamente |
| Microsoft Defender | Segnalato come sotto indagine attiva |
### Ambienti interessati
| Ambiente | Rischio |
|-------------|------|
| Server Linux bare-metal | Critico |
| VM Linux (cloud o on-premise) | Critico |
| Nodi Kubernetes | Critico (consente anche la fuga dal container) |
| Host Docker | Critico |
| Hosting condiviso / multi-tenant | Critico |
| WSL2 / Linux su Windows | Valutare in base alla versione del kernel |
---
## 3. Approfondimento tecnico
### 3.1 Contesto: AF_ALG e AEAD
Il kernel Linux espone le operazioni crittografiche agli utenti tramite **socket AF_ALG** (`AF_ALG = 38`). Questa interfaccia (`algif_aead`) consente alle applicazioni non privilegiate di invocare gli acceleratori hardware crittografici del kernel senza necessitare di codice in modalità kernel.
Gli algoritmi **AEAD** (Authenticated Encryption with Associated Data) come AES-GCM e ChaCha20-Poly1305 sono ampiamente utilizzati per TLS, crittografia del disco e protocolli VPN. Il template vulnerabile è `authencesn` — una composizione AEAD che utilizza `hmac(sha256)` + `cbc(aes)` con supporto Extended Sequence Number (ESN), comunemente usato in IPsec.
### 3.2 Causa principale
Nel 2017, il commit `72548b093ee3` ha introdotto l'**operazione AEAD in-place** in `algif_aead` come ottimizzazione delle prestazioni — consentendo al motore crittografico di leggere e scrivere lo stesso buffer. Questo era difettoso:```
The bug chain:
1. Caller binds AF_ALG socket to:
authencesn(hmac(sha256),cbc(aes))
2. Caller sends a decryption request via sendmsg() with specific flags
3. Caller uses splice() to feed PAGE CACHE PAGES from an open file
descriptor directly into the socket's scatterlist
4. The authencesn template, during ESN header processing, uses the
OUTPUT BUFFER as scratch space — writing 4 bytes past the
expected output boundary
5. Because the scatterlist contains page cache pages (not private
copies), this scratch write lands DIRECTLY IN THE PAGE CACHE
6. Page cache is shared kernel-wide — all processes reading the
same file now see the modified bytes
Key insight: splice() is zero-copy — it hands page cache references
to the socket. The in-place "optimization" then writes INTO those
pages. No dirty bit is set because the write goes through the crypto
engine, not the normal write path.
La vulnerabilità fornisce una scrittura controllata di 4 byte nella cache delle pagine di qualsiasi file che l'attaccante può aprire in lettura:
| Proprietà | Valore |
|---|---|
| Dimensione della scrittura | 4 byte |
| Controllo dell'offset | Sì — controllato dall'attaccante tramite l'offset di splice |
| Destinazione | Cache delle pagine di qualsiasi file leggibile |
| Marcatura della pagina sporca | Nessuna |
| Modifica su disco | Nessuna |
| Aggiornamento del timestamp | Nessuno |
| Voce nel log del kernel | Nessuna (a meno che auditd non sia configurato) |
La scrittura è ripetibile — l'exploit esegue in loop la scrittura di 4 byte per applicare patch a sequenze di codice più lunghe.
[1] Open /usr/bin/su (or any setuid-root binary) for reading ↓ [2] Map a copy to find target instruction bytes (e.g., UID check, execve path, security gate) ↓ [3] Compute exact page cache offset of target bytes ↓ [4] Set up AF_ALG socket → authencesn(hmac(sha256),cbc(aes)) ↓ [5] splice() the target binary's page cache into the socket ↓ [6] Trigger decryption → authencesn scratch write patches the target bytes in page cache (4 bytes per iteration) ↓ [7] Repeat for each 4-byte patch needed ↓ [8] Execute /usr/bin/su → runs root-owned setuid binary but now with attacker-controlled code in page cache ↓ [9] Root shell
### 3.5 Perché le Difese Standard Falliscono