
Prova de conceito para CVE-2026-29923, uma escalada de privilégio local no driver de kernel pstrip64.sys. Demonstra uma primitiva de leitura/escrita de memória física via IOCTL para escalar de usuário não privilegiado para NT AUTHORITY\SYSTEM no Windows.
Um proof-of-concept minimal para CVE-2026-29923, uma vulnerabilidade no driver de kernel pstrip64.sys
(EnTech Taiwan PowerStrip ≤ 3.90.736) que permite que um processo em modo de usuário sem privilégios
escalone para NT AUTHORITY\SYSTEM.
pstrip64.sys expõe um IOCTL (0x80002008) que aceita um endereço físico fornecido pelo usuário
e o mapeia diretamente no espaço de endereço virtual do processo chamador, abrindo
\Device\PhysicalMemory e chamando ZwMapViewOfSection com o handle do processo atual.
Não há verificação de privilégio, nenhuma validação de endereço além do que HalTranslateBusAddress impõe,
e nenhum controle de acesso no link simbólico \\.\PSTRIP64.
O resultado é uma primitiva irrestrita de leitura/escrita de memória física a partir de um processo sem privilégios.
Com leitura/escrita física arbitrária disponível, a exploração segue quatro etapas.
1. Escaneamento por estruturas EPROCESS
A RAM física é percorrida em blocos de 2 MB. Cada bloco é escaneado pela tag do pool do kernel
Proc (0x636F7250), que marca a alocação do pool que contém a estrutura _EPROCESS de um processo.
Candidatos em potencial são validados com três heurísticas leves antes de confiar no PID:
PriorityClass == 0x2 — todos os processos ativos rodam com prioridade NormalProcessLock == 0x0 — o campo de lock está limpo em um processo estávelImageFileName[0] é ASCII imprimível — memória lixo raramente satisfaz isso2. Localizar ambos os ponteiros de token
Dois alvos são necessários:
Token do nosso próprio processo dentro de _EPROCESS_EPROCESS do processo System (PID 4)3. Sobrescrever nosso token
A página de 4 KB contendo nosso campo Token é mapeada e o campo é sobrescrito
com o valor do token do System. A partir deste ponto, o kernel do Windows trata nosso processo
como NT AUTHORITY\SYSTEM.
4. Abrir um shell
cmd.exe é lançado via CreateProcessA. Como processos filho herdam o token do pai,
o shell resultante roda como SYSTEM.
A janela de endereço físico de 3 GB – 4 GB é reservada para MMIO em sistemas x86.
Tentar mapear páginas nessa faixa faz o driver retornar o erro 74
(falha em HalTranslateBusAddress). O escaneamento pula essa janela e retoma em
0x100000000 para capturar estruturas do kernel que o Windows coloca acima da marca de 4 GB.
O manipulador de mapeamento do driver escreve o endereço virtual retornado em um campo DWORD
(LowPart), truncando o VA de 64 bits para 32 bits. Uma compilação de 64 bits recebe um
ponteiro corrompido e trava imediatamente. Compile como x86.
| Software | Versões |
|---|---|
| EnTech Taiwan PowerStrip | ≤ 3.90.736 |
Hash do driver (SHA-256):
ab01485bb7c8bc1a9c86096eeea6d31d8fad557bf4d44072b46373d2203faa6e
Os offsets hardcoded visam Windows 10 22H2 x64. Outras versões exigem
valores atualizados — use dt nt!_EPROCESS no WinDbg para confirmar.
Abra um Prompt de Comando do Desenvolvedor x86 do Visual Studio e execute:
cl /EHsc /O2 exploit.c /Fe:poc.exe
Ou defina o destino da plataforma como x86 no Visual Studio e compile em modo Release. O binário não requer dependências externas além do Windows SDK.
Carregue pstrip64.sys primeiro (requer administrador para carregar o driver, não para executar
a exploração em si uma vez carregado), então:
poc.exe
Uma nova janela cmd.exe será aberta rodando como NT AUTHORITY\SYSTEM.
Bloquear o carregamento do driver (preferido)
Detectar exploração em andamento
SYSTEMNT AUTHORITY\SYSTEM fora de um evento de autenticação legítimoEste código é publicado apenas para fins educacionais e de pesquisa defensiva. Use-o apenas em sistemas de sua propriedade ou para os quais você tenha permissão explícita por escrito para testar. O autor não se responsabiliza por qualquer uso indevido.
| Campo | Offset |
|---|
PriorityClass | 0x5B7 |
ProcessLock | 0x438 |
UniqueProcessId | 0x440 |
ImageFileName | 0x5A8 |
Token | 0x4B8 |