Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-31429-POC — POC para CVE-2026-31429 (Linux Kernel >= 6.3 < 6.12.82 Slab Cross-Cache Confusion) - vulnerabilidade descoberta por Antonius - w1sdom - bluedragonsec.com | Kitploit
Ferramentas/GitHubGitHub/bluedragonsecurity/cve-2026-31429-poc
Análise de VulnerabilidadesExploraçãoAprendizado e EducaçãoExploração de Binários
GitHubbluedragonsecurity/cve-2026-31429-poc

CVE-2026-31429-POC

POC para CVE-2026-31429 (Linux Kernel >= 6.3 < 6.12.82 Slab Cross-Cache Confusion) - vulnerabilidade descoberta por Antonius - w1sdom - bluedragonsec.com

Ver Repositório
1há 4 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-31429 — Linux Kernel: Liberação Cross-Cache de Cabeçalho SKB Alocado por KFENCE via bpf_prog_test_run_skb

Gravidade: Média (CWE-763: Liberação de Ponteiro ou Referência Inválida)
Publicado: 2026-04-20
Subsistema afetado: net/core/skbuff.c — skb_kfree_head()
Pesquisador: Antonius / w1sdom — Blue Dragon Security
Contato: [email protected]
Thread Lore: https://lore.kernel.org/netdev/CAK8a0jxC5L5N7hq-DT2_NhUyjBxrPocoiDazzsBk4TGgT1r4-A@mail.gmail.com/


Possíveis Impactos de Segurança

  • bypass de mitigação
  • desativação de LSM
  • implantação de rootkits no kernel
  • fuga de contêiner
  • negação de serviço

Visão Geral

Este repositório contém a prova de conceito para CVE-2026-31429 (não é um exploit funcional, apenas um POC), um bug de confusão cross-cache de slab na pilha de rede do kernel Linux. O bug é acionado quando KFENCE está habilitado e um chamador (especificamente bpf_test_init em net/bpf/test_run.c) aloca um buffer de cabeçalho SKB via kzalloc() com um tamanho que coincide com SKB_SMALL_HEAD_CACHE_SIZE. Devido à semântica de relatório de tamanho exato do KFENCE, a função skb_kfree_head() do kernel libera incorretamente o objeto de volta para skb_small_head_cache em vez do cache kmalloc-1k original, corrompendo os metadados do slab.


Versões Afetadas

StatusFaixa
AfetadoLinux >= 6.3 (introduzido por bf9f1baa279f)
Não afetado< 6.3
Corrigido>= 6.12.82
Corrigido>= 6.18.23
Corrigido>= 6.19.13
Corrigido>= 7.0 (mainline, commit 0f42e3f4fe2a)

A vulnerabilidade foi introduzida pelo commit bf9f1baa279f ("net: add dedicated kmem_cache for typical/small skb->head"), que adicionou skb_small_head_cache e a lógica de liberação condicional em skb_kfree_head().


Análise da Causa Raiz

Contexto: Intenção de Design do skb_small_head_cache

SKB_SMALL_HEAD_CACHE_SIZE é intencionalmente definido como um valor não potência de 2 (ex.: 704 bytes em x86_64) para evitar colisões com os tamanhos genéricos de buckets do kmalloc (sempre potências de 2: 512, 1024, ...). A heurística em skb_kfree_head() explora essa exclusividade para rotear liberações usando apenas skb_end_offset:

root@kitploit:~
// net/core/skbuff.c (VULNERÁVEL — pré-correção)
static void skb_kfree_head(void *head, unsigned int end_offset)
{
    if (end_offset == SKB_SMALL_HEAD_HEADROOM)
        kmem_cache_free(net_hotdata.skb_small_head_cache, head);
    else
        kfree(head);
}
  • end_offset == SKB_SMALL_HEAD_HEADROOM → assumido como vindo de skb_small_head_cache → kmem_cache_free()
  • caso contrário → kfree() genérico

Essa heurística é válida apenas sob semântica normal de slab, onde ksize() retorna o tamanho do bucket (1024 para uma solicitação de 704 bytes), que nunca é igual a SKB_SMALL_HEAD_CACHE_SIZE.

A Exceção do KFENCE

KFENCE (Kernel Electric-Fence) intercepta um subconjunto de alocações do kernel e as atende a partir de memória com páginas de guarda. Sua diferença comportamental crítica: kfence_ksize() retorna o tamanho exato solicitado, não o tamanho do bucket do slab.

Cadeia de Chamadas Vulnerável

