
Cadeia de exploração completa para CVE-2025-7771 em ThrottleStop.sys, abusando de IOCTLs de leitura/escrita de memória física não validados para escalar de administrador para SYSTEM no Windows.
Prova de conceito completa para o driver ThrottleStop.sys da TechPowerUp (CVE-2025-7771).
Um driver de kernel assinado e ainda carregável expõe leitura e escrita de memória física
não validadas através de dois IOCTLs. Este repositório transforma essa primitiva em uma
escalada de privilégios local de administrador para SYSTEM funcional e documenta uma
peculiaridade de nomenclatura de dispositivo que quebra a maioria das detecções baseadas
em caminho e nome de arquivo.
Já existia um PoC para os mesmos IOCTLs (veja Créditos). Esta é uma cadeia de exploração independente e completa, em vez de uma demonstração de primitiva.
| Campo | Valor |
|---|
| SHA256 | 16F83F056177C4EC24C7E99D01CA9D9D6713BD0497EEEDB777A3FFEFA99C97F0 |
| SHA1 | 82ED942A52CDCF120A8919730E00BA37619661A3 |
| MD5 | 6BC8E3505D9F51368DDF323ACB6ABC49 |
| Versão | 3.0.0.0 ("Low-Level Driver", 2004-2020) |
| Assinante | TechPowerUp LLC, DigiCert EV Code Signing |
| Impressão digital do certificado | 524EDA9C819321C66E22C7BABEB23DAEAFFB2182 |
| Validade do certificado | 2019-08-10 a 2022-06-15 |
O certificado expirou em 2022, mas a assinatura carrega um carimbo de data/hora de contra-assinatura confiável, então o Windows ainda o carrega. A revogação só ajuda se sua data preceder o momento da assinatura, o que raramente é o caso para drivers antigos como este.
O recurso de versão não possui CompanyName, OriginalFilename ou InternalName, então
o arquivo não pode ser atribuído a um fornecedor a partir de seus próprios metadados.
Dois IOCTLs leem e escrevem memória física sem validação de limites ou endereço:
| IOCTL | Operação |
|---|---|
0x80006498 | Leitura física |
0x8000649C | Escrita física |
Ambos são METHOD_BUFFERED, então não há desreferência de ponteiro de usuário; o defeito
é a validação ausente do endereço físico fornecido pelo chamador, não um ponteiro não
verificado.
Vale destacar: o manipulador de escrita 0x8000649C é declarado como FILE_READ_ACCESS.
Um handle aberto somente para leitura ainda pode emitir escritas físicas, então a máscara
de acesso declarada não corresponde ao que o manipulador realmente faz.
Abrir o dispositivo requer direitos de administrador, então isso não é uma travessia de limite de privilégio por si só. O que isso dá a um atacante que já é admin é leitura/escrita arbitrária de kernel a partir do modo usuário, o que derrota as proteções que deveriam resistir acima do admin: integridade de código HVCI, PPL e autoproteção de EDR/AV. Clássico bring-your-own-vulnerable-driver.
Como demonstração concreta, o PoC usa a primitiva de R/W para roubar o token do SYSTEM e gerar um shell SYSTEM.
CVSS 4.0: AV:L/AC:H/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H (8.7, Alto).
Tudo roda a partir do modo usuário contra os IOCTLs de R/W físico do driver. Não há percurso de tabela de páginas nem CR3 envolvido; ambos os processos são localizados escanenado a memória física diretamente:
ImageFileName seja System e UniqueProcessId seja 4. A varredura é limitada aos
intervalos de RAM populados lidos da chave de registro
HARDWARE\RESOURCEMAP\...\Physical Memory do firmware, não uma janela adivinhada,
então buracos de MMIO nunca são tocados e nada acima da RAM instalada é perdido.Token (EPROC_TOKEN) do EPROCESS localizado.Token.
O token é um _EX_FAST_REF, então os bits baixos de contagem de referência são
mascarados por padrão (--mask seleciona o comportamento).cmd.exe; whoami retorna NT AUTHORITY\SYSTEM.Os offsets (EPROC_TOKEN, EPROC_PID, EPROC_IMG_NAME, etc.) são para uma build
específica e devem ser confirmados contra dt nt!_EPROCESS na versão alvo do Windows.
O nome do executável importa. O passo 3 localiza nosso próprio processo correspondendo
seu ImageFileName na memória física, e esse campo é limitado a 15 caracteres com a
varredura correspondendo aos primeiros 8. Mantenha o nome compilado curto e distinto; se
você renomear o binário, fique dentro desse limite ou a auto-varredura não encontrará o
processo.
O driver não usa um nome de dispositivo fixo. Ele deriva o nome do objeto de dispositivo
a partir do nome do serviço sob o qual está registrado; o nome do arquivo em disco é
irrelevante. Registrar o binário sob o serviço TRIXX produz \\.\TRIXX independentemente
do nome do arquivo em disco.
Então qualquer detecção baseada em \Device\ThrottleStop ou ThrottleStop.sys é
trivialmente contornada. A detecção precisa ser baseada no hash do arquivo ou no
certificado de assinatura:
SHA256: 16F83F056177C4EC24C7E99D01CA9D9D6713BD0497EEEDB777A3FFEFA99C97F0
Thumbprint: 524EDA9C819321C66E22C7BABEB23DAEAFFB2182
Subject: CN=TechPowerUp LLC, O=TechPowerUp LLC, L=Spokane, S=Washington, C=US
A lista DEVICE_NAMES no código-fonte é apenas uma sondagem para instalações conhecidas
do produto. Passe um nome de dispositivo como argumento para direcionar a um serviço que
você mesmo registrou.
| CVE | Driver |
|---|---|
| CVE-2019-7245 | GPU-Z.sys |
| CVE-2025-5324 | GPU-Z.sys |
| CVE-2025-7771 | ThrottleStop.sys (este repositório) |
O binário não é distribuído aqui. Verifique qualquer cópia contra o SHA256 acima. A amostra está catalogada em LOLDrivers.
cl /nologo /EHsc /W4 /O2 src\ThrottleStop.cpp /Fe:myLittleLpe.exe /link advapi32.lib
Apenas para uso em laboratório. Execute dentro de uma VM isolada com um snapshot para o qual reverter.
sc.exe create <name> type= kernel binPath= C:\path\to\ThrottleStop.sys
sc.exe start <name>
myLittleLpe.exe
sc.exe stop <name>
sc.exe delete <name>
O binário não aceita argumentos. Ele imprime o mapa de memória física, escaneia em busca
do EPROCESS do SYSTEM e local, troca o token e gera cmd.exe rodando como
NT AUTHORITY\SYSTEM.

Outros trabalhos públicos sobre o mesmo driver, para comparação:
Publicado para pesquisa defensiva e engenharia de detecção. A vulnerabilidade já é pública como CVE-2025-7771. Tudo aqui foi testado em sistemas de propriedade do autor. Não execute isso contra sistemas que você não possui ou não está autorizado a testar.