
script de auditoria cve-2026-46331
Script de auditoria somente leitura para CVE-2026-46331 (também conhecida como pedit COW) — uma falha de copy-on-write parcial na ação act_pedit do net/sched do kernel Linux que permite a um usuário local sem privilégios corromper a memória do page cache e escalar privilégios para root.
____ _____ ____ ___ _____ ____ _____ __
| _ \| ____| _ \_ _|_ _| / ___/ _ \ \ / /
| |_) | _| | | | | | | | | | | | | \ \ /\ / /
| __/| |___| |_| | | | | | |__| |_| |\ V V /
|_| |_____|____/___| |_| \____\___/ \_/\_/
CVE-2026-46331 net/sched act_pedit partial COW
tcf_pedit_act() calcula o intervalo de COW para skb_ensure_writable() uma vez antes do loop de chaves, usando tcfp_off_max_hint. Chaves tipadas adicionam um deslocamento de cabeçalho em tempo de execução que a dica não cobre, de modo que parte da escrita eventual cai fora da região submetida a COW. Resultado: páginas compartilhadas do page cache são corrompidas, e um binário setuid em cache (alvo clássico: /bin/su) pode ser envenenado em memória. Os hashes em disco permanecem limpos. Monitores de integridade de arquivos não o detectarão.
Mesma família de bugs que Dirty COW (CVE-2016-5195), Dirty Pipe (CVE-2022-0847), Copy Fail (CVE-2026-31431) e Dirty Frag (CVE-2026-46300). O ponto de entrada é diferente, a falha de propriedade de página é a mesma.
| CVE | CVE-2026-46331 |
| Componente | Kernel Linux net/sched / act_pedit |
| Classe | COW parcial → corrupção do page cache → LPE |
| Vetor de ataque | Local (CAP_NET_ADMIN, tipicamente obtido via userns não privilegiado) |
| Afetado upstream | 5.18 .. 7.1-rc6 |
| Correção upstream | 7.1-rc7 |
| PoC público | packet_edit_meme (verificado em RHEL 10, Debian 13, Ubuntu 24.04.4) |
| Severidade 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) |
Triagem estritamente somente leitura. Nunca carrega um módulo, nunca toca em sysctl, nunca executa um PoC. Projetado para ser seguro de executar em produção.
act_pedit por meio de quatro sinais independentes:
lsmod)modinfo)/boot/config-$(uname -r), /proc/config.gz, modules.builtin)install ... /bin/true em modprobe.d, ou por blacklist em kernels que carregam act_pedit automaticamente por meio de seu alias net-act-pedit (6.9+; kernels mais antigos o solicitam pelo nome, o que blacklist não impede)tc action pedit existentes (informativo; sem alterações).user.max_user_namespaces, kernel.unprivileged_userns_clone, user.max_net_namespaces e as restrições de userns do AppArmor no Ubuntu./etc/os-release (RHEL 8/9/10, Debian 11/12/13/14, Ubuntu 18.04→26.04, SUSE, Amazon Linux, família Arch rolling).auditd e journalctl (janela configurável via --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
| Código | Significado |
|---|---|
| 0 | PATCHED ou NOT_APPLICABLE (o kernel é anterior ao bug) |
| 1 | MITIGATED (mitigação ativa, kernel ainda vulnerável, aplicar patch mesmo assim) |
| 2 | VULNERABLE (uma ou mais pré-condições necessárias atendidas, sem kernel corrigido) |
| 3 | UNKNOWN (tratar como suspeito em contextos compartilhados / CI / Kubernetes) |
| 4 | ERROR (o script não pôde ser executado; ferramentas ausentes ou ambiente inválido) |
Consulte examples/sample-output.txt para uma execução completa, e examples/sample-output.json para o formato JSON.
A pontuação é uma combinação ponderada de:
| Sinal | Peso |
|---|---|
Veredito do fornecedor VULNERABLE | +50 |
Veredito do fornecedor UNKNOWN | +30 |
act_pedit compilado no kernel | +25 |
act_pedit carregável, sem override | +20 |
act_pedit carregável, override ou blacklist ativo | +5 |
act_pedit atualmente carregado | +5 |
| userns+netns sem privilégios acessível, sem bloqueio do AppArmor | +15 |
| userns+netns sem privilégios acessível, bloqueio do AppArmor ativo | +8 |
| IoCs encontrados na janela de busca | +10 |
Limitado a 100. Qualquer valor acima de ~70 deve ser tratado como urgente em nós multi-tenant / CI / Kubernetes; abaixo de ~20 geralmente é uma confirmação de que o host está íntegro.
ansible -i inventory all -m script \
-a "cve-2026-46331-audit.sh --json --quiet --no-hunt" \
--become \
| tee /tmp/audit.jsonl
Em seguida, agregue com 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
Por ordem de preferência. O script recomendará a opção correta com base no que encontrou.
# 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