root@kitploit:~
BPF_PROG_TEST_RUN  (syscall 321, cmd BPF_PROG_TEST_RUN=10)
  └─> __sys_bpf()
        └─> bpf_prog_test_run_skb()
              └─> bpf_test_init()
                    └─> kzalloc(size, GFP_USER)
                    │       size == SKB_SMALL_HEAD_CACHE_SIZE (704 em x86_64)
                    │       KFENCE intercepta → objeto atendido da região kmalloc-1k
                    │
                    └─> slab_build_skb(data, NULL, size)
                          └─> ksize(data)
                                └─> kfence_ksize()   ← retorna 704 (exato!)
                          └─> skb_end_offset
                                = ksize(data) - sizeof(skb_shared_info)
                                = 704 - 320
                                = 384
                                = SKB_SMALL_HEAD_HEADROOM  ← correspondência falsa!

  [No caminho de liberação do SKB:]
  └─> sk_skb_reason_drop()
        └─> skb_release_data()
              └─> skb_free_head()
                    └─> skb_kfree_head(head, skb->end)
                          └─> (end_offset == SKB_SMALL_HEAD_HEADROOM) == TRUE
                                └─> kmem_cache_free(skb_small_head_cache, head)
                                      ↑ BUG: head é de kmalloc-1k, não de skb_small_head_cache!
                                      → warn_free_bad_obj() → corrupção do SLUB

Por que skb_end_offset = 384?

Em x86_64:

root@kitploit:~
SKB_SMALL_HEAD_CACHE_SIZE  = 704 bytes
sizeof(skb_shared_info)    = 320 bytes
SKB_SMALL_HEAD_HEADROOM    = 704 - 320 = 384

Quando o KFENCE intercepta o kzalloc() de 704 bytes, kfence_ksize() retorna exatamente 704. A aritmética produz skb_end_offset = 384 = SKB_SMALL_HEAD_HEADROOM, satisfazendo a condicional em skb_kfree_head() — acionando o caminho de liberação errado.

A Correção

A correção upstream por Jiayuan Chen (revisada por Eric Dumazet, mesclada por Jakub Kicinski) elimina a heurística por completo:

root@kitploit:~
// net/core/skbuff.c (CORRIGIDO)
static void skb_kfree_head(void *head, unsigned int end_offset)
{
    kfree(head);   // sempre genérico; funciona para ambos os casos
}

kfree() é seguro tanto para memória alocada via kmalloc quanto para memória alocada via skb_small_head_cache porque kmem_cache_free() em skb_small_head_cache não é mais necessário — o kfree() genérico resolve o cache correto internamente por meio do ponteiro kmem_cache da página do slab.


Saída do dmesg (Evidência de Reprodução)

O reprodutor (repro_bpf.c) foi executado no Linux 7.0.0-rc5 em um ambiente QEMU (i440FX, BIOS 1.17.0-debian). A seguinte cascata de WARNINGs do kernel foi observada:

root@kitploit:~
[ 3065.322973] ------------[ cut here ]------------
[ 3065.322990] kmem_cache_free(skbuff_small_head, ffff888186d6e000): object belongs to different cache kmalloc-1k
[ 3065.323005] WARNING: mm/slub.c:6258 at warn_free_bad_obj+0x91/0xc0, CPU#0: repro_bpf/2167
[ 3065.323061] CPU: 0 UID: 0 PID: 2167 Comm: repro_bpf Not tainted 7.0.0-rc5 #1 PREEMPT(lazy)
[ 3065.323098] RIP: 0010:warn_free_bad_obj+0x98/0xc0
...
[ 3065.323231] Call Trace:
[ 3065.323247]  skb_free_head+0x1ec/0x290
[ 3065.323267]  skb_release_data+0x7a6/0x9d0
[ 3065.323308]  bpf_prog_test_run_skb+0x14f8/0x3410
[ 3065.323510]  __sys_bpf+0x769/0x4b60
[ 3065.323763]  __x64_sys_bpf+0x78/0xc0
[ 3065.323794]  do_syscall_64+0x111/0x690
[ 3065.323813]  entry_SYSCALL_64_after_hwframe+0x77/0x7f

A cascata de WARNINGs produz 4 splats separados por acionamento:

  1. warn_free_bad_obj — detecção primária de liberação cross-cache (mm/slub.c:6258)
  2. depot_fetch_stack — índice do pool do stack depot fora dos limites (lib/stackdepot.c:506) no rastreamento Allocated
  3. stack_depot_print — handle corrompido detectado (lib/stackdepot.c:780)
  4. depot_fetch_stack + stack_depot_print — mesmo par repetido para o rastreamento Freed

Essa cascata indica que os metadados de rastreamento do SLUB do objeto (alloc_track / free_track) referenciam um handle do stack depot que se torna corrompido após a liberação no cache errado.


