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-46215-POC — Exploit para CVE-2026-46215, uma escalada de privilégio local use-after-free no DRM GEM do kernel Linux. Usa corrida, slab spraying e sobrescrita de arquivo estilo Dirty Pipe para transformar um usuário não privilegiado do nó de render em root sem senha. | Kitploit
Ferramentas/GitHubGitHub/0xcyberstan/cve-2026-46215-poc
Escalada de PrivilégiosForensia de MemóriaAnálise de VulnerabilidadesExploraçãoCTFAprendizado e EducaçãoExploração de Binários
GitHub0xcyberstan/cve-2026-46215-poc

CVE-2026-46215-POC

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

Exploit para CVE-2026-46215, uma escalada de privilégio local use-after-free no DRM GEM do kernel Linux. Usa corrida, slab spraying e sobrescrita de arquivo estilo Dirty Pipe para transformar um usuário não privilegiado do nó de render em root sem senha.

Ver Repositório
1123há 2 mesesAinda não revisado

CVE-2026-46215: DRM GEM change_handle Use-After-Free (LPE sem privilégio)

Escalação de privilégio local via um use-after-free no ioctl do núcleo do DRM DRM_IOCTL_GEM_CHANGE_HANDLE (drm_gem_change_handle_ioctl, ioctl nr 0xD2). Acessível por qualquer usuário com acesso a um render node (/dev/dri/renderD*, concedido à sessão ativa pelo systemd-logind em todas as principais distribuições desktop). A cadeia neste repositório leva o UAF a root sem senha a partir de um usuário não privilegiado.

  • CVE: CVE-2026-46215 (ALTA, 7.8, AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)
  • Introduzido: v6.18-rc1, commit 53096728b891 ("drm: Add DRM prime interface to reassign GEM handle", David Francis / AMD), adicionado para o trabalho de CRIU da AMD
  • Corrigido em: 6.18.32, 7.0.9, 7.1-rc3 (upstream 5e28b7b94408). O ioctl também está sendo desabilitado no upstream na versão 7.1 devido a esta e outras condições de corrida.
  • Atingido: v6.18-rc1 até as versões corrigidas acima

Atribuição

Este bug foi relatado pela primeira vez por Puttimet Thammasaeng, que detém o crédito Reported-by do upstream na correção. Eu o encontrei e reportei de forma independente para [email protected] em 2026-04-12. Meu relatório foi reconhecido e encaminhado para os mantenedores, mas o relatório anterior é o creditado no upstream. Este repositório contém minha própria análise e exploit.

Writeup: https://cyberstan.co.uk

Status de divulgação

A correção está em kernels estáveis lançados (6.18.32 e 7.0.9 em diante). Este repositório foi publicado depois que as correções se tornaram amplamente disponíveis.

O bug

drm_gem_change_handle_ioctl() move um objeto GEM de um handle para outro mas nunca ajusta obj->handle_count. Também pula drm_vma_node_allow/revoke e os callbacks de abertura/fechamento do driver. Como handle_count permanece em 1, um GEM_CLOSE concorrente no handle antigo o reduz para 0 e libera o objeto enquanto o novo handle ainda o referencia no IDR. Esse handle pendente é o use-after-free, posteriormente desreferenciado em drm_gem_object_release_handle().

Cadeia do exploit

  1. Competir GEM_CHANGE_HANDLE contra GEM_CLOSE para obter um handle pendente.
  2. Recuperar o slot do slab do objeto liberado com um array pipe_buffer pulverizado (feng shui de msg_msg para condicionar kmalloc-512, depois pipes preenchidos por splice).
  3. Vazar pipe_buf_ops através de um ioctl de informações do driver: obj->size (offset 216) se sobrepõe a pipe_buf[5].ops, dando um ponteiro do kernel e a base do KASLR.
  4. FLINK no handle pendente para que obj->name (offset 224) caia sobre pipe_buf[5].flags e defina PIPE_BUF_FLAG_CAN_MERGE (name = 16 = 0x10).
  5. Escrever nos pipes para mesclar no cache de páginas e sobrescrever um arquivo somente leitura (estilo DirtyPipe). O alvo é /etc/passwd, root se torna sem senha.

Os offsets são verificados via pahole e são específicos da disposição entre 6.18 e 7.0. Sobrescreva as definições GEM_* / PIPEBUF_* para outros kernels.

Arquivos

  • poc.c - o exploit. Compile estático com -lpthread.
  • run_exploit.sh - compila o PoC e um initramfs mínimo, inicializa-o no QEMU.

Pré-requisitos do host

qemu-system-x86_64, gcc, busybox (estático), fakeroot, cpio, gzip. KVM (/dev/kvm) é recomendado; a condição de corrida é muito mais confiável com ele.

