
Ferramentas de detecção segura para CVE-2026-31431 "Copy Fail" e CVE-2026-43284 "Dirty Frag" — uma escalada de privilégio local no módulo algif_aead do kernel Linux que afeta todas as principais distribuições desde 2017.
Ferramenta de detecção segura para duas famílias de vulnerabilidades de elevação de privilégio local no kernel Linux — Copy Fail (CVE-2026-31431) e Dirty Frag (CVE-2026-43284 / CVE-2026-43500) — ambas afetando todas as principais distribuições desde 2017, ambas exploráveis por qualquer usuário local sem privilégios, e ambas exigindo mitigação independente.
Estas sondas não abrem sockets e não realizam operações criptográficas ou de rede. A detecção é baseada exclusivamente na versão do kernel, metadados de pacotes da distribuição, estado do módulo e flags de mitigação ativas — todos legíveis mundialmente sem
sudo.
Aplicar a mitigação do Copy Fail NÃO protege contra Dirty Frag. Ambas as sondas devem ser executadas e ambas as mitigações aplicadas de forma independente.
.
├── cve-2026-31431-check.sh Sonda Copy Fail (todos os modos de saída)
├── copy_fail_userparameter.conf UserParameter do agente Zabbix — Copy Fail
├── zabbix_template_copy_fail.yaml Template Zabbix 6.4 — Copy Fail
├── copy_fail_auditd.rules Regras de detecção comportamental auditd — Copy Fail
├── cve-2026-43284-check.sh Sonda Dirty Frag (todos os modos de saída)
├── dirty_frag_userparameter.conf UserParameter do agente Zabbix — Dirty Frag
├── wazuh_sca/
│ └── copy_fail_sca.yml Política de conformidade SCA do Wazuh
└── ansible/
└── copy_fall_scan.yml Playbook de varredura Ansible em toda a frota
O exploit requer exatamente esta cadeia de chamadas de sistema:
socket(AF_ALG, SOCK_SEQPACKET, 0)
bind(fd, {alg_type="aead", alg_name="authencesn(hmac(sha256),cbc(aes))"})
accept(fd, ...)
splice(suid_binary_fd, op_fd) ← cache de páginas alimentado no subsistema criptográfico
sendmsg / recvmsg ← gravação de 4 bytes no scratch na cache de páginas
Nenhuma destas é tocada pela sonda. A detecção é baseada em:
.ko no disco (carregável automaticamente)modprobe.d e flag de linha de comando initcall_blacklistchmod +x cve-2026-31431-check.sh
./cve-2026-31431-check.sh # legível por humanos
./cve-2026-31431-check.sh --json # legível por máquina
./cve-2026-31431-check.sh --nagios # Nagios/Icinga/NRPE
./cve-2026-31431-check.sh --zabbix # inteiro 0/1/2 para item Zabbix
Códigos de saída: 0 = PATCHED ou MITIGADO · 1 = VULNERÁVEL · 2 = DESCONHECIDO
O script compara automaticamente com esses limites e define o veredito como PATCHED quando o pacote em execução atende ou excede o limite.
No RHEL, AlmaLinux, Rocky Linux e derivados, algif_aead é compilado no kernel. A solução alternativa modprobe.d não tem efeito. Apenas initcall_blacklist=algif_aead_init na linha de comando do kernel funciona. A sonda detecta isso e avisa explicitamente.
grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
reboot
Dirty Frag encadeia dois bugs de caminho rápido de descriptografia in-place descobertos por Hyunwoo Kim (@v4bel), divulgados ~2026-05-07, uma semana após Copy Fail:
esp4, esp6); correção upstream f4c50a4034e6rxrpc); correção upstream aa54b1d27fe0O exploit anexa páginas de pipe do cache de páginas de /usr/bin/su como fragmentos de socket-buffer paginados, então conduz a descriptografia in-place com uma chave escolhida pelo atacante — escrevendo bytes arbitrários diretamente na cópia em cache de um binário setuid, sem tocar no arquivo em disco.
A mitigação do Copy Fail (lista negra algif_aead) NÃO impede Dirty Frag.
chmod +x cve-2026-43284-check.sh
./cve-2026-43284-check.sh # legível por humanos
./cve-2026-43284-check.sh --json # legível por máquina
./cve-2026-43284-check.sh --nagios # Nagios/Icinga/NRPE
./cve-2026-43284-check.sh --zabbix # inteiro 0/1/2 para item Zabbix
A sonda verifica esp4, esp6 e rxrpc independentemente e relata booleanos separados cve_43284_safe / cve_43500_safe na saída JSON.
esp4 e esp6 são as transformações ESP do lado do kernel usadas pelo IPsec (strongSwan, Libreswan). Colocá-los na lista negra quebra túneis IPsec. A sonda detecta uso ativo de IPsec via ip xfrm state e detecção de daemon, e ajusta o conselho de remediação de acordo:
modprobe.d completa para todos os três módulos.rxrpc na lista negra separadamente se não for necessário):
# Família RHEL
sysctl -w user.max_user_namespaces=0
echo "install rxrpc /bin/false" >> /etc/modprobe.d/dirtyfrag.conf
# Ubuntu / Debian
sysctl -w kernel.unprivileged_userns_clone=0
echo "install rxrpc /bin/false" >> /etc/modprobe.d/dirtyfrag.conf
| Distribuição | CVE-2026-43284 | CVE-2026-43500 (rxrpc) |
|---|---|---|
| RHEL / Rocky / Alma 8.10 | 4.18.0-553.123.2.el8_10 | N/A — rxrpc não distribuído no RHEL 8 |
| RHEL / Rocky / Alma 9.x |
Para sistemas aguardando um kernel corrigido, aplique a lista negra modprobe.d imediatamente (levando em consideração a ressalva do IPsec).
AlmaLinux / RHEL 8 não compila o módulo rxrpc. A sonda marca automaticamente kernel_vuln_rxrpc=not_affected no RHEL/Rocky/Alma 8.x.
Implante ambas as sondas em cada host monitorado:
mkdir -p /etc/zabbix/scripts
install -m 750 -o zabbix -g zabbix cve-2026-31431-check.sh /etc/zabbix/scripts/
install -m 750 -o zabbix -g zabbix cve-2026-43284-check.sh /etc/zabbix/scripts/
cp copy_fail_userparameter.conf /etc/zabbix/zabbix_agentd.d/
cp dirty_frag_userparameter.conf /etc/zabbix/zabbix_agentd.d/
systemctl restart zabbix-agent # ou zabbix-agent2
Importe zabbix_template_copy_fail.yaml via Configuration → Templates → Import.
Itens UserParameter fornecidos:
O template Copy Fail inclui gatilho HIGH em status=1, WARNING em status=2.
Nenhum sudo necessário — todo arquivo lido por ambos os scripts é legível mundialmente.
install -m 755 cve-2026-31431-check.sh /usr/lib/nagios/plugins/
install -m 755 cve-2026-43284-check.sh /usr/lib/nagios/plugins/
# NRPE — adicione ao /etc/nagios/nrpe.cfg:
command[check_copy_fail]=/usr/lib/nagios/plugins/cve-2026-31431-check.sh --nagios
command[check_dirty_frag]=/usr/lib/nagios/plugins/cve-2026-43284-check.sh --nagios
# CheckMK local checks:
echo '#!/bin/bash
OUT=$(/usr/lib/nagios/plugins/cve-2026-31431-check.sh --nagios); RC=$?
echo "$RC CVE-2026-31431 - $OUT"' > /usr/lib/check_mk_agent/local/copy_fail
echo '#!/bin/bash
OUT=$(/usr/lib/nagios/plugins/cve-2026-43284-check.sh --nagios); RC=$?
echo "$RC CVE-2026-43284 - $OUT"' > /usr/lib/check_mk_agent/local/dirty_frag
chmod +x /usr/lib/check_mk_agent/local/copy_fail \
/usr/lib/check_mk_agent/local/dirty_frag
Detecta uma tentativa de exploit ativa em andamento, complementando ambas as sondas estáticas.
cp copy_fail_auditd.rules /etc/audit/rules.d/
augenrules --load
# Monitore chamadores AF_ALG inesperados:
ausearch -k copy_fail_af_alg --interpret | \
grep -v -E 'cryptsetup|veritysetup|systemd-crypt|kcapi'
Stubs de regras Wazuh (nível 13 / 15) estão incorporados nos comentários do arquivo .rules.
cp wazuh_sca/copy_fail_sca.yml /var/ossec/etc/shared/default/
/var/ossec/bin/agent_control -r -a
Resultados: Security → SCA → Filtrar por política cve_2026_31431_copy_fail
ansible-playbook -i inventory/hosts ansible/copy_fall_scan.yml
# Limitar a um subconjunto:
ansible-playbook -i inventory/hosts ansible/copy_fall_scan.yml --limit webservers
Escreve JSON por host + summary.txt em /tmp/copy_fail_results/ no controlador. O play sai com código não zero se algum host estiver VULNERÁVEL.
Copy Fail
Dirty Frag
| Copy Fail | Dirty Frag |
|---|
| CVE | CVE-2026-31431 | CVE-2026-43284 + CVE-2026-43500 |
| Módulo(s) | algif_aead | esp4, esp6, rxrpc |
| Introduzida | Ago 2017 (kernel 4.14) | Jan 2017 / Jun 2023 |
| Mitigação | Lista negra modprobe.d para algif_aead | Lista negra modprobe.d para esp4/esp6/rxrpc |
| Script de sonda | cve-2026-31431-check.sh | cve-2026-43284-check.sh |
| Distribuição | Corrigido em | Aviso |
|---|
| RHEL / Rocky / Alma 8.10 | kernel-4.18.0-553.123.1.el8_10 | Rocky 2026-05-11 |
| RHEL / Rocky / Alma 9.7 | kernel-5.14.0-611.54.1.el9_7 | mesmo |
| RHEL / Rocky / Alma 10.1 | kernel-6.12.0-124.55.1.el10_1 | mesmo |
| Debian 11 (bullseye) | linux 5.10.251-3 | DLA-4560-1 |
| Debian 12 (bookworm) | linux 6.1.170-1 | DSA-6243-1 |
| Debian 13 (trixie) | linux 6.12.85-1 | DSA-6238-1 |
| Ubuntu 22.04 / 24.04 | Nenhum kernel corrigido ainda — mitigação kmod via USN-8226-1 | USN-8226-1 |
| SLES 12 SP5 | kernel-default 4.12.14-122.299.1 | SUSE-SU-2026:1669-1 |
| SLES 15 SP5 | kernel-default 5.14.21-150500.55.144.1 | SUSE-SU-2026:1670-1 |
| SLES 15 SP6 | kernel-default 6.4.0-150600.23.92.1 | SUSE-SU-2026:1671-1 |
| SLES 15 SP7 | kernel-default 6.4.0-150700.53.40.1 | SUSE-SU-2026:1669-1 |
| SLES 16.0 | kernel-default 6.12.0-160000.29.1 | Aviso SUSE |
| Pendente |
| Pendente |
| Debian / Ubuntu / SLES | Pendente | Pendente |
| Chave | Tipo | Significado |
|---|
copy_fail.status | int | 0=seguro · 1=vulnerável · 2=desconhecido |
copy_fail.detail | str | Veredito legível por humanos do Copy Fail |
dirty_frag.status | int | 0=seguro · 1=vulnerável · 2=desconhecido |
dirty_frag.detail | str | Veredito legível por humanos do Dirty Frag |
| Distribuição | Copy Fail | Dirty Frag |
|---|