Reprodutor

Pré-requisitos

root@kitploit:~
Kernel:  Linux >= 6.3, compilado com:
           CONFIG_KFENCE=y
           CONFIG_BPF_SYSCALL=y
           CONFIG_NET_SCH_INGRESS=y  (ou qualquer driver compatível com SCHED_CLS)
           CONFIG_SLUB_DEBUG=y       (para visibilidade do warn_free_bad_obj)
           CONFIG_STACKDEPOT=y       (para cascata completa)

Privilégios: root (uid=0) — necessário para BPF_PROG_LOAD

Compilação

root@kitploit:~
gcc -O2 -o cve-2026-31429-poc-only cve-2026-31429-poc-only.c

Execução

root@kitploit:~
sudo ./cve-2026-31429-poc-only
root@kitploit:~
dmesg | grep -E "warn_free_bad_obj|Wrong slab cache|cross-cache"

Mecanismo de Acionamento

O PoC carrega um programa BPF mínimo de 3 instruções (tipo BPF_PROG_TYPE_SCHED_CLS):

root@kitploit:~
ld_imm64 r0, 0    ; 2 insns (wide)
exit              ; 1 insn

Em seguida, chama BPF_PROG_TEST_RUN (cmd=10) com:

  • data_size_in = 284 bytes de dados de pacote derivados do Syzkaller
  • flags = BPF_F_TEST_RUN_ON_CPU (0x4) — fixa a execução na CPU 0
  • repeat = 4
  • Seguido por um loop de 50 chamadas adicionais para confiabilidade

Os 284 bytes de dados de entrada exercitam o caminho de alocação de bpf_test_init de modo que o tamanho do buffer solicitado seja igual a SKB_SMALL_HEAD_CACHE_SIZE, atingindo probabilisticamente a janela de interceptação do KFENCE.


Commits de Correção

CommitÁrvoreMesclado porData
0f42e3f4fe2amainlineJakub Kicinski2026-04-06
60313768a8edlinux-stableGreg Kroah-Hartman2026-04-18
2d64618ea846linux-stableGreg Kroah-Hartman2026-04-18
474e00b935dblinux-stableGreg Kroah-Hartman2026-04-18

Cadeia de assinaturas: Jiayuan Chen → Reviewed-by Eric Dumazet (Google) → Jakub Kicinski → Greg Kroah-Hartman
Crédito Reported-by: Antonius <[email protected]> em todos os 4 commits
Introduzido por: bf9f1baa279f ("net: add dedicated kmem_cache for typical/small skb->head")


Referências

  • Entrada NVD / CVE: https://www.cve.org/CVERecord?id=CVE-2026-31429
  • Patch upstream (mainline): https://git.kernel.org/stable/c/0f42e3f4fe2a58394e37241d02d9ca6ab7b7d516
  • Stable 6.12.x: https://git.kernel.org/stable/c/60313768a8edc7094435975587c00c2d7b834083
  • Stable 6.18.x: https://git.kernel.org/stable/c/2d64618ea846d8d033477311f805ca487d6a6696
  • Stable 6.19.x: https://git.kernel.org/stable/c/474e00b935db250cac320d10c1d3cf4e44b46721
  • Relatório Lore: https://lore.kernel.org/netdev/CAK8a0jxC5L5N7hq-DT2_NhUyjBxrPocoiDazzsBk4TGgT1r4-A@mail.gmail.com/
  • Blue Dragon Security: https://bluedragonsec.com

Conteúdo do Repositório

root@kitploit:~
.
├── README.md         		    — este arquivo
├── cve-2026-31429-poc-only.c       — prova de conceito apenas (não é um exploit)
└── dmesg.txt                       — splat bruto do kernel de reprodução bem-sucedida

Linha do Tempo de Divulgação

DataEvento
~Início de 2026Bug descoberto via fuzzing com Syzkaller no Linux 7.0-rc5
2026-04-03Patch escrito por Jiayuan Chen, crédito Reported-by para Antonius
2026-04-06Commit mainline 0f42e3f4fe2a mesclado por Jakub Kicinski
2026-04-18Backports estáveis mesclados por Greg Kroah-Hartman (6.12.x, 6.18.x, 6.19.x)
2026-04-20CVE-2026-31429 publicada

Autor

Antonius (apelido: w1sdom)
Fundador e Pesquisador Sênior — Blue Dragon Security
Indonésia
[email protected]


Legal

Este PoC é liberado para fins educacionais e de pesquisa após o patch upstream estar disponível. Não use em sistemas que você não possui ou para os quais não tem permissão explícita para testar. O autor não se responsabiliza por uso indevido.

Baixar ferramenta