Compilando um kernel de teste

O exploit precisa de um alvo vulnerável compilado com opções específicas:

  • CONFIG_KASAN deve estar DESLIGADO. KASAN coloca em quarentena slabs liberados e bloqueia a recuperação por spray de pipe, então o exploit não funcionará contra uma compilação com KASAN.
  • Um driver DRM que expõe os campos size/name nos offsets esperados: virtio_gpu (usado pela demonstração) ou nouveau.
  • CONFIG_DRM=y, CONFIG_DRM_VIRTIO_GPU=y, CONFIG_DEVTMPFS=y, CONFIG_BLK_DEV_INITRD=y.

Passos:

  1. Obtenha uma árvore de código fonte 6.18 a 7.0 (ou qualquer árvore que falhe na verificação de corrigido abaixo).
  2. Defina as opções de configuração acima e certifique-se de que CONFIG_KASAN não está definido.
  3. make -j"$(nproc)" bzImage, produzindo arch/x86/boot/bzImage.

A demonstração inicializa com nokaslr para que o ponteiro vazado seja determinístico. O vazamento quebra o KASLR por si só, então KASLR ligado também funciona, o endereço apenas varia a cada inicialização.

Verificando se uma árvore é vulnerável ou corrigida

Veja drivers/gpu/drm/drm_gem.c, função drm_gem_change_handle_ioctl().

Verificação rápida:

root@kitploit:~
awk '/^int drm_gem_change_handle_ioctl/,/^}/' \
    drivers/gpu/drm/drm_gem.c | grep -c handle_count
  • 0 significa VULNERÁVEL (sem tratamento de refcount).
  • diferente de zero significa CORRIGIDO.

Por estrutura:

  • Vulnerável: pega file_priv->prime.lock, um único idr_alloc(&file_priv->object_idr, obj, ...), depois idr_remove() no handle antigo. Nenhum drm_gem_object_handle_get.
  • Corrigido: inserção em duas fases (idr_alloc depois idr_replace(NULL) para desassociar o handle antigo), com o objeto real sendo trocado apenas quando as operações de prime são bem-sucedidas.

Executando o exploit

root@kitploit:~
./run_exploit.sh /caminho/para/bzImage

Ele compila poc.c, empacota em um initramfs e inicializa QEMU com -device virtio-gpu-pci e nokaslr. O PoC executa como uid 1000 (não privilegiado), então o script imprime /etc/passwd antes e depois e te joga em um shell. Saia da VM com poweroff -f ou Ctrl-A X.

Saída esperada

root@kitploit:~
[!] Corrida vencida (iter 977): handle=132049
[!] KASLR: pipe_buf_ops = 0xffffffff82428400
[!] EXPLOIT BEM-SUCEDIDO
[!] FLINK: 16 = 0x10
[*] /etc/passwd:
    root::0:0:pwned:/root:/bin/sh
[!] LPE CONFIRMADO
[!] conta root agora está sem senha

Um /etc/passwd somente leitura (chmod 444) de propriedade do root é sobrescrito por um processo não privilegiado. A linha root: perde o campo de senha.

Confiabilidade

  • Cerca de 99% por inicialização nos testes (99/100 em 100 inicializações novas, mais 53/53 em execuções anteriores). O PoC tenta novamente internamente: em um vazamento ruim, ele corre novamente para obter um objeto pendente novo em vez de re-pulverizar um slot morto, até 200 rodadas, cada rodada algumas dezenas de milissegundos. A maioria das inicializações vence na primeira corrida; o pior observado usou 11 das 200 rodadas.
  • Raro (cerca de 1%) modo de falha: um intercalamento de corrida perdedora corrompe o estado do kernel e trava a VM (hang silencioso, nenhum veredito impresso). Isso é inerente a um UAF de corrida no kernel. Se uma execução não imprimir um veredito em aproximadamente 30 segundos, reinicie e execute novamente.

Confirmando a correção

Recompile contra uma árvore corrigida (6.18.32, 7.0.9, 7.1-rc3 ou posterior, ou qualquer árvore que passe na verificação de corrigido acima) e execute novamente:

root@kitploit:~
./run_exploit.sh /caminho/para/patched-bzImage

Contra o kernel corrigido, o exploit nunca deve chegar a "EXPLOIT BEM-SUCEDIDO": a corrida não libera mais o objeto por baixo do novo handle, então o vazamento nunca retorna um ponteiro de kernel válido.

Aviso legal

Publicado para fins de pesquisa e defesa após as correções do upstream serem lançadas. Fornecido como está. Execute apenas em VMs que você controla.

Baixar ferramenta