← volver
CVE-2021-22555highbajo ataqueCWE-787

Heap Out-Of-Bounds Write in Netfilter IP6T_SO_SET_REPLACE

100Vexday Risk Score

Corrige ahora. Ella está bajo explotación confirmada por CISA y tiene exploit funcional público.

ssvc Actcvss 8.3epss 79%
de la publicación al arma0 días
Publicada en NVD7 jul
1ª PoC30 mar
metasploit7 jul
CISA KEV+1552d
probabilidad de explotación
79%top 1% de las CVE
explotación observada
CISA + VulnCheck
31 exploit(s) público(s)
Acción exigida por CISAplazo federal: 2025-10-27

Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.

Resumen

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.

Detalle técnico

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.

Cómo se explota

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).

Versiones

Afectadas
Kernel Linux desde v2.6.19-rc1 (introduzido pelo commit 9fa492cdc160cd27ce1046cb36f47d3b2b1efa21, de 2006) até as versões imediatamente anteriores aos backports de correção.
Corregidas en
5.12 (mainline, commit b29c457a6511435960115c0f548c4360d5f4801d) e backports 5.10.31, 5.4.113, 4.19.188, 4.14.231, 4.9.267, 4.4.267.

Cómo protegerse

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.

Cómo detectar

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.

Investigado y redactado con IA a partir del advisory del fabricante y análisis públicos, con las fuentes citadas. Verifica siempre la versión corregida en el advisory oficial antes de actuar.
A heap out-of-bounds write affecting Linux since v2.6.19-rc1 was discovered in net/netfilter/x_tables.c. This allows an attacker to gain privileges or cause a DoS (via heap memory corruption) through user name space
CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:H
Productos afectados
n/a · Linux Kernel
PoCs públicas encontradas31 VexDay Proof
exploitdbVexDay Proofwww.exploit-db.com/exploits/50135githubgithub.com/veritas501/CVE-2021-22555-PipeVersion40githubgithub.com/xyjl-ly/CVE-2021-22555-Exploit14githubgithub.com/cgwalters/container-cve-2021-225554githubgithub.com/tukru/CVE-2021-225553githubgithub.com/Spydomain/CVE-2021-22555-Poc1githubgithub.com/JoneyJunior/cve-2021-225551githubgithub.com/daletoniris/CVE-2021-22555-esc-priv1githubgithub.com/masjohncook/netsec-project1githubgithub.com/letsr00t/-2021-LOCALROOT-CVE-2021-225550githubgithub.com/letsr00t/CVE-2021-225550githubgithub.com/pashayogi/CVE-2021-225550githubgithub.com/glutton-su/CVE-2021-225550githubgithub.com/WhatsWrongAndWhy/CVE-2021-225550vulncheckvulncheck.com/xdb/82616da9904fno verificadovulncheckvulncheck.com/xdb/927960b6eeebno verificadovulncheckvulncheck.com/xdb/b370bb1cf76fno verificadovulncheckvulncheck.com/xdb/1df56bc7a919no verificadovulncheckvulncheck.com/xdb/3ab838e91745no verificadovulncheckvulncheck.com/xdb/03ee412dd1bcno verificadovulncheckvulncheck.com/xdb/c9c506745b9dno verificadovulncheckvulncheck.com/xdb/3490863fd0a4no verificadovulncheckvulncheck.com/xdb/6a4e30003e87no verificadocve_referencepacketstormsecurity.com/files/164437/Netfilter-x_tables-Heap-Out-Of-Bounds-Write-Privilege-Escalation.htmlno verificadocve_referencepacketstormsecurity.com/files/165477/Kernel-Live-Patch-Security-Notice-LSN-0083-1.htmlno verificadocve_referencepacketstormsecurity.com/files/164155/Kernel-Live-Patch-Security-Notice-LSN-0081-1.htmlno verificadovulncheckvulncheck.com/xdb/9a834a66683dno verificadocve_referencepacketstormsecurity.com/files/163878/Kernel-Live-Patch-Security-Notice-LSN-0080-1.htmlno verificadocve_referencepacketstormsecurity.com/files/163528/Linux-Kernel-Netfilter-Heap-Out-Of-Bounds-Write.htmlno verificadovulncheckvulncheck.com/xdb/8ef3da70ba6cno verificadovulncheckvulncheck.com/xdb/b14c9c8213f1no verificado
⚠ Recursos públicos, para evaluar la exposición de sistemas que controlas o estás autorizado a probar. Prueba solo con autorización.