← back
CVE-2021-22555highunder attackCWE-787

Heap Out-Of-Bounds Write in Netfilter IP6T_SO_SET_REPLACE

100Vexday Risk Score

Patch now. It under exploitation confirmed by CISA and has a working public exploit.

ssvc Actcvss 8.3epss 79%
from disclosure to weapon0 days
Published on NVDJul 7
1st PoCMar 30
metasploitJul 7
CISA KEV+1552d
exploitation probability
79%top 1% of all CVEs
observed exploitation
yesCISA + VulnCheck
31 public exploit(s)
Action required by CISAfederal deadline: 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.

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

Affected
Kernel Linux desde v2.6.19-rc1 (introduzido pelo commit 9fa492cdc160cd27ce1046cb36f47d3b2b1efa21, de 2006) até as versões imediatamente anteriores aos backports de correção.
Fixed in
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.

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.

Researched and written with AI from the vendor advisory and public analysis, with the sources above. Always confirm the fixed version in the official advisory before acting.
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
Affected products
n/a · Linux Kernel
public PoCs found31 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/82616da9904funverifiedvulncheckvulncheck.com/xdb/927960b6eeebunverifiedvulncheckvulncheck.com/xdb/b370bb1cf76funverifiedvulncheckvulncheck.com/xdb/1df56bc7a919unverifiedvulncheckvulncheck.com/xdb/3ab838e91745unverifiedvulncheckvulncheck.com/xdb/03ee412dd1bcunverifiedvulncheckvulncheck.com/xdb/c9c506745b9dunverifiedvulncheckvulncheck.com/xdb/3490863fd0a4unverifiedvulncheckvulncheck.com/xdb/6a4e30003e87unverifiedcve_referencepacketstormsecurity.com/files/164437/Netfilter-x_tables-Heap-Out-Of-Bounds-Write-Privilege-Escalation.htmlunverifiedcve_referencepacketstormsecurity.com/files/165477/Kernel-Live-Patch-Security-Notice-LSN-0083-1.htmlunverifiedcve_referencepacketstormsecurity.com/files/164155/Kernel-Live-Patch-Security-Notice-LSN-0081-1.htmlunverifiedvulncheckvulncheck.com/xdb/9a834a66683dunverifiedcve_referencepacketstormsecurity.com/files/163878/Kernel-Live-Patch-Security-Notice-LSN-0080-1.htmlunverifiedcve_referencepacketstormsecurity.com/files/163528/Linux-Kernel-Netfilter-Heap-Out-Of-Bounds-Write.htmlunverifiedvulncheckvulncheck.com/xdb/8ef3da70ba6cunverifiedvulncheckvulncheck.com/xdb/b14c9c8213f1unverified
⚠ Public resources, to assess the exposure of systems you control or are authorized to test. Test only with authorization.