
Master's Thesis research on CVE-2024-51324 (BYOVD). Advanced exploit with 4 operational modes (SCANNER, LOADER, KILLER, CLEANUP), SHA-256 driver verification, and full academic documentation. Portfolio piece covers Windows kernel driver security, IOCTL reverse engineering, and Bring Your Own Vulnerable Driver exploitation.
Bring Your Own Vulnerable Driver (BYOVD) — Baidu Antivirus
BdApiUtil64.sys
Trois primitives noyau non documentées : terminaison de processus, suppression arbitraire de fichiers, et suppression de fichier en cours d'utilisation avec contournement deSectionObjectPointer
Affecté : Baidu Antivirus v5.2.3.116083 (BdApiUtil64.sys)
Chargement du pilote vulnérable dans le noyau (mode LOADER)
Ce dépôt contient ma recherche de mémoire de Master sur CVE-2024-51324, une
vulnérabilité Bring Your Own Vulnerable Driver (BYOVD) dans le pilote noyau
BdApiUtil64.sys de Baidu Antivirus.
L'enregistrement NVD attribue un score de base CVSS v3.1 de 3,8 (Faible) avec le vecteur
AV:N/AC:L/PR:H/UI:N/S:U/C:L/I:L/A:N et CWE-269 (Gestion incorrecte des privilèges).
Ce score ne reflète pas la réalité de l'attaque locale documentée dans cette recherche : une
fois que le pilote est chargé par un administrateur (étape unique réalisable via ingénierie
sociale ou toute élévation de privilège locale), tout processus ultérieur — y compris les
processus sandboxés ou ceux d'un utilisateur standard — peut envoyer des IOCTL sans vérification
supplémentaire de privilèges. Un score CVSS v3.1 évalué par le chercheur de 7,8 (Élevé) avec
le vecteur AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H capture plus précisément la réalité de
l'exploitation post-chargement. Les deux scores sont discutés dans la documentation technique.
Le pilote crée l'objet de périphérique \Device\BdApiUtil avec
SecurityDescriptor = NULL, permettant à tout processus, quel que soit son niveau d'intégrité,
d'ouvrir un handle et d'envoyer des IOCTL. L'analyse statique via Ghidra 11.0.3 révèle que le
mécanisme interne est plus important que ce qui a été documenté précédemment : le pilote utilise
PsLookupProcessByProcessId + ObOpenObjectByPointer(KernelMode) plutôt que
ZwOpenProcess, contournant entièrement SeAccessCheck. Trois primitives IOCTL ont été
entièrement caractérisées, dont deux n'ont aucune documentation publique antérieure.
CVE-2024-51324/
├── README.md
├── LICENSE
│
├── drivers/
│ └── BdApiUtil64.sys # Pilote (non distribué)
│
├── exploit/
│ ├── exploit-explanation.md
│ └── byovd_killer.py # Exploit principal — 4 modes opérationnels
│
└── 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 # Analyse Ghidra complète, trois primitives, tests 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









