
Pesquisa de tese de mestrado sobre CVE-2024-30051 (Windows DWM Heap Overflow). Apresenta um exploit de alta confiabilidade com otimização automatizada de heap spray, registro em tempo real e análise empírica de taxa de sucesso. Peça de portfólio demonstrando exploração avançada de binários Windows, manipulação de layout de heap e LPE via Desktop Window Manager.
Estouro de Buffer Baseado em Heap no Gerenciador de Janelas da Área de Trabalho do Windows (
dwmcore.dll)
Escalação de Privilégio Local → Nível de Integridade SYSTEM via processo DWM
Alvo de compilação: Windows 11 22H2 (10.0.22621.3447) · Patch: KB5037771
Este repositório contém minha pesquisa de Tese de Mestrado sobre CVE-2024-30051,
uma vulnerabilidade de Escalação de Privilégio de alta severidade (CVSS 7.8) na
Biblioteca Principal do Gerenciador de Janelas da Área de Trabalho do Windows (dwmcore.dll).
A vulnerabilidade se origina de um erro de cálculo de tamanho na divisão inteira em
CCommandBuffer::Initialize. O tamanho usado para new() e o tamanho usado para memcpy()
divergem devido a esse erro, produzindo um estouro de heap de 0x8F bytes. Uma
exploração bem-sucedida faz com que dwm.exe carregue uma DLL controlada pelo atacante,
executando código arbitrário sob a conta window manager\dwm-1 com Nível de Integridade SYSTEM.
CVE-2024-30051-Masters-Thesis/
├── README.md
├── LICENSE
├── setup.bat # Copia s11.dll para o local necessário
│
├── exploit/
│ ├── C21.sln # Solução Visual Studio 2022
│ ├── exploit_src/
│ │ ├── c26f.vcxproj
│ │ ├── c26f.filters
│ │ └── main.cpp # Exploit — heap spray + hook + estouro
│ └── payload/
│ ├── payload.vcxproj
│ ├── payload.vcxproj.filters
│ ├── dllmain.cpp # DLL de payload — spawna shell SYSTEM + limpeza
│ ├── framework.h
│ ├── pch.h
│ └── pch.cpp
│
└── docs/
├── screenshots/ # Capturas de diferenciação de patch, WinDbg e forense
└── analysis/
├── 01-root-cause.md # Bug de divisão inteira em CCommandBuffer::Initialize
├── 02-heap-spray.md # Dados empíricos de 50 sessões e resultados estatísticos
└── 03-timeline.md # Cronologia de descoberta, divulgação e patch
Abra C21.sln no Visual Studio 2022. Compile o projeto payload em Release x64.
Execute setup.bat a partir da raiz do repositório. Ele copia s11.dll para
C:\Users\Public\Documents\s11.dll (o caminho definido por PAYLOAD_DLL_PATH).
⚠️ A DLL deve estar neste caminho exato antes de executar
C26f.exe. Colocá-la junto ao executável não funcionará.
Compile o projeto C26f em Release x64.
x64\Release\C26f.exe
Execute a partir de um CMD padrão (não elevado). O exploit tenta automaticamente novamente até 10 vezes.
Em caso de sucesso, dwm.exe carrega s11.dll e spawna um CMD com Nível de Integridade SYSTEM.
Um log de sessão é escrito em %TEMP%\cve_30051_log.txt.
#define MAX_ATTEMPTS 10 // Máx. de tentativas automáticas por sessão
#define SPRAY_STEP 0x10 // Índice de espaçamento de buracos (1024 buracos)
#define SPRAY_RANGE_START 0x3000 // Índice inicial do intervalo de spray
#define SPRAY_RANGE_END 0x7000 // Índice final do intervalo de spray
#define SLEEP_POST_SPRAY 0xC8 // ms de espera após spray (200ms)
#define SLEEP_POST_HOLES 0xC8 // ms de espera após liberar buracos (200ms)
#define PAYLOAD_DLL_PATH "C:\\Users\\Public\\Documents\\s11.dll"
Em CCommandBuffer::Initialize (dwmcore.dll 10.0.22621.3447),
CD2DSharedBuffer::GetBufferSize é chamado duas vezes. O tamanho passado para new() sofre
divisão inteira por 0x90 antes da multiplicação, enquanto memcpy() usa o valor bruto:
buffer_size = GetBufferSize() → ex. 0x23F
size_new = (0x23F / 0x90) * 0x90 = 0x1B0 ← alocado
size_memcpy = 0x23F ← copiado
estouro = 0x23F - 0x1B0 = 0x8F bytes
Comparação BinDiff entre o build 10.0.22621.3447 (vulnerável) e 10.0.22621.3593 (corrigido):
A pontuação anômala de 0,32 contra uma similaridade global de 0,98 é a assinatura direta do lócus da vulnerabilidade.
1. Hook RtlCreateHeap → capturar handle do heap do dwmcore
2. Hook RtlAllocateHeap → capturar endereço base do chunk
3. Hook NtDCompositionCreateChannel → capturar MappedAddress (região de memória compartilhada)
4. Hook NtDCompositionCommitChannel → sobrescrever campo de tamanho (0x120 → 0x23F)
injetar comandos de lote adicionais
5. Heap spray de 0x10000 objetos CHolographicInteropTexture (tamanho=0x1B0)
6. Liberar buracos a cada 0x10 índices → criar lacunas para o pouso do estouro
7. Escrever payload no buffer de estouro → KCBTable+0x388 + LoadLibraryA + caminho da DLL
8. Liberar todos os objetos do spray → acionar estouro → LoadLibraryA("s11.dll")
9. dwm.exe carrega DLL de payload → spawna CMD como integridade SYSTEM
A RAM disponível influencia o número de tentativas necessárias para um heap spray bem-sucedido?
Dois blocos de 25 sessões cada. Protocolo por sessão: restaurar snapshot limpo pós-inicialização → aguardar 100 segundos de estabilização → lançar exploit → registrar tentativa bem-sucedida.
| Bloco | RAM | Sessões | Sucessos | Falhas |
|---|---|---|---|---|
| A | 8.192 MB | 25 | 24 |
| Teste | Estatística | Valor-p | Conclusão |
|---|---|---|---|
| Mann-Whitney U | U = 184,0 | p = 0,031 | Rejeita H₀ |
| Teste t de Welch | t(23) = −2,695 | p = 0,011 | Rejeita H₀ |
base = heap_base + 0x720 confirma que o layout de heap pós-inicialização reproduzível
é o principal impulsionador do determinismo — não a densidade de buracos.Dados brutos completos, formato do log de sessão e observações de heap determinístico documentados em
docs/analysis/02-heap-spray.md.
Em caso de sucesso, uma janela CMD abre sob window manager\dwm-1:
=====================================================
CVE-2024-30051 - Windows DWM Heap Overflow EoP
CWE-122 | CVSS 7.8 | Elevation of Privilege
=====================================================
Researched and reproduced by : devianntsec
Original PoC by : Ricardo Narvaja (Fortra)
Target : Windows 11 22H2 (22621.3447)
=====================================================
[*] Current user:
window manager\dwm-1
[*] Mandatory Integrity Level:
Mandatory Label\System Mandatory Level S-1-16-16384
[*] Enabled privileges:
SeImpersonatePrivilege Enabled
=====================================================
Shell running under DWM process - SYSTEM level
=====================================================
Os artefatos (s11.dll e o script .bat) são automaticamente deletados após 5 segundos
através de um processo de limpeza adiada.
| Documento | Descrição |
|---|---|
| Análise de Causa Raiz |
Esta pesquisa faz parte da minha Tese de Mestrado em Cibersegurança (UCAM — Campus Internacional de Ciberseguridad), analisando vulnerabilidades N-Day em múltiplos ambientes.
Este CVE representa o vetor de aplicação de desktop Windows dentro da tese, demonstrando:
Palavras-chave: EoP · Heap Overflow · DirectComposition · DWM · Patch Diffing ·
BinDiff · WinDbg · Heap Spray · Análise Empírica · CVE-2024-30051
Annais Molina (devianntsec) — Estudante de Mestrado em Cibersegurança
Licença MIT — veja LICENSE
Este repositório é fornecido apenas para fins educacionais e de pesquisa em segurança, como parte de uma Tese de Mestrado acadêmica. Todos os testes foram realizados em máquinas virtuais isoladas, sem exposição à rede. Utilize apenas em sistemas que você possua ou tenha autorização explícita por escrito para testar. O uso não autorizado contra sistemas é ilegal e pode resultar em processo criminal.
| Aspecto | Descrição |
|---|
| Diferenciação de patch | Análise completa de BinDiff identificando CCommandBuffer::Initialize como o lócus exato da vulnerabilidade (pontuação de similaridade 0,32 vs. global 0,98 em 14.062 funções correspondentes) |
| Análise dinâmica com WinDbg | Verificação passo a passo de todos os 4 hooks, substituição do campo de tamanho e construção do payload |
| Análise empírica de heap spray | 50 sessões controladas em duas configurações de RAM (8.192 MB e 4.096 MB) com testes estatísticos formais |
| Resultados estatísticos | Mann-Whitney U (p = 0,031) e teste t de Welch (p = 0,011) confirmam efeito da RAM; médias observadas 12,9–19× melhores que a previsão teórica de ~64 tentativas |
| Caminho da DLL de payload centralizado | Caminho codificado extraído para a constante de pré-processador #define PAYLOAD_DLL_PATH |
| Registro de sessão | Log completo com timestamp por sessão escrito em %TEMP%\cve_30051_log.txt |
| Documentação acadêmica | Causa raiz, análise de heap spray de 50 sessões e cronologia do CVE |
| Métrica | Valor |
|---|
| Similaridade global | 0,98 |
| Confiança | 0,99 |
| Funções correspondentes | 14.062 (99,1%) |
Similaridade de CCommandBuffer::Initialize | 0,32 |
| Blocos básicos — versão vulnerável | 4 |
| Blocos básicos — versão corrigida | 20 (16 blocos de validação adicionados) |
| 1 |
| B | 4.096 MB | 25 | 24 | 1 |
| Bloco | RAM | Média de tentativas | Desvio padrão | IC 95% | Fator vs. teoria (64) |
|---|
| A | 8.192 MB | 3,375 | 1,135 | [2,896; 3,854] | ≈ 19× mais rápido |
| B | 4.096 MB | 4,958 | 2,645 | [3,841; 6,076] | ≈ 12,9× mais rápido |
| Artefato | Localização | Persistência | Ferramenta de detecção |
|---|
cmd.exe filho de dwm.exe | Log de Eventos de Segurança | Sim (se auditoria de processos ativa) | Event ID 4688 |
Processo externo acessando dwm.exe | Sysmon | Sim | Sysmon Event ID 10 |
Queda de dwm.exe em tentativas falhas | Log de Eventos de Aplicação | Sim | Event ID 1000 |
DLL de payload s11.dll no disco | C:\Users\Public\Documents\ | Apenas primeiros ~5 segundos | Monitoramento SHA-256 |
Bug de divisão inteira em CCommandBuffer::Initialize, metodologia de diferenciação de patch |
| Análise de Heap Spray | Dados empíricos de 50 sessões, dados brutos de sessão, testes estatísticos |
| Cronologia CVE | Descoberta, divulgação e cronologia do patch |