Heap Out-Of-Bounds Write in Netfilter IP6T_SO_SET_REPLACE
Patch now. It under exploitation confirmed by CISA and has a working public exploit.
Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.
Summary
Falha de escrita fora dos limites do heap (CWE-787) na implementação compat do setsockopt IPT_SO_SET_REPLACE/IP6T_SO_SET_REPLACE do netfilter, presente no kernel Linux desde 2006 (v2.6.19-rc1). Permite que um usuário local sem privilégios, dentro de um user namespace, escale para privilégios de root ou derrube o kernel — é uma vulnerabilidade de escalada de privilégio local, não uma falha remota, apesar do que o vetor CVSS AV:A possa sugerir.
Technical detail
O bug está em xt_compat_target_from_user (e sua contraparte xt_compat_match_from_user) em net/netfilter/x_tables.c, chamado quando um processo 32-bit (via camada compat de syscalls) usa setsockopt para substituir uma tabela de regras iptables/ip6tables. A função copia a estrutura de regra em formato compat para um buffer do kernel e, historicamente (desde o commit 9fa492cdc160c, de 2006), calculava um padding de alinhamento baseado em match->matchsize / target->targetsize e fazia um memset nesse trecho para zerar o espaço de alinhamento.
O problema é que esse memset não verificava se o espaço calculado ainda cabia dentro do buffer alocado por xt_alloc_table_info() (via kvmalloc_node) — buffer cujo tamanho foi dimensionado com base nos tamanhos das estruturas compat, não nos tamanhos reais das estruturas do kernel. Quando o alvo/match escolhido pelo atacante tem tamanho real diferente do previsto no dimensionamento original, a operação de zeragem escreve além do fim do blob alocado, corrompendo memória heap adjacente.
O atacante controla o conteúdo da regra netfilter (nomes de match/target, tamanhos, número de regras) enviada via IPT_SO_SET_REPLACE/IP6T_SO_SET_REPLACE, o que permite manipular o layout do heap e o deslocamento da escrita fora dos limites. Pesquisadores do Google demonstraram que essa escrita, embora limitada a zeros de padding, pode ser usada de forma confiável para corromper estruturas adjacentes do heap e obter execução em contexto de kernel.
O fix (commit b29c457a6511, abril/2021) remove completamente a lógica de memset de padding dentro de xt_compat_*_from_user e passa a zerar o blob inteiro antecipadamente, eliminando a possibilidade de escrita fora dos limites do buffer alocado.
How it’s exploited
O vetor é estritamente local: o atacante precisa executar código como usuário sem privilégios na máquina-alvo e ter capacidade de criar um user namespace (CLONE_NEWUSER) — mecanismo que, dentro do namespace, concede CAP_NET_ADMIN sem exigir root real fora dele. É exatamente o 'user name space' citado na descrição oficial. A criação de user namespaces sem privilégios é permitida por padrão em muitas distribuições Linux (para suportar containers rootless, sandboxing de navegadores etc.), o que torna essa pré-condição trivialmente satisfeita na maioria dos sistemas desktop e em muitos servidores/hosts de containers.
A segunda pré-condição é o kernel ter CONFIG_COMPAT habilitado — ou seja, suporte à camada de syscalls 32-bit em kernel 64-bit, presente por padrão em praticamente todo kernel x86_64 de distribuição. Dentro do namespace com CAP_NET_ADMIN, o atacante invoca o caminho compat do setsockopt com uma tabela de regras ip6tables/iptables craftada para acionar o cálculo incorreto de padding e a escrita fora dos limites.
Há PoC pública (publicada pelo Google, GHSA-xxx5-8mvq-3528, atribuída a Andy Nguyen) que demonstra o crash com KASAN e corrupção de heap; escritas técnicas subsequentes (referenciadas via Packet Storm) descrevem exploração completa até escalada de privilégio local com root. Existe módulo Metasploit e a CVE está no catálogo KEV da CISA como exploração confirmada. O resultado final, quando bem-sucedido, é execução de código em contexto de kernel / root a partir de um processo local sem privilégios; quando falha, é um DoS por corrupção de heap (panic/oops).
Versions
How to protect
A correção definitiva é atualizar o kernel para uma versão que contenha o commit b29c457a6511 ("netfilter: x_tables: fix compat match/target pad out-of-bound write"). Versões corrigidas publicadas pelo fornecedor/patch: mainline 5.12, com backports para 5.10.31, 5.4.113, 4.19.188, 4.14.231, 4.9.267 e 4.4.267. Distribuições costumam portar esse patch em seus próprios kernels antes dessas versões upstream — verifique o changelog do pacote de kernel da distribuição em uso, pois o número de versão do kernel da distro raramente coincide com o do kernel.org.
Se a atualização não for imediata, o controle compensatório real é impedir a criação de user namespaces sem privilégios, já que é o caminho usado para obter CAP_NET_ADMIN sem root (por exemplo, restringindo via sysctl equivalente a kernel.unprivileged_userns_clone=0 em distros baseadas em Debian/Ubuntu, ou bloqueando a syscall unshare/clone com flag CLONE_NEWUSER via política de seccomp/AppArmor/SELinux). O custo é real: isso quebra funcionalidades que dependem de user namespaces sem privilégios, como containers rootless e sandboxes de navegador.
O que não mitiga: controles de rede, firewall ou segmentação não têm efeito, pois a exploração é inteiramente local via syscall — o vetor CVSS AV:A não reflete uma exposição de rede real nesse caso. Também não há flag de configuração do próprio subsistema netfilter (via sysctl ou módulo) que neutralize especificamente essa falha sem o patch de código; desabilitar CONFIG_COMPAT eliminaria o caminho de exploração, mas exige recompilar o kernel sem suporte a binários 32-bit, o que é inviável na maioria dos ambientes.
How to detect
Não há sinal de rede a monitorar, pois a exploração é inteiramente local. No host, o indicador mais próximo é a combinação de chamadas unshare()/clone() com CLONE_NEWUSER por usuários não privilegiados seguidas de setsockopt com optname IPT_SO_SET_REPLACE/IP6T_SO_SET_REPLACE originado de um processo em modo compat (32-bit) — visível via regras específicas de auditd/seccomp, se configuradas previamente. Em kernels com KASAN habilitado (raro em produção), um crash com a assinatura 'slab-out-of-bounds in xt_compat_target_from_user' no dmesg/log do kernel confirma tentativa de exploração; sem KASAN, a corrupção de heap tende a se manifestar como panic genérico ou comportamento instável do kernel, sem assinatura confiável antes do sucesso do ataque.