
Ricerca di tesi magistrale su CVE-2024-51324 (BYOVD). Exploit avanzato con 4 modalità operative (SCANNER, LOADER, KILLER, CLEANUP), verifica del driver SHA-256 e documentazione accademica completa. Il pezzo del portfolio copre la sicurezza dei driver del kernel Windows, il reverse engineering di IOCTL e lo sfruttamento di Bring Your Own Vulnerable Driver.
Bring Your Own Vulnerable Driver (BYOVD) — Antivirus Baidu
BdApiUtil64.sys
Tre primitive del kernel non documentate: terminazione dei processi, cancellazione arbitraria di file e cancellazione di file in uso con bypass diSectionObjectPointer
Affetto: Antivirus Baidu v5.2.3.116083 (BdApiUtil64.sys)
Caricamento del driver vulnerabile nel kernel (modalità LOADER)
Questo repository contiene la mia ricerca per la Tesi Magistrale su CVE-2024-51324, una vulnerabilità Bring Your Own Vulnerable Driver (BYOVD) nel driver del kernel BdApiUtil64.sys dell'Antivirus Baidu.
Il record NVD assegna un punteggio base CVSS v3.1 di 3.8 (Basso) con vettore AV:N/AC:L/PR:H/UI:N/S:U/C:L/I:L/A:N e CWE-269 (Gestione impropria dei privilegi). Questo punteggio non riflette la realtà dell'attacco locale documentata in questa ricerca: una volta che il driver viene caricato da un amministratore (un passo unico ottenibile tramite ingegneria sociale o qualsiasi escalation di privilegi locale), qualsiasi processo successivo — inclusi processi in sandbox o di utente standard — può inviare IOCTL senza ulteriori controlli di privilegio. Un punteggio CVSS v3.1 valutato dal ricercatore di 7.8 (Alto) con vettore AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H cattura in modo più accurato la realtà dello sfruttamento post-caricamento. Entrambi i punteggi sono discussi nella documentazione tecnica.
Il driver crea l'oggetto dispositivo \Device\BdApiUtil con SecurityDescriptor = NULL, permettendo a qualsiasi processo indipendentemente dal livello di integrità di aprire un handle e inviare IOCTL. L'analisi statica tramite Ghidra 11.0.3 rivela che il meccanismo interno è più significativo di quanto documentato in precedenza: il driver utilizza PsLookupProcessByProcessId + ObOpenObjectByPointer(KernelMode) anziché ZwOpenProcess, bypassando SeAccessCheck completamente. Tre primitive IOCTL sono state pienamente caratterizzate, due delle quali non hanno documentazione pubblica precedente.
CVE-2024-51324/
├── README.md
├── LICENSE
│
├── drivers/
│ └── BdApiUtil64.sys # Driver (non distribuito)
│
├── exploit/
│ ├── exploit-explanation.md
│ └── byovd_killer.py # Exploit principale — 4 modalità operative
│
└── 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 completo con Ghidra, tre primitive, test 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









