
CVE-2025-40271 Modifed By MadEploits
Prova de conceito para uma vulnerabilidade de escalada de privilégio local no sistema de arquivos proc do kernel Linux. O bug é um uso-após-liberação em proc_readdir_de() causado por rb_erase() sem RB_CLEAR_NODE(), deixando links obsoletos da árvore rubro-negra que podem ser explorados durante a enumeração de diretórios.
Autor: MadExploits
Pesquisa original da vulnerabilidade e PoC em C por Aviral Srivastava (N-DAY RESEARCH). Este repositório inclui uma versão em shell (
exploit.sh) para ambientes onde a compilação não é prática.
| Campo | Detalhe |
|---|---|
| CVE | CVE-2025-40271 |
| Componente | fs/proc — proc_readdir_de() / remove_proc_entry() |
| Tipo | Uso-após-liberação (links obsoletos de árvore rubro-negra) |
| Impacto | Escalada de privilégio local (LPE) |
| Arquitetura | x86_64 |
| Afetados | Kernels Linux até 6.18-rc5 |
Quando uma entrada de diretório proc é removida, rb_erase() é chamado no nó rb da entrada sem RB_CLEAR_NODE(). Nós liberados podem permanecer acessíveis por meio de links obsoletos da árvore. Se getdents64() competir com a remoção de interface em /proc/self/net/dev_snmp6/, o kernel pode ler memória liberada — frequentemente reaproveitada por objetos msg_msg pulverizados — e retornar valores anômalos de d_ino que vazam ponteiros do heap do kernel.
O PoC verifica a versão do kernel em execução e encerra em builds corrigidos:
| Ramo |
|---|
| Arquivo | Descrição |
|---|---|
exploit.c | PoC completo em C — gerenciamento de veth via netlink, disputa com pthreads, pulverização de msg_msg |
exploit.sh | Versão em shell sem compilação — unshare, ip, Python 3 embutido para syscalls/disputa |
Ambas as implementações seguem o mesmo fluxo de exploração:
CAP_NET_ADMIN no net ns)/proc/self/net/dev_snmp6/getdents64() contra remoção rápida de veth + pulverização do heapd_ino que se assemelham a ponteiros do kernelcat /proc/sys/kernel/unprivileged_userns_clone
# must be 1
exploit.cgcc com pthreadslinux/netlink.h, etc.)gcc -o exploit exploit.c -lpthread
exploit.shbashpython3ip (iproute2)unshare (util-linux com suporte a --map-root-user)Nenhum compilador necessário.
chmod +x exploit.sh
./exploit.sh
gcc -o exploit exploit.c -lpthread
./exploit
Kernel vulnerável — UAF acionado (sucesso parcial):
[+] Kernel X.Y.Z — VULNERABLE
[+] Namespace ready...
[+] Created 32 veth pairs (/proc/self/net/dev_snmp6 populated)
[+] UAF HIT! d_ino=0xffff8880........ (kernel heap pointer)
[+] Kernel heap leak: 0xffff8880........
[*] PARTIAL SUCCESS: UAF + heap leak DEMONSTRATED
Kernel corrigido:
[-] Kernel X.Y.Z — PATCHED
[*] Kernel is patched. Nothing to do.
d_ino contém um valor que corresponde ao padrão de ponteiro do kernel x86_64 (0xffff000000000000), tipicamente do cabeçalho msg_msg m_list sobrepondo dados de proc_dir_entry liberados.modprobe_path requer o deslocamento entre o endereço de heap vazado e a base do texto do kernel — isso é específico da build (KASLR). O PoC demonstra o UAF e o vazamento; uma cadeia completa precisa de offsets para a imagem do kernel alvo.sysctl -w kernel.unprivileged_userns_clone=0
Este projeto é fornecido apenas para pesquisa de segurança autorizada, educação e testes defensivos.
| Função | Nome |
|---|---|
| Autor do repositório | MadExploits |
| Pesquisa original do CVE e PoC em C | Aviral Srivastava — N-DAY RESEARCH |
Use por sua conta e risco. Nenhuma garantia é fornecida.
| Corrigido em |
|---|
| 5.10.x | 5.10.247+ |
| 6.1.x | 6.1.159+ |
| 6.6.x | 6.6.123+ |
| 6.12.x | 6.12.73+ |
| 6.18+ | 6.18-rc6+ |
| 7.x+ | Corrigido |