Le rétro-ingénierie de BdApiUtil64.sys via Ghidra 11.0.3 a identifié une surface d'attaque
plus large que toute source publique antérieure ne le documente :
0x800024B4)La chaîne de distribution comporte trois niveaux :
IOCTL 0x800024B4
└─ FUN_00028630 (distributeur IRP_MJ_DEVICE_CONTROL)
└─ FUN_00015230 (wrapper : valide le code IOCTL et la taille du tampon = 4 octets)
└─ FUN_000152b0 (gestionnaire kill — locus de vulnérabilité)
Gestionnaire reconstruit (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 ← contourne SeAccessCheck
local_res18
);
ZwTerminateProcess(local_res18[0], 0);
}
Pourquoi KernelMode contourne SeAccessCheck :
Chemin ZwOpenProcess :
NtOpenProcess → ObOpenObjectByName → SeAccessCheck
(vérifie DACL, jeton appelant, niveau d'intégrité)
peut retourner STATUS_ACCESS_DENIED
Chemin ObOpenObjectByPointer(KernelMode) :
SeAccessCheck ← NON invoqué
→ Handle PROCESS_ALL_ACCESS accordé inconditionnellement
ZwOpenProcess est absent de la table d'importation du pilote. La description basée sur
ZwOpenProcess présente dans les sources antérieures est techniquement incorrecte.
0x80002648)Le gestionnaire FUN_00013bb0 reçoit un chemin Unicode, valide
InputBufferLength ≥ 0x208, et délègue à FUN_00013c10. Le sous-gestionnaire ouvre
le fichier en mode noyau (pas de SeAccessCheck sur le jeton appelant) et envoie une
IRP IRP_MJ_SET_INFORMATION avec FileInformationClass = 0xD
(FileDispositionInformation), marquant le fichier pour suppression. Tout fichier accessible
au noyau peut être supprimé indépendamment des permissions NTFS.
0x8000264C)Le gestionnaire FUN_000139d0 accède à FileObject->SectionObjectPointer (décalage 0x28
dans FILE_OBJECT) et met temporairement à zéro deux champs avant d'envoyer l'IRP de suppression :
plVar1 = FileObject->SectionObjectPointer;
plVar1[2] = 0; // DataSectionObject → NULL
plVar1[0] = 0; // ImageSectionObject → NULL
IofCallDriver(device, irp);
KeWaitForSingleObject(...);
// Restauration après achèvement
plVar1[2] = DataSectionObject_backup;
plVar1[0] = ImageSectionObject_backup;
IopDeleteFile vérifie ces pointeurs avant d'honorer FileDispositionInformation.
En les annulant, le gestionnaire fait apparaître le fichier comme non mappé, contournant
la protection d'utilisation en cours. Cette primitive peut supprimer le binaire d'un agent EDR
en cours d'exécution du disque sans d'abord terminer le processus.
Chaîne complète d'élimination d'EDR :
1. Terminer le processus EDR (IOCTL 0x800024B4)
2. Supprimer le binaire EDR du disque (IOCTL 0x8000264C) ← fonctionne même s'il est mappé en mémoire
3. Empêcher le redémarrage ← le fichier exécutable n'existe plus sur le disque
PPL (Protected Process Light) est la seule mitigation au moment de l'exécution qui résiste
à la terminaison basée sur ObOpenObjectByPointer(KernelMode) à partir de ce pilote.
--cleanupEvent ID 7045 est le seul artefact qui survit à un cycle d'attaque complet avec
nettoyage. Il contient le nom du service, ImagePath (chemin complet du binaire), le type
de service et l'horodatage de création.
Exécuter wevtutil cl System pour supprimer Event ID 7045 génère Event ID 1102
dans le canal Security, enregistrant qui a effacé le journal et quand. Cela rend la falsification
des journaux détectable même si l'artefact original est détruit.
| Action de l'attaquant | Artefact résultant | Canal | Persistance |
|---|---|---|---|
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
Règle Sigma complète et configuration Sysmon (Event ID 6 par hachage SHA-256 + Event ID 13
par clé de registre) disponibles dans docs/detection/.
| Document | Description |
|---|---|
| Analyse de la cause racine |
Cette recherche fait partie de mon Master en Cybersécurité (UCAM — Campus Internacional de Ciberseguridad), analysant les vulnérabilités N-Day dans plusieurs environnements.
Cette CVE représente le vecteur pilote noyau Windows / BYOVD dans le mémoire, démontrant :
ZwOpenProcess absent ;
le mécanisme réel est ObOpenObjectByPointer(KernelMode))Mots-clés : BYOVD · Pilote noyau · IOCTL · Ghidra · Terminaison de processus ·
Suppression de fichiers · SectionObjectPointer · ObOpenObjectByPointer · Contournement de la défense ·
CVE-2024-51324
Annais Molina (devianntsec) — Étudiante en Master en Cybersécurité
Licence MIT — voir LICENSE
Ce dépôt est fourni à des fins éducatives et de recherche en sécurité uniquement,
dans le cadre d'une thèse de Master académique. Tous les tests ont été effectués sur des
machines virtuelles isolées sans exposition réseau. Le pilote vulnérable (BdApiUtil64.sys)
n'est pas distribué dans ce dépôt — il doit être obtenu indépendamment. Utiliser uniquement
sur des systèmes dont vous êtes propriétaire ou pour lesquels vous avez une autorisation écrite
explicite de tester. Toute utilisation non autorisée contre des systèmes est illégale et peut
entraîner des poursuites pénales.
| Aspect | Description |
|---|
| Correction technique | ZwOpenProcess est absent de la table d'importation ; le mécanisme réel est PsLookupProcessByProcessId + ObOpenObjectByPointer(KernelMode), qui contourne inconditionnellement SeAccessCheck |
| Trois primitives documentées | Terminaison de processus (0x800024B4), suppression arbitraire de fichiers (0x80002648), et suppression de fichier en cours d'utilisation avec contournement de SectionObjectPointer (0x8000264C) — les deux dernières n'ont aucune documentation publique antérieure |
| Quatre modes opérationnels | LOADER, KILLER, SCANNER et CLEANUP — gestion complète du cycle de vie |
| Vérification SHA-256 | Hachage du pilote vérifié avant toute tentative de chargement |
| Tests empiriques PPL | 10 tentatives par catégorie de processus confirmant PPL comme seule mitigation au moment de l'exécution |
| Analyse forensique | Event ID 7045 persistant après nettoyage ; Event ID 1102 comme artefact auto-incriminant d'effacement de journal |
| Règles de détection | Règle Sigma et configuration Sysmon (Event ID 6 par hachage + Event ID 13 par clé de registre) |
| Réévaluation CVSS | Écart documenté entre le score officiel NVD (3,8 Faible) et la sévérité d'exploitation locale évaluée par le chercheur (7,8 Élevé) |
| Mode | Commande | Privilèges | Description |
|---|
| SCANNER | --scan | Tout utilisateur | Informations sur le système et l'état du pilote |
| LOADER | --load | Administrateur | Chargement du pilote via création d'un service noyau |
| KILLER | --kill / --pid | Tout utilisateur | Terminaison de processus via IOCTL |
| CLEANUP | --cleanup | Administrateur | Arrêt et suppression du service du pilote |
| IOCTL | Gestionnaire | Primitif | Documentation antérieure |
|---|
0x800024B4 | FUN_000152b0 | Terminaison de processus | Partielle (mécanisme incorrect) |
0x80002648 | FUN_00013bb0 | Suppression arbitraire de fichiers | Aucune |
0x8000264C | FUN_00013850 | Suppression de fichier en cours d'utilisation (contournement SectionObjectPointer) | Aucune |
| Processus | PPL actif | Terminable | Cause |
|---|
notepad.exe | Non | ✅ 10/10 | Aucune protection |
regedit.exe | Non | ✅ 10/10 | Aucune protection |
spoolsv.exe | Non | ✅ 9/10 | SCM redémarre dans 1 cas |
MsMpEng.exe | Non (pas de PPL dans l'environnement de test) | ✅ 8/10 | Légère variabilité temporelle |
lsass.exe | Non (RunAsPPL absent) | ✅ 6/10 | Variabilité d'état |
csrss.exe | Oui (PPL inconditionnel) | ❌ 0/10 | STATUS_ACCESS_DENIED |
| Présent | Absent |
|---|
PsLookupProcessByProcessId | ZwOpenProcess |
ObOpenObjectByPointer | SeAccessCheck |
ZwTerminateProcess | SePrivilegeCheck |
PsGetCurrentProcess | |
IoGetRequestorProcess |
| Scénario | Cible | Impact |
|---|
| Terminaison EDR/AV | MsMpEng.exe, SentinelAgent.exe | Contournement de la défense |
| Suppression du binaire EDR (en cours d'utilisation) | Exécutable EDR sur disque | Empêche le redémarrage après terminaison |
| Perturbation des journaux d'audit | Service EventLog | Altération des preuves forensiques |
| Contournement de processus protégé | lsass.exe (sans RunAsPPL) | Facilitateur d'accès aux identifiants |
| Préparation avant chiffrement par ransomware | Agents de sécurité | Chaîne complète de contournement de la défense |
| Artefact | État après nettoyage |
|---|
| Service dans SCM | Supprimé |
Pilote dans driverquery | Supprimé |
| Objet de périphérique | Inaccessible |
| Clé de registre | Supprimée |
| Event ID 7045 | Persiste — ne peut pas être supprimé par sc delete |
| Event ID 7045 supprimé |
| System |
| — |
wevtutil cl System | Event ID 1102 généré | Security | Permanent |
Contrôle d'accès manquant dans le gestionnaire IRP_MJ_DEVICE_CONTROL |
| Analyse du pilote | Analyse Ghidra complète, trois primitives IOCTL, tests PPL, analyse de la table d'importation |
| Chronologie CVE | Découverte, divulgation et chronologie des correctifs |