
Исследование для магистерской диссертации по CVE-2024-51324 (BYOVD). Продвинутый эксплойт с 4 режимами работы (SCANNER, LOADER, KILLER, CLEANUP), верификацией драйвера по SHA-256 и полной академической документацией. Портфолио-проект охватывает безопасность драйверов ядра Windows, реверс-инжиниринг IOCTL и эксплуатацию Bring Your Own Vulnerable Driver.
Bring Your Own Vulnerable Driver (BYOVD) — антивирус Baidu,
BdApiUtil64.sys
Три недокументированных примитива ядра: завершение процессов, произвольное удаление файлов и удаление используемых файлов в обходSectionObjectPointer
Затрагиваемое ПО: Baidu Antivirus v5.2.3.116083 (BdApiUtil64.sys)
Загрузка уязвимого драйвера в ядро (режим LOADER)
Этот репозиторий содержит моё исследование в рамках магистерской диссертации по
CVE-2024-51324 — уязвимости класса Bring Your Own Vulnerable Driver (BYOVD)
в драйвере ядра BdApiUtil64.sys антивируса Baidu.
Запись NVD присваивает базовую оценку CVSS v3.1 3.8 (Low) с вектором
AV:N/AC:L/PR:H/UI:N/S:U/C:L/I:L/A:N и CWE-269 (Improper Privilege Management).
Эта оценка не отражает реальную картину локальной атаки, задокументированную в данном
исследовании: после того как драйвер загружен администратором (одноразовый шаг,
достижимый с помощью социальной инженерии или любой локальной эскалации привилегий),
любой последующий процесс — включая процессы в песочнице или процессы стандартного
пользователя — может отправлять IOCTL без дополнительных проверок прав. Оценка
CVSS v3.1, присвоенная исследователем, — 7.8 (High) с вектором
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H — более точно отражает реальность эксплуатации
после загрузки драйвера. Обе оценки обсуждаются в технической документации.
Драйвер создаёт объект устройства \Device\BdApiUtil с
SecurityDescriptor = NULL, что позволяет любому процессу независимо от уровня
целостности открыть дескриптор и отправлять IOCTL. Статический анализ с помощью
Ghidra 11.0.3 показывает, что внутренний механизм более серьёзен, чем описано ранее:
драйвер использует PsLookupProcessByProcessId + ObOpenObjectByPointer(KernelMode)
вместо ZwOpenProcess, полностью обходя SeAccessCheck. Были полностью
охарактеризованы три IOCTL-примитива, два из которых не имеют предшествующей
публичной документации.
CVE-2024-51324/
├── README.md
├── LICENSE
│
├── drivers/
│ └── BdApiUtil64.sys # Driver (not distributed)
│
├── exploit/
│ ├── exploit-explanation.md
│ └── byovd_killer.py # Main exploit — 4 operational modes
│
└── 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 # Full Ghidra RE, three primitives, PPL testing
└── 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









