
Masterarbeit-Forschung zu CVE-2024-51324 (BYOVD). Fortschrittlicher Exploit mit 4 Betriebsmodi (SCANNER, LOADER, KILLER, CLEANUP), SHA-256-Treiberverifizierung und vollständiger akademischer Dokumentation. Portfolio-Arbeit behandelt Windows-Kernel-Treibersicherheit, IOCTL-Reverse-Engineering und die Ausnutzung von Bring Your Own Vulnerable Driver.
Bring Your Own Vulnerable Driver (BYOVD) — Baidu Antivirus
BdApiUtil64.sys
Drei undokumentierte Kernel-Primitive: Prozessbeendigung, beliebiges Dateilöschen und Löschen von in Benutzung befindlichen Dateien mitSectionObjectPointer-Umgehung
Betroffen: Baidu Antivirus v5.2.3.116083 (BdApiUtil64.sys)
Laden des angreifbaren Treibers in den Kernel (LOADER-Modus)
Dieses Repository enthält meine Masterarbeit-Forschung zu CVE-2024-51324, einer Bring Your Own Vulnerable Driver (BYOVD)-Schwachstelle im Kernel-Treiber BdApiUtil64.sys von Baidu Antivirus.
Der NVD-Eintrag weist einen CVSS-v3.1-Basisscore von 3.8 (Niedrig) mit dem Vektor AV:N/AC:L/PR:H/UI:N/S:U/C:L/I:L/A:N und CWE-269 (Fehlerhaftes Berechtigungsmanagement) aus. Dieser Score spiegelt nicht die in dieser Forschung dokumentierte lokale Angriffsrealität wider: Sobald der Treiber von einem Administrator geladen wurde (ein einmaliger Schritt, der durch Social Engineering oder jede lokale Rechteausweitung erreichbar ist), kann jeder nachfolgende Prozess – einschließlich sandboxierter Prozesse oder Prozesse von Standardbenutzern – IOCTLs ohne weitere Berechtigungsprüfungen senden. Ein forscherbewerteter CVSS-v3.1-Score von 7.8 (Hoch) mit dem Vektor AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H erfasst die Ausbeutungsrealität nach dem Laden genauer. Beide Scores werden in der technischen Dokumentation diskutiert.
Der Treiber erstellt das Geräteobjekt \Device\BdApiUtil mit SecurityDescriptor = NULL, sodass jeder Prozess unabhängig von der Integritätsstufe einen Handle öffnen und IOCTLs senden kann. Die statische Analyse mittels Ghidra 11.0.3 zeigt, dass der interne Mechanismus bedeutender ist als bisher dokumentiert: Der Treiber verwendet PsLookupProcessByProcessId + ObOpenObjectByPointer(KernelMode) anstelle von ZwOpenProcess und umgeht SeAccessCheck vollständig. Drei IOCTL-Primitive wurden vollständig charakterisiert, von denen zwei keine vorherige öffentliche Dokumentation haben.
| Aspekt | Beschreibung |
|---|---|
| Technische Korrektur | ZwOpenProcess fehlt in der Importtabelle; der tatsächliche Mechanismus ist PsLookupProcessByProcessId + ObOpenObjectByPointer(KernelMode), der SeAccessCheck bedingungslos umgeht |
| Drei dokumentierte Primitiven | Prozessbeendigung (0x800024B4), beliebiges Dateilöschen (0x80002648) und Löschen von in Benutzung befindlichen Dateien mit SectionObjectPointer-Umgehung (0x8000264C) – die letzten beiden haben keine vorherige öffentliche Dokumentation |
| Vier Betriebsmodi | LOADER, KILLER, SCANNER und CLEANUP – vollständige Lebenszyklusverwaltung |
| SHA-256-Verifikation | Treiber-Hash vor jedem Ladeversuch verifiziert |
| PPL-empirische Tests | 10 Versuche pro Prozesskategorie, die PPL als einzige Laufzeit-Mitigation bestätigen |
| Forensische Analyse | Ereignis-ID 7045 persistiert nach Bereinigung; Ereignis-ID 1102 als selbstbelastendes Loglösch-Artefakt |
| Erkennungsregeln | Sigma-Regel und Sysmon-Konfiguration (Ereignis-ID 6 nach Hash + Ereignis-ID 13 nach Registrierungsschlüssel) |
| CVSS-Neubewertung | Dokumentierte Diskrepanz zwischen offiziellem NVD-Score (3.8 Niedrig) und forscherbewerteter Schwere lokaler Ausbeutung (7.8 Hoch) |
CVE-2024-51324/
├── README.md
├── LICENSE
│
├── drivers/
│ └── BdApiUtil64.sys # Treiber (nicht verteilt)
│
├── exploit/
│ ├── exploit-explanation.md
│ └── byovd_killer.py # Haupt-Exploit – 4 Betriebsmodi
│
└── 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 # Vollständige Ghidra RE, drei Primitiven, PPL-Tests
└── 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
| Modus | Befehl | Berechtigungen | Beschreibung |
|---|---|---|---|
| SCANNER | --scan | Jeder Benutzer | System- und Treiberstatusinformationen |
| LOADER | --load | Admin | Treiber über Kernel-Diensterstellung laden |
| KILLER | --kill / --pid | Jeder Benutzer | Prozesse über IOCTL beenden |
| CLEANUP | --cleanup | Admin | Treiberdienst stoppen und löschen |









