
ThrottleStop.sys Leitura/Escrita Arbitrária de Memória Física
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 não validadas de memória física
através de dois IOCTLs. Este repositório transforma essa primitiva em uma
escalada de privilégio local funcional de administrador para SYSTEM e documenta uma peculiaridade na nomeação de dispositivos
que quebra a maioria das detecções baseadas em caminho e nome de arquivo.
Já existia uma PoC para os mesmos IOCTLs (ver Créditos). Esta é uma cadeia de exploit 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 contém um carimbo de tempo de co-assinatura confiável, então o Windows ainda o carrega. A revogação só ajuda se sua data for anterior ao momento da assinatura, o que raramente acontece com drivers antigos como este.
O recurso de versão não possui CompanyName, OriginalFilename ou InternalName, portanto o arquivo não pode ser atribuído a um fornecedor a partir dos 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, portanto não há desreferência de ponteiro de usuário; o defeito é a
ausência de validação do endereço físico fornecido pelo chamador, não um ponteiro não verificado.
Vale destacar: o handler de escrita 0x8000649C é declarado como FILE_READ_ACCESS. Um handle
aberto somente para leitura ainda pode realizar escritas físicas, portanto a máscara de acesso declarada não
corresponde ao que o handler realmente faz.
Abrir o dispositivo exige direitos de administrador, então isso não é, por si só, uma travessia de limite de privilégio. O que isso dá a um atacante que já é admin é leitura/escrita arbitrária do kernel a partir do modo de usuário, o que anula as proteções que deveriam valer acima de admin: integridade de código HVCI, PPL e autoproteção de EDR/AV. Clássico bring-your-own-vulnerable-driver.
Como demonstração concreta, a PoC usa a primitiva de leitura/escrita 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 é executado a partir do modo de usuário contra os IOCTLs físicos de leitura/escrita do driver. Não há caminhamento de tabelas de páginas e nenhum CR3 envolvido; ambos os processos são localizados varrendo a memória física diretamente:
ImageFileName seja System e UniqueProcessId seja 4. A varredura é limitada às faixas de RAM preenchidas lidas da chave de registro HARDWARE\RESOURCEMAP\...\Physical Memory do firmware, não a uma janela adivinhada, portanto buracos de MMIO nunca são tocados e nada acima da RAM instalada é perdido.Token (EPROC_TOKEN) do EPROCESS localizado.Token do nosso processo. O token é um _EX_FAST_REF, então os bits baixos da contagem de referência são mascarados por padrão (--mask seleciona o comportamento).cmd.exe; whoami retorna .Os offsets (EPROC_TOKEN, EPROC_PID, EPROC_IMG_NAME, etc.) são para um build específico e
devem ser confirmados com dt nt!_EPROCESS na versão do Windows alvo.
O nome do executável importa. O passo 3 localiza o nosso próprio processo ao corresponder o 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, permaneça 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 de como o arquivo é chamado no disco.
Portanto, 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 sonda para instalações conhecidas do produto. Passe um
nome de dispositivo como argumento para mirar 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 poder restaurar.
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, procura o EPROCESS do SYSTEM
e o local, troca o token e gera um cmd.exe executando 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.
NT AUTHORITY\SYSTEM