
cve-2026-46331-audit script
Script di audit in sola lettura per CVE-2026-46331 (noto anche come pedit COW) — un bug di copy-on-write parziale nell'azione act_pedit di net/sched del kernel Linux che consente a un utente locale non privilegiato di corrompere la memoria della page cache 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 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 al di fuori della regione COW'd. Risultato: le pagine condivise della page-cache vengono sporcate, 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 rileveranno.
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.
| CVE | CVE-2026-46331 |
| Componente | Kernel Linux net/sched / act_pedit |
| Classe | COW parziale → corruzione della page cache → LPE |
| Vettore di attacco | Locale (CAP_NET_ADMIN, tipicamente acquisito tramite userns non privilegiati) |
| Upstream interessato | 5.18 .. 7.1-rc6 |
| Fix upstream | 7.1-rc7 |
| PoC pubblico | packet_edit_meme (verificato su RHEL 10, Debian 13, Ubuntu 24.04.4) |
| Gravità Red Hat | Important |
| CVSS 3.1 SUSE | 7.8 (AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
Triage strettamente in sola lettura. Non carica mai un modulo, non tocca mai sysctl, non esegue mai un PoC. Progettato per essere sicuro da eseguire in produzione.
act_pedit tramite quattro segnali indipendenti:
lsmod)modinfo)/boot/config-$(uname -r), /proc/config.gz, modules.builtin)install ... /bin/true in modprobe.d, o da blacklist sui kernel che caricano automaticamente act_pedit tramite il suo alias net-act-pedit (6.9+; i kernel più vecchi lo richiedono per nome, cosa che blacklist non ferma)tc action pedit esistenti (a scopo informativo; nessuna modifica).user.max_user_namespaces, kernel.unprivileged_userns_clone, user.max_net_namespaces, e le restrizioni userns di AppArmor su Ubuntu./etc/os-release (RHEL 8/9/10, Debian 11/12/13/14, Ubuntu 18.04→26.04, SUSE, Amazon Linux, famiglia Arch rolling).auditd e journalctl (finestra configurabile tramite --since e --until).PATCHED / NOT_APPLICABLE / MITIGATED / VULNERABLE / UNKNOWN.sudo ./cve-2026-46331-audit.sh # full text report
sudo ./cve-2026-46331-audit.sh --json # machine-readable JSON, no banner
sudo ./cve-2026-46331-audit.sh --quiet --no-hunt # one-line verdict for mass scans
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 # widen IoC hunt window
sudo ./cve-2026-46331-audit.sh --since 2026-06-01 --until 2026-09-01 # bounded IoC window
sudo ./cve-2026-46331-audit.sh --no-banner # text report without the ASCII banner
./cve-2026-46331-audit.sh --version # print script version and exit
| Codice | Significato |
|---|---|
| 0 | PATCHED o NOT_APPLICABLE (il kernel è precedente alla vulnerabilità) |
| 1 | MITIGATED (mitigazione attiva, il kernel è ancora vulnerabile, applicare comunque la patch) |
| 2 | VULNERABLE (una o più precondizioni richieste soddisfatte, nessun kernel corretto) |
| 3 | UNKNOWN (trattare come sospetto in contesti condivisi / CI / Kubernetes) |
| 4 | ERROR (impossibile eseguire lo script; strumenti mancanti o ambiente non valido) |
Vedere examples/sample-output.txt per un'esecuzione completa e examples/sample-output.json per il formato JSON.
Il punteggio è una combinazione ponderata di:
| Segnale | Peso |
|---|---|
Verdetto del vendor VULNERABLE | +50 |
Verdetto del vendor UNKNOWN | +30 |
act_pedit integrato nel kernel | +25 |
act_pedit caricabile, nessun override | +20 |
act_pedit caricabile, override o blacklist attivi | +5 |
act_pedit attualmente caricato | +5 |
| userns+netns non privilegiati raggiungibili, nessun controllo AppArmor | +15 |
| userns+netns non privilegiati raggiungibili, controllo AppArmor attivo | +8 |
| IoC trovati nella finestra di ricerca | +10 |
Limitato a 100. Qualsiasi valore superiore a ~70 dovrebbe essere 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})'
failed_when in un play- 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 rilevato.
# Option 1: block act_pedit if you don't use it.
tc actions list action pedit # MUST be empty before doing this
# 1a) Hard block via modprobe install override (strongest).
echo 'install act_pedit /bin/true' | sudo tee /etc/modprobe.d/disable-act_pedit.conf
# 1b) `blacklist act_pedit` only stops the autoload on kernels 6.9+, which
# request the "net-act-pedit" alias. Older kernels load it by name and
# ignore the blacklist, so prefer 1a. Check your kernel:
modinfo -F alias act_pedit | grep -qx net-act-pedit && echo "blacklist works here"
lsmod | grep -q act_pedit && sudo rmmod act_pedit