Реверс-инжиниринг BdApiUtil64.sys с помощью Ghidra 11.0.3 выявил более широкую
поверхность атаки, чем описано в любом предшествующем публичном источнике:
0x800024B4)Цепочка диспетчеризации имеет три уровня:
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)
Восстановленный обработчик (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);
}
Почему режим KernelMode обходит SeAccessCheck:
ZwOpenProcess path:
NtOpenProcess → ObOpenObjectByName → SeAccessCheck
(checks DACL, caller token, integrity level)
can return STATUS_ACCESS_DENIED
ObOpenObjectByPointer(KernelMode) path:
SeAccessCheck ← NOT invoked
→ PROCESS_ALL_ACCESS handle granted unconditionally
ZwOpenProcess отсутствует в таблице импорта драйвера. Описание, основанное
на ZwOpenProcess и присутствующее в предшествующих источниках, технически
некорректно.
0x80002648)Обработчик FUN_00013bb0 принимает путь в формате Unicode, проверяет
InputBufferLength ≥ 0x208 и делегирует выполнение функции FUN_00013c10.
Вложенный обработчик открывает файл в режиме ядра (без SeAccessCheck по токену
вызывающего процесса) и отправляет IRP IRP_MJ_SET_INFORMATION с
FileInformationClass = 0xD (FileDispositionInformation), помечая файл для
удаления. Любой файл, доступный ядру, может быть удалён независимо от разрешений NTFS.
0x8000264C)Обработчик FUN_000139d0 обращается к FileObject->SectionObjectPointer (смещение
0x28 в FILE_OBJECT) и временно обнуляет два поля перед отправкой IRP на удаление:
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 проверяет эти указатели перед обработкой FileDispositionInformation.
Обнуляя их, обработчик делает файл «неотображённым», обходя защиту от удаления
используемых файлов. Этот примитив позволяет удалить бинарный файл работающего
EDR-агента с диска без предварительного завершения процесса.
Полная цепочка устранения EDR:
1. Terminate EDR process (IOCTL 0x800024B4)
2. Delete EDR binary on disk (IOCTL 0x8000264C) ← works even if memory-mapped
3. Prevent restart ← executable no longer exists on disk
PPL (Protected Process Light — облегчённый защищённый процесс) — единственное
средство защиты времени выполнения, которое противостоит завершению на основе
ObOpenObjectByPointer(KernelMode) через этот драйвер.
--cleanupСобытие с ID 7045 — единственный артефакт, который переживает полный цикл атаки
с очисткой. Оно содержит имя сервиса, ImagePath (полный путь к бинарному файлу),
тип сервиса и отметку времени создания.
Выполнение wevtutil cl System для удаления события с ID 7045 порождает
событие с ID 1102 в канале Security, фиксирующее, кто и когда очистил журнал.
Это делает подделку журналов обнаружимой, даже если исходный артефакт уничтожен.
| Действие атакующего | Результирующий артефакт | Канал | Сохранность |
|---|---|---|---|
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
Полное Sigma-правило и конфигурация Sysmon (событие с ID 6 по хэшу SHA-256 +
событие с ID 13 по ключу реестра) доступны в docs/detection/.
| Документ | Описание |
|---|---|
| Анализ первопричины |
Это исследование является частью моей магистерской диссертации по кибербезопасности (UCAM — Campus Internacional de Ciberseguridad), в рамках которой анализируются N-Day-уязвимости в различных средах.
Данная CVE представляет вектор драйвер ядра Windows / BYOVD в рамках диссертации и демонстрирует:
ZwOpenProcess
отсутствует; фактический механизм — ObOpenObjectByPointer(KernelMode))Ключевые слова: BYOVD · Kernel Driver · IOCTL · Ghidra · Process Termination ·
File Deletion · SectionObjectPointer · ObOpenObjectByPointer · Defense Evasion ·
CVE-2024-51324
Annais Molina (devianntsec) — магистрант по кибербезопасности
Лицензия MIT — см. LICENSE
Этот репозиторий предоставлен исключительно в образовательных целях и для
исследований в области безопасности в рамках академической магистерской
диссертации. Все тесты выполнялись на изолированных виртуальных машинах без доступа
к сети. Уязвимый драйвер (BdApiUtil64.sys) не распространяется в этом репозитории —
его необходимо получить самостоятельно. Используйте только на системах, которыми вы
владеете или на тестирование которых имеете явное письменное разрешение.
Несанкционированное использование против систем незаконно и может повлечь уголовное
преследование.
| Аспект | Описание |
|---|
| Техническая корректировка | ZwOpenProcess отсутствует в таблице импорта; фактический механизм — PsLookupProcessByProcessId + ObOpenObjectByPointer(KernelMode), что безусловно обходит SeAccessCheck |
| Три задокументированных примитива | Завершение процессов (0x800024B4), произвольное удаление файлов (0x80002648) и удаление используемых файлов в обход SectionObjectPointer (0x8000264C) — последние два не имеют предшествующей публичной документации |
| Четыре режима работы | LOADER, KILLER, SCANNER и CLEANUP — управление полным жизненным циклом |
| Проверка SHA-256 | Хэш драйвера проверяется перед любой попыткой загрузки |
| Эмпирическое тестирование PPL | 10 попыток на каждую категорию процессов, подтверждающих, что PPL — единственное средство защиты времени выполнения |
| Криминалистический анализ | Событие с ID 7045 сохраняется после очистки; событие с ID 1102 — самоизобличающий артефакт очистки журналов |
| Правила обнаружения | Sigma-правило и конфигурация Sysmon (событие с ID 6 по хэшу + событие с ID 13 по ключу реестра) |
| Пересмотр CVSS | Задокументированное расхождение между официальной оценкой NVD (3.8 Low) и оценкой серьёзности локальной эксплуатации, присвоенной исследователем (7.8 High) |
| Режим | Команда | Права | Описание |
|---|
| SCANNER | --scan | Любой пользователь | Информация о состоянии системы и драйвера |
| LOADER | --load | Администратор | Загрузка драйвера через создание сервиса ядра |
| KILLER | --kill / --pid | Любой пользователь | Завершение процессов через IOCTL |
| CLEANUP | --cleanup | Администратор | Остановка и удаление сервиса драйвера |
| IOCTL | Обработчик | Примитив | Предшествующая документация |
|---|
0x800024B4 | FUN_000152b0 | Завершение процессов | Частичная (механизм указан неверно) |
0x80002648 | FUN_00013bb0 | Произвольное удаление файлов | Отсутствует |
0x8000264C | FUN_00013850 | Удаление используемых файлов (обход SectionObjectPointer) | Отсутствует |
| Процесс | PPL активен | Можно завершить | Причина |
|---|
notepad.exe | Нет | ✅ 10/10 | Защита отсутствует |
regedit.exe | Нет | ✅ 10/10 | Защита отсутствует |
spoolsv.exe | Нет | ✅ 9/10 | SCM перезапускает в 1 случае |
MsMpEng.exe | Нет (в тестовой среде PPL отсутствует) | ✅ 8/10 | Небольшая вариативность по времени |
lsass.exe | Нет (RunAsPPL отсутствует) | ✅ 6/10 | Изменчивость состояния |
csrss.exe | Да (безусловный PPL) | ❌ 0/10 | STATUS_ACCESS_DENIED |
| Присутствует | Отсутствует |
|---|
PsLookupProcessByProcessId | ZwOpenProcess |
ObOpenObjectByPointer | SeAccessCheck |
ZwTerminateProcess | SePrivilegeCheck |
PsGetCurrentProcess | |
IoGetRequestorProcess |
| Сценарий | Цель | Воздействие |
|---|
| Завершение EDR/AV | MsMpEng.exe, SentinelAgent.exe | Обход защиты |
| Удаление бинарного файла EDR (используемого) | Исполняемый файл EDR на диске | Предотвращение перезапуска после завершения |
| Нарушение работы журналов аудита | Служба EventLog | Фальсификация криминалистических данных |
| Обход защищённых процессов | lsass.exe (без RunAsPPL) | Содействие получению учётных данных |
| Подготовка к шифрованию перед атакой программы-вымогателя | Агенты безопасности | Полная цепочка обхода защиты |
| Артефакт | Состояние после очистки |
|---|
| Сервис в SCM | Удалён |
Драйвер в driverquery | Удалён |
| Объект устройства | Недоступен |
| Ключ реестра | Удалён |
| Событие с ID 7045 | Сохраняется — не может быть удалено через sc delete |
| Событие с ID 7045 удалено |
| System |
| — |
wevtutil cl System | Сгенерировано событие с ID 1102 | Security | Постоянно |
Отсутствие контроля доступа в обработчике IRP_MJ_DEVICE_CONTROL |
| Анализ драйвера | Полный реверс-инжиниринг в Ghidra, три IOCTL-примитива, тестирование PPL, анализ таблицы импорта |
| Хронология CVE | Хронология обнаружения, раскрытия и исправления |