Il reverse engineering di BdApiUtil64.sys tramite Ghidra 11.0.3 ha identificato una superficie di attacco più ampia di qualsiasi documento pubblico precedente:
0x800024B4)La catena di dispatch ha tre livelli:
IOCTL 0x800024B4
└─ FUN_00028630 (IRP_MJ_DEVICE_CONTROL dispatcher)
└─ FUN_00015230 (wrapper: validates IOCTL code and buffer size = 4 bytes)
└─ FUN_000152b0 (kill handler — vulnerability locus)
Handler ricostruito (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 ← bypasses SeAccessCheck
local_res18
);
ZwTerminateProcess(local_res18[0], 0);
}
Perché KernelMode bypassa SeAccessCheck:
Percorso ZwOpenProcess:
NtOpenProcess → ObOpenObjectByName → SeAccessCheck
(controlla DACL, token del chiamante, livello di integrità)
può restituire STATUS_ACCESS_DENIED
Percorso ObOpenObjectByPointer(KernelMode):
SeAccessCheck ← NON invocato
→ Handle PROCESS_ALL_ACCESS concesso incondizionatamente
ZwOpenProcess è assente dalla tabella di importazione del driver. La descrizione basata su ZwOpenProcess presente in fonti precedenti è tecnicamente errata.
0x80002648)Il handler FUN_00013bb0 riceve un percorso Unicode, valida InputBufferLength ≥ 0x208 e delega a FUN_00013c10. Il sub-handler apre il file in modalità kernel (nessun SeAccessCheck sul token del chiamante) e invia un IRP IRP_MJ_SET_INFORMATION con FileInformationClass = 0xD (FileDispositionInformation), contrassegnando il file per la cancellazione. Qualsiasi file accessibile al kernel può essere cancellato indipendentemente dai permessi NTFS.
0x8000264C)Il handler FUN_000139d0 accede a FileObject->SectionObjectPointer (offset 0x28 in FILE_OBJECT) e annulla temporaneamente due campi prima di inviare l'IRP di cancellazione:
plVar1 = FileObject->SectionObjectPointer;
plVar1[2] = 0; // DataSectionObject → NULL
plVar1[0] = 0; // ImageSectionObject → NULL
IofCallDriver(device, irp);
KeWaitForSingleObject(...);
// Restore after completion
plVar1[2] = DataSectionObject_backup;
plVar1[0] = ImageSectionObject_backup;
IopDeleteFile controlla questi puntatori prima di onorare FileDispositionInformation. Annullandoli, il handler fa apparire il file come non mappato, bypassando la protezione per file in uso. Questa primitiva può eliminare il binario di un agente EDR in esecuzione dal disco senza prima terminare il processo.
Catena completa di eliminazione EDR:
1. Termina il processo EDR (IOCTL 0x800024B4)
2. Elimina il binario EDR dal disco (IOCTL 0x8000264C) ← funziona anche se mappato in memoria
3. Impedisci il riavvio ← l'eseguibile non esiste più sul disco
PPL (Protected Process Light) è l'unica mitigazione a runtime che resiste alla terminazione basata su ObOpenObjectByPointer(KernelMode) da questo driver.
--cleanupL'Event ID 7045 è l'unico artefatto che sopravvive a un ciclo di attacco completo con pulizia. Contiene il nome del servizio, ImagePath (percorso completo del binario), il tipo di servizio e il timestamp di creazione.
Eseguire wevtutil cl System per rimuovere l'Event ID 7045 genera Event ID 1102 nel canale Security, registrando chi ha cancellato il log e quando. Ciò rende rilevabile la manomissione dei log anche se l'artefatto originale viene distrutto.
| Azione dell'attaccante | Artefatto risultante | Canale | Persistenza |
|---|---|---|---|
wevtutil cl System |
title: BYOVD Attack 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
Regola Sigma completa e configurazione Sysmon (Event ID 6 per hash SHA-256 + Event ID 13 per chiave di registro) disponibili in docs/detection/.
| Documento | Descrizione |
|---|---|
| Analisi della causa principale |
Questa ricerca fa parte della mia Tesi Magistrale in Cybersecurity (UCAM — Campus Internacional de Ciberseguridad), che analizza vulnerabilità N-Day in diversi ambienti.
Questa CVE rappresenta il vettore driver del kernel Windows / BYOVD all'interno della tesi, dimostrando:
ZwOpenProcess assente; il meccanismo reale è ObOpenObjectByPointer(KernelMode))Keywords: BYOVD · Kernel Driver · IOCTL · Ghidra · Process Termination ·
File Deletion · SectionObjectPointer · ObOpenObjectByPointer · Defense Evasion ·
CVE-2024-51324
Annais Molina (devianntsec) — Studente Magistrale in Cybersecurity
Licenza MIT — vedi LICENSE
Questo repository è fornito solo per scopi educativi e di ricerca sulla sicurezza, come parte di una Tesi Magistrale accademica. Tutti i test sono stati eseguiti su macchine virtuali isolate senza esposizione alla rete. Il driver vulnerabile (BdApiUtil64.sys) non è distribuito in questo repository — deve essere ottenuto in modo indipendente. Utilizzare solo su sistemi di cui si è proprietari o per i quali si dispone di esplicita autorizzazione scritta al test. L'uso non autorizzato contro sistemi è illegale e può comportare azioni penali.
| Aspetto | Descrizione |
|---|
| Correzione tecnica | ZwOpenProcess è assente dalla tabella di importazione; il meccanismo reale è PsLookupProcessByProcessId + ObOpenObjectByPointer(KernelMode), che bypassa SeAccessCheck incondizionatamente |
| Tre primitive documentate | Terminazione dei processi (0x800024B4), cancellazione arbitraria di file (0x80002648) e cancellazione di file in uso con bypass di SectionObjectPointer (0x8000264C) — le ultime due non hanno documentazione pubblica precedente |
| Quattro modalità operative | LOADER, KILLER, SCANNER e CLEANUP — gestione completa del ciclo di vita |
| Verifica SHA-256 | Hash del driver verificato prima di ogni tentativo di caricamento |
| Test empirico PPL | 10 tentativi per categoria di processo che confermano PPL come unica mitigazione a runtime |
| Analisi forense | Persistenza dell'Event ID 7045 dopo la pulizia; Event ID 1102 come artefatto di cancellazione del log auto-incriminante |
| Regole di rilevamento | Regola Sigma e configurazione Sysmon (Event ID 6 per hash + Event ID 13 per chiave di registro) |
| Rivalutazione CVSS | Discrepanza documentata tra il punteggio ufficiale NVD (3.8 Basso) e la gravità di sfruttamento locale valutata dal ricercatore (7.8 Alto) |
| Modalità | Comando | Privilegi | Descrizione |
|---|
| SCANNER | --scan | Qualsiasi utente | Informazioni sullo stato del sistema e del driver |
| LOADER | --load | Amministratore | Carica il driver tramite creazione di servizio kernel |
| KILLER | --kill / --pid | Qualsiasi utente | Termina i processi tramite IOCTL |
| CLEANUP | --cleanup | Amministratore | Arresta ed elimina il servizio driver |
| IOCTL | Handler | Primitiva | Documentazione precedente |
|---|
0x800024B4 | FUN_000152b0 | Terminazione dei processi | Parziale (meccanismo errato) |
0x80002648 | FUN_00013bb0 | Cancellazione arbitraria di file | Nessuna |
0x8000264C | FUN_00013850 | Cancellazione di file in uso (bypass SectionObjectPointer) | Nessuna |
| Processo | PPL attivo | Terminabile | Causa |
|---|
notepad.exe | No | ✅ 10/10 | Nessuna protezione |
regedit.exe | No | ✅ 10/10 | Nessuna protezione |
spoolsv.exe | No | ✅ 9/10 | SCM riavvia in 1 caso |
MsMpEng.exe | No (nessun PPL nell'ambiente di test) | ✅ 8/10 | Leggera variabilità di temporizzazione |
lsass.exe | No (RunAsPPL assente) | ✅ 6/10 | Variabilità di stato |
csrss.exe | Sì (PPL incondizionato) | ❌ 0/10 | STATUS_ACCESS_DENIED |
| Presente | Assente |
|---|
PsLookupProcessByProcessId | ZwOpenProcess |
ObOpenObjectByPointer | SeAccessCheck |
ZwTerminateProcess | SePrivilegeCheck |
PsGetCurrentProcess | |
IoGetRequestorProcess |
| Scenario | Target | Impatto |
|---|
| Terminazione EDR/AV | MsMpEng.exe, SentinelAgent.exe | Evasione della difesa |
| Cancellazione binario EDR (in uso) | Eseguibile EDR sul disco | Impedisci riavvio dopo la terminazione |
| Interruzione log di audit | Servizio EventLog | Manipolazione delle prove forensi |
| Bypass del processo protetto | lsass.exe (senza RunAsPPL) | Facilitatore dell'accesso alle credenziali |
| Preparazione pre-crittografia ransomware | Agenti di sicurezza | Catena completa di evasione della difesa |
| Artefatto | Stato post-pulizia |
|---|
| Servizio in SCM | Rimosso |
Driver in driverquery | Rimosso |
| Oggetto dispositivo | Inaccessibile |
| Chiave di registro | Rimossa |
| Event ID 7045 | Persiste — non può essere rimosso tramite sc delete |
| Event ID 7045 cancellato |
| System |
| — |
wevtutil cl System | Event ID 1102 generato | Security | Permanente |
Controllo di accesso mancante nel handler IRP_MJ_DEVICE_CONTROL |
| Analisi del driver | RE completo con Ghidra, tre primitive IOCTL, test PPL, analisi della tabella di importazione |
| Cronologia CVE | Cronologia della scoperta, divulgazione e patch |