
CVE-2026-41089 PoC — Netlogon CLDAP estouro de buffer de pilha (CVSS 9.8 CRÍTICO)
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██╗ ██████╗ ██████╗
██╔════╝██║ ██║██╔════╝ ██║ ██║███║██╔═████╗██╔═████╗
██║ ██║ ██║█████╗ ███████║╚██║██║██╔██║██║██╔██║
██║ ╚██╗ ██╔╝██╔══╝ ██╔══██║ ██║████╔╝██║████╔╝██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ██║ ██║╚██████╔╝╚██████╔╝
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
Execução Remota de Código no Windows Netlogon via Estouro de Buffer de Pilha CLDAP
Um único pacote UDP malicioso enviado para a porta 389 causa estouro em um buffer de pilha de 528 bytes dentro do LSASS em qualquer Controlador de Domínio Windows sem patch. O processo falha. O DC reinicia em aproximadamente 60 segundos. Nenhuma autenticação é necessária.
| Vetor de Ataque | UDP 389 (CLDAP), pré-autenticação, zero credenciais |
| Impacto | Falha do LSASS, reinicialização do DC, possível RCE |
| CWE | CWE-121 (Estouro de Buffer baseado em Pilha) |
| Vetor CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Publicado | 12 de maio de 2026 por Microsoft |
python3 poc.py 10.0.50.21 corp.local
Três fases: ping normal para confirmar que o DC está ativo, ping de estouro com um nome de usuário de 130 caracteres, verificação de atividade. Leva aproximadamente 10 segundos.
Todas as versões do Windows Server em execução como Controlador de Domínio:
| Versão do Servidor | Corrigido Em |
|---|---|
| 2012 / 2012 R2 | Correções apenas ESU |
| 2016 | 10.0.14393.9140 |
| 2019 | 10.0.17763.8755 |
| 2022 | 10.0.20348.5074 |
| 2022 23H2 | 10.0.25398.2330 |
| 2025 | 10.0.26100.32772 |
NlGetLocalPingResponse aloca um buffer de pilha de 528 bytes e o passa para BuildSamLogonResponse. Essa função chama NetpLogonPutUnicodeString para escrever no buffer o nome do servidor, nome do domínio, GUIDs e o nome de usuário controlado pelo atacante.
O bug: NetpLogonPutUnicodeString recebe um comprimento máximo em bytes, mas o trata como uma contagem de WCHAR. Cada string escrita por esse caminho ocupa o dobro do espaço esperado. O campo "User" no filtro CLDAP (até 130 wchars, 260 bytes no fio) empurra a escrita combinada para além do limite de 528 bytes.
I_NetLogonLdapLookupEx
-> NlGetLocalPingResponse // buffer de pilha de 528 bytes
-> LogonRequestHandler
-> BuildSamLogonResponse
-> NetpLogonPutUnicodeString // confusão entre tamanho byte/WCHAR
python3 poc.py <target_ip> <domain_name> [opções]
| Flag | Descrição | Padrão |
|---|---|---|
-l | Comprimento do nome de usuário em caracteres | 130 |
-t | Timeout de recebimento UDP (segundos) | 5 |
-d | Atraso entre estouro e verificação de atividade (segundos) | 3 |
# Teste de conectividade (nome de usuário curto, sem estouro)
python3 poc.py 10.0.50.21 corp.local
# Tentativa de estouro padrão
python3 poc.py 10.0.50.21 corp.local -l 130
# Payload maior, timeout mais longo para redes lentas
python3 poc.py 10.0.50.21 corp.local -l 200 -t 10
Requer Python 3.8+. Sem pacotes de terceiros.
O estouro desencadeia uma negação de serviço (falha do LSASS, reinicialização do DC). RCE por corrupção de pilha é teoricamente possível. Este PoC não tenta execução de código.
Rede. Analise o tráfego CLDAP em busca de solicitações de pesquisa onde o atributo de filtro "User" exceda 20-30 caracteres. Pings normais de localização de DC usam nomes de contas de serviço (strings curtas).
Host. Monitore falhas do LSASS relacionadas ao netlogon.dll (ID do Evento 1000). Ative o log de depuração do Netlogon:
nltest /dbflag:0x2080ffff
mov edx, 0x40 para reduzir pela metade o comprimento máximo do nome de usuário)Legal. Este código existe para pesquisa de segurança autorizada e educação. Teste apenas em sistemas que você possui ou para os quais possui permissão por escrito para testar. O acesso não autorizado a sistemas de computador viola o CFAA e leis equivalentes na maioria das jurisdições.