
Wazuh 4.14.4 regole di rilevamento per CVE-2026-31431 (Copy Fail) - Escalation dei privilegi locali su Linux tramite scrittura nella cache di pagina authencesn
Detection engineering per l'LPE del kernel Copy Fail · Ubuntu / RHEL / SUSE / Amazon Linux 2023 / Kali
CVE-2026-31431 è un bug logico nel template crittografico authencesn del kernel Linux. Consente a qualsiasi utente locale non privilegiato di eseguire una scrittura deterministica e controllata di 4 byte nella page cache di qualsiasi file leggibile sul sistema - senza richiedere race condition, offset del kernel o privilegi elevati.
Uno script Python 3.10+ di 732 byte che utilizza solo moduli della libreria standard (os, socket, zlib) sfrutta la vulnerabilità per ottenere root su tutte le principali distribuzioni Linux rilasciate dal 2017.
Il file su disco rimane invariato, rendendo il tradizionale monitoraggio dell'integrità dei file (FIM) completamente cieco.
Scoperto da Taeyang Lee (Theori / Xint) con l'assistenza dello strumento AI Xint Code.
La scrittura ha come bersaglio solo la page cache in memoria. Il kernel non marca mai la pagina come sporca, quindi il meccanismo di writeback non la persiste mai su disco. Il binario su disco rimane byte per byte identico all'originale.
Approccio FIM tradizionale:
legge file da disco -> calcola hash -> confronta -> nessuna anomalia segnalata
Realtà di Copy Fail:
file su disco = INVARIATO
page cache = CORROTTA
risultato FIM = CIECO
L'unico rilevamento efficace è comportamentale, tramite il monitoraggio delle syscall. Questo repository fornisce regole Wazuh validate in produzione che rilevano la catena di exploit a livello di syscall del kernel.
Passo 1: socket(38, 5, 0) socket AF_ALG - nessun privilegio richiesto
Passo 2: bind() Bind a authencesn - attiva il codice vulnerabile
Passo 3: sendmsg() Costruisce payload AAD - byte 4-7 = valore da scrivere
Passo 4: splice() [!] TRIGGER - le pagine della page cache entrano in SGL scrivibile
Passo 5: recv() authencesn scrive seqno_lo nella page cache
Passo 6: execve(/usr/bin/su) Il binario setuid corrotto esegue shellcode come UID 0
splice() è il passaggio critico. Consegna le pagine della page cache nello scatterlist scrivibile del socket AF_ALG senza copiarle - un'ottimizzazione in-place del 2017 in algif_aead.c che rendeva riutilizzabili le pagine del buffer della pipe nel SGL di destinazione. Quando authencesn.decrypt() viene eseguito, scrive in quelle pagine, che risultano essere la page cache del file bersaglio.
Tutte le distribuzioni Linux che distribuiscono kernel successivi al commit 72548b093ee3 (2017) sono interessate.
Fuga dal container: Copy Fail è anche un vettore di fuga dal container. La page cache è condivisa tra tutti i processi sull'host, inclusi quelli oltre i confini dei container. La Parte 2 di Xint copre lo sfruttamento in Kubernetes.
COPY-FAIL-Detection-with-Wazuh-4.14.4/
│
├── rules/
│ └── local_rules.xml # 8 regole di rilevamento Wazuh (199600-199607)
│
├── auditd/
│ └── cve-2026-31431.rules # regole sensore syscall auditd
│
├── sca/
│ └── cve_2026_31431.yml # policy SCA - indipendente dalla versione del kernel
│
└── docs/
├── pentlab_uid.png # Esecuzione PoC - root ottenuta su Kali
├── Rule-199604-TRIGs.png # Regola 199604 - 80 hit su pentlab
├── Rule_199604_Wazuh_Server_only.png # Regola 199604 - prima validazione
├── Splice_-_Non-root_process.png # Regole 199600/199601/199604 attivate
├── Modprobe_-_Possible_Algif_aed_load_attempt.png # Regola 199603
├── Pentlab-PoC.png # Regola 199603 sull'agente pentlab
├── exploit_chain_timeline.svg # Catena di Exploit
└── SCA_CVE-2026-31431.png # Punteggio policy SCA 75%
Due livelli indipendenti — nessuno dei due dipende dalla versione del kernel.
Il filtro uid!=0 copre utenti oltre gli account interattivi: account di servizio (www-data, postgres, jenkins), container e web shell senza sessione di login.
Regole sensore auditd (auditd/cve-2026-31431.rules):
-a always,exit -F arch=b64 -S socket -F a0=0x26 -F uid!=0 -k copy_fail_af_alg
-a always,exit -F arch=b32 -S socket -F a0=0x26 -F uid!=0 -k copy_fail_af_alg
-a always,exit -F arch=b64 -S splice -F uid!=0 -k copy_fail_splice
-w /usr/bin/su -p x -k copy_fail_execve_su
-w /usr/bin/kmod -p x -k copy_fail_modload
Controlli di configurazione automatizzati ogni 12 ore tramite sca/cve_2026_31431.yml. Nessuna versione del kernel richiesta.
Nota ingegneristica: Le regole 199600 e 199601 devono essere figlie della regola 92600 (processo Python, profondità 1), non della 80700. Il motore delle regole Wazuh segue un solo percorso di catena per evento. Posizionare le regole di rilevamento a profondità 2 sotto la 92600 garantisce che vincano la valutazione della catena rispetto alle regole sorelle (es. 92603-92606 in 0850-audit_rules.xml che corrispondono anch'esse a
if_group=audit + exe=python).
# Ubuntu / Debian / Kali
apt install auditd audispd-plugins -y
systemctl enable --now auditd
auditctl -s | grep enabled
# RHEL / Amazon Linux
yum install audit -y
systemctl enable --now auditd
# SUSE
zypper install audit -y
systemctl enable --now auditd
cp auditd/cve-2026-31431.rules /etc/audit/rules.d/
augenrules --load
auditctl -l | grep copy_fail
Output atteso:
-a always,exit -F arch=b64 -S socket -F a0=0x26 -F uid!=0 -F key=copy_fail_af_alg
-a always,exit -F arch=b32 -S socket -F a0=0x26 -F uid!=0 -F key=copy_fail_af_alg
-a always,exit -F arch=b64 -S splice -F uid!=0 -F key=copy_fail_splice
-w /usr/bin/su -p x -k copy_fail_execve_su
-w /usr/bin/kmod -p x -k copy_fail_modload
Le regole sono fornite in rules/local_rules.xml. Puoi unire il contenuto nel tuo /var/ossec/etc/rules/local_rules.xml esistente o distribuirle come file autonomo:
# Opzione A - file autonomo
cp rules/local_rules.xml /var/ossec/etc/rules/cve-2026-31431_rules.xml
# Opzione B - aggiungi a local_rules.xml
cat rules/local_rules.xml >> /var/ossec/etc/rules/local_rules.xml
# Valida la sintassi - deve uscire con 0 e zero warning
/var/ossec/bin/wazuh-analysisd -t 2>&1 | tail -5
# Riavvia il manager
systemctl restart wazuh-manager
cp sca/cve_2026_31431.yml /var/ossec/etc/shared/default/
Aggiungi a ossec.conf all'interno del blocco <sca>:
<policies>
<policy>/var/ossec/etc/shared/default/cve_2026_31431.yml</policy>
</policies>
systemctl restart wazuh-manager
Assicurati che Wazuh acquisisca il log auditd:
<!-- Aggiungi all'interno di <ossec_config> -->
<localfile>
<log_format>audit</log_format>
<location>/var/log/audit/audit.log</location>
</localfile>
# Crea un utente di test se necessario
useradd -m testuser 2>/dev/null || true
# Genera SEGNALE 1 - socket AF_ALG
su - testuser -c "python3 -c \"import socket; socket.socket(38, 5, 0); print('AF_ALG OK')\""
# Genera SEGNALE 3 - esecuzione /usr/bin/su
su - testuser -c "/usr/bin/su --help 2>/dev/null || true"
# Verifica che auditd abbia catturato gli eventi
ausearch -k copy_fail_af_alg -ts recent 2>/dev/null | grep "key=\|exe=\|uid=" | head -5
# Verifica che Wazuh abbia generato gli alert
grep -E "199600|199602" /var/ossec/logs/alerts/alerts.log | tail -10
grep -E "31431|cve_2026" /var/ossec/logs/alerts/alerts.log | tail -10
Punteggio SCA atteso (sistema non mitigato): 75% (3 superati / 1 fallito - algif_aead non in blacklist)
testuser (uid=1001) ha eseguito il PoC di 732 byte e ha ottenuto una shell root:

Socket AF_ALG + splice() dallo stesso processo python - pid=46784 - INDAGINE IMMEDIATA RICHIESTA:






Risultati Wazuh Dashboard Discover (agente=pentlab, Oggi):
wazuh-analysisd -t: uscita 0 - zero warning - tutte le 8 regole caricate.
rmmod algif_aead 2>/dev/null || true
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.conf
Questo non influisce su dm-crypt/LUKS, kTLS, IPsec, OpenSSL, GnuTLS o SSH.
Applica il commit del kernel a664bf3d603d tramite l'aggiornamento del kernel della tua distribuzione. Annulla l'ottimizzazione in-place del 2017 in algif_aead.c, separando req->src (SGL TX, dove splice consegna le pagine) da req->dst (SGL RX, buffer utente). Tutte le principali distribuzioni stanno distribuendo il fix.
# Ubuntu / Debian
apt update && apt upgrade linux-generic
# RHEL / Amazon Linux
dnf update kernel
# SUSE
zypper update kernel-default
Kislley Rodrigues (m0us3r) Ambasciatore Wazuh | Detection Engineering | Blue Team
Regole di rilevamento, configurazione sensore auditd e policy SCA validate su Wazuh 4.14.4, Ubuntu 24.04.2 LTS (kernel 6.8.0-106-generic) e Kali GNU/Linux 2026.1 (kernel 6.18.12+kali-amd64).
| Fonte | Link |
|---|---|
| CISA Aggiunge il Bug di Accesso Root Linux Sfruttato Attivamente CVE-2026-31431 al KEV | https://thehackernews.com/2026/05/cisa-adds-actively-exploited-linux-root.html |
Questo progetto è stato sviluppato come parte del Programma Ambasciatori Wazuh.
Wazuh è una piattaforma di sicurezza open source e gratuita che fornisce protezione XDR e SIEM unificata. Scopri di più su wazuh.com.
| Risorsa | Link |
|---|
| Sito CVE Ufficiale | https://copy.fail/ |
| Write-up Tecnico - Xint Research | https://xint.io/blog/copy-fail-linux-distributions |
| PoC - copy_fail_exp.py | https://github.com/theori-io/copy-fail-CVE-2026-31431/blob/main/copy_fail_exp.py |
| Fix del Kernel - a664bf3d603d | https://github.com/torvalds/linux/commit/a664bf3d603d |
| Commit Vulnerabile - 72548b093ee3 | https://github.com/torvalds/linux/commit/72548b093ee3 |
| MITRE ATT&CK T1068 | https://attack.mitre.org/techniques/T1068/ |
| Distribuzione | Kernel | Stato |
|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | ROOT CONFERMATO |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | ROOT CONFERMATO |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | ROOT CONFERMATO |
| SUSE 16 | 6.12.0-160000.9-default | ROOT CONFERMATO |
| Kali GNU/Linux 2026.1 | 6.18.12+kali-amd64 | ROOT CONFERMATO |
| Regola | Genitore | Segnale | Profondità | Livello |
|---|
| 80700 | decoded_as=auditd | ancoraggio auditd (integrato in Wazuh) | 0 | 0 |
| 92600 | 80700 | esecuzione processo Python (integrato in Wazuh) | 1 | 0 |
| 199600 | 92600 | socket AF_ALG - catena python | 2 | 10 |
| 199601 | 92600 | syscall splice() - catena python | 2 | 10 |
| 199604 | 199601 + if_matched=199600 | CATENA DI EXPLOIT - python (stesso pid/120s) | 3 | 15 |
| 199602 | 80700 | esecuzione /usr/bin/su | 1 | 6 |
| 199603 | 80700 | esecuzione modprobe/kmod | 1 | 12 |
| 199605 | 80700 | socket AF_ALG - non python | 1 | 10 |
| 199606 | 80700 | syscall splice() - non python | 1 | 10 |
| 199607 | 199606 + if_matched=199605 | CATENA DI EXPLOIT - non python (stesso pid/120s) | 2 | 15 |
| Regola | Hit | Descrizione |
|---|
| 199604 | 80 | CATENA DI EXPLOIT RILEVATA - pid=46784 exe=/usr/bin/python3.13 |
| 199600 | 40 | socket AF_ALG creato da processo non root |
| 199603 | 28 | esecuzione modprobe rilevata |
| 199602 | 12 | /usr/bin/su eseguito |
| Data | Evento |
|---|
| 2026-03-23 | Vulnerabilità segnalata al team di sicurezza del kernel Linux |
| 2026-03-24 | Ricevuta conferma iniziale |
| 2026-03-25 | Patch proposte e revisionate |
| 2026-04-01 | Patch committata nel kernel mainline (a664bf3d603d) |
| 2026-04-22 | Assegnato CVE-2026-31431 |
| 2026-04-29 | Divulgazione pubblica - write-up Xint + PoC pubblicati |
| Dirty Cow (2016-5195) | Dirty Pipe (2022-0847) | Copy Fail (2026-31431) |
|---|
| Race condition | Sì - tentativi multipli | No | No - logica deterministica |
| Può crashare il sistema | Sì | No | No |
| Portabilità | Limitata | Specifica per versione | Tutte le distro 2017+ |
| Dimensione exploit | Kilobyte (C) | Centinaia di byte | 732 byte (stdlib Python) |
| Rilevamento FIM | Possibile | Possibile | Non possibile |
| Controllo | Titolo | Rischio |
|---|
| 31431001 | algif_aead non caricato in memoria | CRITICO |
| 31431002 | algif_aead disabilitato tramite modprobe.d | ALTO |
| 31431003 | auditd attivo e in esecuzione | ALTO |
| 31431004 | regole sensore CVE-2026-31431 distribuite | ALTO |
| Catalogo delle Vulnerabilità Note Sfruttate | https://www.cisa.gov/known-exploited-vulnerabilities-catalog |
| CVE-2026-31431 - crypto: algif_aead - Revert to operating out-of-place | https://www.cve.org/CVERecord?id=CVE-2026-31431 |