
cve-2026-46331-audit script
Script di audit di sola lettura per CVE-2026-46331 (alias pedit COW) — un bug parziale copy-on-write nell'azione net/sched act_pedit del kernel Linux che consente a un utente locale non privilegiato di corrompere la memoria della cache delle pagine ed escalare a root.
____ _____ ____ ___ _____ ____ _____ __
| _ \| ____| _ \_ _|_ _| / ___/ _ \ \ / /
| |_) | _| | | | | | | | | | | | | \ \ /\ / /
| __/| |___| |_| | | | | | |__| |_| |\ V V /
|_| |_____|____/___| |_| \____\___/ \_/\_/
CVE-2026-46331 net/sched act_pedit partial COW
tcf_pedit_act() calcola l'intervallo COW per skb_ensure_writable() una sola volta prima del ciclo delle chiavi, usando tcfp_off_max_hint. Le chiavi tipizzate aggiungono un offset di intestazione a runtime che l'hint non copre, quindi parte della scrittura finale cade fuori dalla regione COW. Risultato: le pagine condivise della cache delle pagine vengono sovrascritte, e un binario setuid in cache (bersaglio classico: /bin/su) può essere avvelenato in memoria. Gli hash su disco restano puliti. I monitor di integrità dei file non lo vedranno.
Stessa famiglia di bug di Dirty COW (CVE-2016-5195), Dirty Pipe (CVE-2022-0847), Copy Fail (CVE-2026-31431) e Dirty Frag (CVE-2026-46300). Il punto di ingresso è diverso, il fallimento della proprietà delle pagine è lo stesso.
Triage strettamente in sola lettura. Non carica mai un modulo, non tocca sysctl, non esegue mai un PoC. Progettato per essere sicuro da eseguire in produzione.
act_pedit attraverso quattro segnali indipendenti:
lsmod)modinfo)/boot/config-$(uname -r), /proc/config.gz, modules.builtin)install ... /bin/true in modprobe.dtc action pedit esistenti (informativo; nessuna modifica).user.max_user_namespaces, kernel.unprivileged_userns_clone e le restrizioni AppArmor degli userns di Ubuntu./etc/os-release (RHEL 8/9/10, Debian 11/12/13/14, Ubuntu 18.04→26.04, SUSE, Amazon Linux, famiglia Arch rolling).sudo ./cve-2026-46331-audit.sh # report testuale completo
sudo ./cve-2026-46331-audit.sh --json # JSON leggibile dalla macchina, nessun banner
sudo ./cve-2026-46331-audit.sh --quiet --no-hunt # verdetto in una riga per scansioni di massa
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 # amplia la finestra di caccia agli IoC
sudo ./cve-2026-46331-audit.sh --no-banner # report testuale senza il banner ASCII
Vedi examples/sample-output.txt per un'esecuzione completa, e examples/sample-output.json per il formato JSON.
Il punteggio è una combinazione pesata di:
Massimo 100. Sopra ~70 va trattato come urgente su nodi multi-tenant / CI / Kubernetes; sotto ~20 di solito è una conferma che l'host è a posto.
ansible -i inventory all -m script \
-a "cve-2026-46331-audit.sh --json --quiet --no-hunt" \
--become \
| tee /tmp/audit.jsonl
Poi aggrega con jq:
grep -v '^[a-z]' /tmp/audit.jsonl | jq -s 'group_by(.verdict) | map({verdict: .[0].verdict, hosts: length})'
- name: audit CVE-2026-46331
ansible.builtin.script: cve-2026-46331-audit.sh --quiet --no-hunt
register: audit
failed_when: audit.rc == 2
changed_when: false
In ordine di preferenza. Lo script consiglierà quella giusta in base a ciò che ha trovato.
# Opzione 1: blocca act_pedit se non lo usi.
tc actions list action pedit # DEVE essere vuoto prima di farlo
echo 'install act_pedit /bin/true' | sudo tee /etc/modprobe.d/disable-act_pedit.conf
lsmod | grep -q act_pedit && sudo rmmod act_pedit
# Opzione 2: limita i namespace utente non privilegiati.
# Romperà Podman/Docker rootless, sandbox del browser, Flatpak, unshare non privilegiato, alcune sandbox CI.
sudo sysctl -w user.max_user_namespaces=0 # famiglia EL
sudo sysctl -w kernel.unprivileged_userns_clone=0 # Debian/Ubuntu
La vera soluzione è un aggiornamento del kernel del fornitore più un riavvio. uname -r dopo il riavvio è l'unica cosa che lo dimostra.
Questa è la quinta iterazione dello stesso fallimento architetturale. Ognuna ha corretto la causa prossima, nessuna ha corretto la causa principale: percorsi rapidi a copia zero che condividono pagine attraverso confini di proprietà, dove ogni scrittore deve dimostrare la privacy prima di mutare byte, in centinaia di siti di chiamata.
Rust nel kernel affronta esattamente questa classe tramite tipi di proprietà. Non comparirà in net/sched domani.
MIT. Vedi LICENSE.
Per uso difensivo autorizzato su sistemi di tua proprietà o per i quali hai esplicitamente il permesso di eseguire audit. Lo script non esegue mai il PoC pubblico, non modifica mai lo stato del sistema e non carica mai moduli. Tratta il verdetto come triage, non come prova di compromissione o prova di sicurezza.
| CVE | CVE-2026-46331 |
| Componente | Kernel Linux net/sched / act_pedit |
| Classe | COW parziale → corruzione cache pagine → LPE |
| Vettore d'attacco | Locale (CAP_NET_ADMIN, solitamente acquisito tramite userns non privilegiato) |
| Affetto a monte | 5.18 .. 7.1-rc6 |
| Fix a monte | 7.1-rc7 |
| PoC pubblico | packet_edit_meme (verificato su RHEL 10, Debian 13, Ubuntu 24.04.4) |
| Severità Red Hat | Importante |
| CVSS 3.1 SUSE | 7.8 (AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
auditd e journalctl (finestra configurabile con --since).PATCHED / NOT_APPLICABLE / MITIGATED / VULNERABLE / UNKNOWN.| Codice | Significato |
|---|
| 0 | PATCHED o NOT_APPLICABLE (kernel precedente al bug) |
| 1 | MITIGATED (mitigazione attiva, kernel ancora vulnerabile, applicare comunque la patch) |
| 2 | VULNERABLE (una o più precondizioni necessarie soddisfatte, nessun kernel corretto) |
| 3 | UNKNOWN (trattare come sospetto in contesti condivisi / CI / Kubernetes) |
| 4 | ERROR (script non eseguibile; strumenti mancanti o ambiente non valido) |
| Segnale | Peso |
|---|
Verdetto del fornitore VULNERABLE | +50 |
Verdetto del fornitore UNKNOWN | +30 |
act_pedit integrato nel kernel | +25 |
act_pedit caricabile, nessun override | +20 |
act_pedit caricabile, override attivo | +5 |
act_pedit attualmente caricato | +5 |
| userns non privilegiato raggiungibile, nessun gate AppArmor | +15 |
| userns non privilegiato raggiungibile, gate AppArmor attivo | +8 |
| IoC trovati nella finestra di caccia | +10 |
| CVE | Anno | Sottosistema | Primitiva |
|---|
| CVE-2016-5195 | 2016 | mm | Gara COW su mapping sola lettura |
| CVE-2022-0847 | 2022 | pipe / splice | Perdita del flag pipe_buffer nella cache delle pagine |
| CVE-2026-31431 | 2026 | crypto AF_ALG/AEAD | Crittografia in-place su cache di file sola lettura |
| CVE-2026-46300 | 2026 | XFRM ESP-in-TCP | Perdita del marker di frammento condiviso skbuff |
| CVE-2026-46331 | 2026 | net/sched act_pedit | COW parziale da offset di chiave tipizzato risolto in ritardo |