Das Reverse Engineering von BdApiUtil64.sys mittels Ghidra 11.0.3 identifizierte eine größere Angriffsfläche als in allen früheren öffentlichen Quellen dokumentiert:
| IOCTL | Handler | Primitive | Frühere Dokumentation |
|---|---|---|---|
0x800024B4 | FUN_000152b0 | Prozessbeendigung | Teilweise (Mechanismus falsch) |
0x80002648 | FUN_00013bb0 | Beliebiges Dateilöschen | Keine |
0x8000264C | FUN_00013850 | Löschen von in Benutzung befindlichen Dateien (SectionObjectPointer-Umgehung) | Keine |
0x800024B4)Die Dispatch-Kette hat drei Ebenen:
IOCTL 0x800024B4
└─ FUN_00028630 (IRP_MJ_DEVICE_CONTROL-Dispatcher)
└─ FUN_00015230 (Wrapper: validiert IOCTL-Code und Puffergröße = 4 Bytes)
└─ FUN_000152b0 (Kill-Handler – Schwachstellenort)
Rekonstruierter Handler (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 ← umgeht SeAccessCheck
local_res18
);
ZwTerminateProcess(local_res18[0], 0);
}
Warum KernelMode SeAccessCheck umgeht:
ZwOpenProcess-Pfad:
NtOpenProcess → ObOpenObjectByName → SeAccessCheck
(prüft DACL, Aufrufer-Token, Integritätsstufe)
kann STATUS_ACCESS_DENIED zurückgeben
ObOpenObjectByPointer(KernelMode)-Pfad:
SeAccessCheck ← NICHT aufgerufen
→ PROCESS_ALL_ACCESS-Handle wird bedingungslos gewährt
ZwOpenProcess ist in der Importtabelle des Treibers nicht vorhanden. Die auf ZwOpenProcess basierende Beschreibung in früheren Quellen ist technisch falsch.
0x80002648)Der Handler FUN_00013bb0 empfängt einen Unicode-Pfad, validiert InputBufferLength ≥ 0x208 und delegiert an FUN_00013c10. Der Sub-Handler öffnet die Datei im Kernelmodus (kein SeAccessCheck auf dem Aufrufer-Token) und sendet ein IRP_MJ_SET_INFORMATION-IRP mit FileInformationClass = 0xD (FileDispositionInformation), wodurch die Datei zum Löschen markiert wird. Jede für den Kernel zugängliche Datei kann unabhängig von NTFS-Berechtigungen gelöscht werden.
0x8000264C)Der Handler FUN_000139d0 greift auf FileObject->SectionObjectPointer (Offset 0x28 in FILE_OBJECT) zu und setzt vorübergehend zwei Felder auf Null, bevor er das Lösch-IRP sendet:
plVar1 = FileObject->SectionObjectPointer;
plVar1[2] = 0; // DataSectionObject → NULL
plVar1[0] = 0; // ImageSectionObject → NULL
IofCallDriver(device, irp);
KeWaitForSingleObject(...);
// Nach Abschluss wiederherstellen
plVar1[2] = DataSectionObject_backup;
plVar1[0] = ImageSectionObject_backup;
IopDeleteFile prüft diese Zeiger, bevor es FileDispositionInformation berücksichtigt. Durch Nullsetzen lässt der Handler die Datei als nicht gemappt erscheinen und umgeht so den Schutz für in Benutzung befindliche Dateien. Dieses Primitiv kann die Binärdatei eines laufenden EDR-Agenten von der Festplatte löschen, ohne den Prozess zuvor zu beenden.
Vollständige EDR-Eliminierungskette:
1. EDR-Prozess beenden (IOCTL 0x800024B4)
2. EDR-Binärdatei auf Festplatte löschen (IOCTL 0x8000264C) ← funktioniert auch bei speichergemappten Dateien
3. Neustart verhindern ← ausführbare Datei existiert nicht mehr auf der Festplatte
| Prozess | PPL aktiv | Beendbar | Ursache |
|---|---|---|---|
notepad.exe | Nein | ✅ 10/10 | Kein Schutz |
regedit.exe | Nein | ✅ 10/10 | Kein Schutz |
spoolsv.exe | Nein | ✅ 9/10 | SCM startet in 1 Fall neu |
MsMpEng.exe | Nein (kein PPL in Testumgebung) | ✅ 8/10 | Leichte Timing-Variabilität |
lsass.exe | Nein (RunAsPPL nicht vorhanden) | ✅ 6/10 | Zustandsvariabilität |
csrss.exe | Ja (unbedingter PPL) | ❌ 0/10 | STATUS_ACCESS_DENIED |
PPL (Protected Process Light) ist die einzige Laufzeit-Mitigation, die der auf ObOpenObjectByPointer(KernelMode) basierenden Beendigung durch diesen Treiber widersteht.
| Vorhanden | Nicht vorhanden |
|---|---|
PsLookupProcessByProcessId | ZwOpenProcess |
ObOpenObjectByPointer | SeAccessCheck |
ZwTerminateProcess | SePrivilegeCheck |
PsGetCurrentProcess | |
IoGetRequestorProcess |
| Szenario | Ziel | Auswirkung |
|---|---|---|
| EDR/AV-Beendigung | MsMpEng.exe, SentinelAgent.exe | Verteidigungsumgehung |
| Löschen der EDR-Binärdatei (in Benutzung) | EDR-Ausführbare Datei auf Festplatte | Neustart nach Beendigung verhindern |
| Störung der Audit-Protokolle | EventLog-Dienst | Forensik manipulieren |
| Umgehung von geschützten Prozessen | lsass.exe (ohne RunAsPPL) | Zugang zu Anmeldeinformationen erleichtern |
| Ransomware-Vorbereitung vor Verschlüsselung | Sicherheitsagenten | Vollständige Verteidigungsumgehungskette |
--cleanup bestehen bleibt| Artefakt | Zustand nach Bereinigung |
|---|---|
| Dienst in SCM | Entfernt |
Treiber in driverquery | Entfernt |
| Geräteobjekt | Nicht zugänglich |
| Registrierungsschlüssel | Entfernt |
| Ereignis-ID 7045 | Besteht – kann nicht durch sc delete entfernt werden |
Ereignis-ID 7045 ist das einzige Artefakt, das einen vollständigen Angriffszyklus mit Bereinigung überlebt. Es enthält Dienstnamen, ImagePath (voller Binärpfad), Diensttyp und Erstellungszeitstempel.
Die Ausführung von wevtutil cl System zum Entfernen von Ereignis-ID 7045 erzeugt Ereignis-ID 1102 im Sicherheitskanal, die aufzeichnet, wer das Protokoll wann gelöscht hat. Dies macht die Manipulation von Protokollen nachweisbar, selbst wenn das ursprüngliche Artefakt zerstört wird.
| Angreiferaktion | Resultierendes Artefakt | Kanal | Persistenz |
|---|---|---|---|
wevtutil cl System | Ereignis-ID 7045 gelöscht | System | — |
wevtutil cl System | Ereignis-ID 1102 erzeugt | Sicherheit | Dauerhaft |
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
Vollständige Sigma-Regel und Sysmon-Konfiguration (Ereignis-ID 6 nach SHA-256-Hash + Ereignis-ID 13 nach Registrierungsschlüssel) verfügbar in docs/detection/.
| Dokument | Beschreibung |
|---|---|
| Ursachenanalyse | Fehlende Zugriffskontrolle im IRP_MJ_DEVICE_CONTROL-Handler |
| Treiberanalyse | Vollständige Ghidra RE, drei IOCTL-Primitiven, PPL-Tests, Importtabellenanalyse |
| CVE-Zeitleiste | Chronologie von Entdeckung, Offenlegung und Patch |
Diese Forschung ist Teil meiner Masterarbeit in Cybersicherheit (UCAM — Campus Internacional de Ciberseguridad), die N-Day-Schwachstellen in mehreren Umgebungen analysiert.
Diese CVE repräsentiert den Vektor Windows-Kernel-Treiber / BYOVD innerhalb der Arbeit und demonstriert:
ZwOpenProcess fehlt; tatsächlicher Mechanismus ist ObOpenObjectByPointer(KernelMode))Schlagwörter: BYOVD · Kernel-Treiber · IOCTL · Ghidra · Prozessbeendigung ·
Dateilöschen · SectionObjectPointer · ObOpenObjectByPointer · Verteidigungsumgehung ·
CVE-2024-51324
Annais Molina (devianntsec) — Masterstudentin in Cybersicherheit
MIT-Lizenz – siehe LICENSE
Dieses Repository wird ausschließlich zu Bildungs- und Sicherheitsforschungszwecken als Teil einer akademischen Masterarbeit bereitgestellt. Alle Tests wurden auf isolierten virtuellen Maschinen ohne Netzzugriff durchgeführt. Der angreifbare Treiber (BdApiUtil64.sys) wird in diesem Repository nicht verteilt – er muss unabhängig bezogen werden. Verwenden Sie ihn nur auf Systemen, die Ihnen gehören oder für die Sie eine ausdrückliche schriftliche Testgenehmigung haben. Unbefugte Nutzung gegen Systeme ist illegal und kann zu strafrechtlicher Verfolgung führen.