
script de auditoria cve-2026-46331
Script de auditoria somente leitura para CVE-2026-46331 (também conhecida como pedit COW) — uma falha parcial de copy-on-write na ação act_pedit de net/sched do kernel Linux que permite a um usuário local sem privilégios corromper a memória do page cache e escalar 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 única vez antes do loop de chaves, usando tcfp_off_max_hint. Chaves tipadas adicionam um offset de cabeçalho em tempo de execução que a dica não cobre; portanto, parte da escrita final cai fora da região protegida por 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 verão a alteração.
Mesma família de falhas do 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 posse de página é a mesma.
Triagem estritamente somente leitura. Nunca carrega um módulo, nunca toca em sysctl, nunca executa um PoC. Projetado para ser executado com segurança em produção.
act_pedit por meio de quatro sinais independentes:
lsmod)modinfo)/boot/config-$(uname -r), /proc/config.gz, modules.builtin)blacklist ou override install ... /bin/true em modprobe.dtc action pedit existentes (informativo; nenhuma alteração).user.max_user_namespaces, kernel.unprivileged_userns_clone e as restrições de userns do AppArmor no Ubuntu.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 --no-banner # text report without the ASCII banner
Consulte examples/sample-output.txt para uma execução completa e examples/sample-output.json para a forma JSON.
A pontuação é uma combinação ponderada de:
Limitada a 100. Qualquer valor acima de ~70 deve ser tratado como urgente em nós multi-tenant / CI / Kubernetes; abaixo de ~20 geralmente é a confirmação de que o host está OK.
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
Em ordem de preferência. O script recomendará a opção correta com base no que encontrar.
# Option 1: block act_pedit if you don't use it.
tc actions list action pedit # MUST be empty before doing this
echo 'install act_pedit /bin/true' | sudo tee /etc/modprobe.d/disable-act_pedit.conf
lsmod | grep -q act_pedit && sudo rmmod act_pedit
# Option 2: restrict unprivileged user namespaces.
# Will break rootless Podman/Docker, browser sandboxes, Flatpak, unprivileged unshare, some CI sandboxes.
sudo sysctl -w user.max_user_namespaces=0 # EL-family
sudo sysctl -w kernel.unprivileged_userns_clone=0 # Debian/Ubuntu
A correção real é uma atualização do kernel do fornecedor mais uma reinicialização. uname -r após a reinicialização é a única coisa que comprova isso.
Esta é a quinta iteração da mesma falha arquitetural. Cada uma corrigiu a causa imediata, nenhuma corrigiu a causa raiz: caminhos rápidos zero-copy compartilhando páginas através de fronteiras de posse, onde todo escritor precisa comprovar privacidade antes de mutar bytes, em centenas de pontos de chamada.
Rust no kernel aborda exatamente essa classe por meio de tipos de posse. Isso não aparecerá em net/sched amanhã.
MIT. Consulte LICENSE.
Para uso defensivo autorizado em sistemas de sua propriedade ou para os quais você tenha permissão explícita de auditoria. O script nunca executa o PoC público, nunca modifica o estado do sistema e nunca carrega módulos. Trate o veredito como triagem, não como prova de comprometimento nem como prova de segurança.
| CVE | CVE-2026-46331 |
| Componente | kernel Linux net/sched / act_pedit |
| Classe | COW parcial → corrupção de page cache → LPE |
| Vetor de ataque | Local (CAP_NET_ADMIN, normalmente obtido via userns sem privilégios) |
| Versões upstream afetadas | 5.18 .. 7.1-rc6 |
| Correção no upstream | 7.1-rc7 |
| PoC público | packet_edit_meme (verificado em RHEL 10, Debian 13, Ubuntu 24.04.4) |
| Severidade Red Hat | Importante |
| CVSS 3.1 da SUSE | 7.8 (AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) |
/etc/os-release (RHEL 8/9/10, Debian 11/12/13/14, Ubuntu 18.04→26.04, SUSE, Amazon Linux, Arch e derivados rolling).auditd e journalctl (janela configurável via --since).PATCHED / NOT_APPLICABLE / MITIGATED / VULNERABLE / UNKNOWN.| Código | Significado |
|---|
| 0 | PATCHED ou NOT_APPLICABLE (kernel anterior à falha) |
| 1 | MITIGATED (mitigação ativa, kernel ainda vulnerável — aplique a correção mesmo assim) |
| 2 | VULNERABLE (uma ou mais pré-condições exigidas atendidas, sem kernel corrigido) |
| 3 | UNKNOWN (trate como suspeito em contextos compartilhados / CI / Kubernetes) |
| 4 | ERROR (o script não pôde ser executado; ferramentas ausentes ou ambiente inválido) |
| Sinal | Peso |
|---|
Veredito do fornecedor VULNERABLE | +50 |
Veredito do fornecedor UNKNOWN | +30 |
act_pedit embutido no kernel | +25 |
act_pedit carregável, sem override | +20 |
act_pedit carregável, com override ativo | +5 |
act_pedit carregado atualmente | +5 |
| userns sem privilégios acessível, sem trava do AppArmor | +15 |
| userns sem privilégios acessível, com trava do AppArmor ativa | +8 |
| IoCs encontrados na janela de busca | +10 |
| CVE | Ano | Subsistema | Primitiva |
|---|
| CVE-2016-5195 | 2016 | mm | corrida de COW em mapeamento somente leitura |
| CVE-2022-0847 | 2022 | pipe / splice | vazamento de flag de pipe_buffer para o page cache |
| CVE-2026-31431 | 2026 | crypto AF_ALG/AEAD | criptografia in-place sobre cache de arquivo somente leitura |
| CVE-2026-46300 | 2026 | XFRM ESP-in-TCP | perda de marcador de fragmento compartilhado do skbuff |
| CVE-2026-46331 | 2026 | net/sched act_pedit | COW parcial por offset de chave tipada resolvido tardiamente |