一、引言
近年来,随着攻防对抗的升级,越来越多的APT组织、勒索软件团伙采用BYOVD攻击来绕过EDR检测,达成致盲EDR、投放恶意软件、进行勒索等目的。本文将深入剖析BYOVD的攻击链路及其技术底层逻辑,并介绍防御指南。
二、BYOVD介绍
BYOVD(Bring Your Own Vulnerable Driver,自带漏洞驱动)是一种利用带有合法数字签名但存在漏洞的驱动,来获取内核模式(Ring-0)的执行权限的后渗透攻击策略。
2.1 诞生背景

对于攻击者来说,即便获取了机器的SYSTEM管理员权限,其依然身处用户态(Ring 3)中,一切行为与资源访问均受到操作系统的严格审计与隔离。为了实现防御规避与隐蔽的持久化,攻击者需要获取内核态(Ring 0)权限。
在早期的Windows系统中,攻击者拥有管理员权限即可轻易加载自定义恶意驱动,获得Ring 0权限,任意操控内核数据、隐藏进程、植入rootkit、终止EDR进程等。
为了应对该威胁,自 Windows Vista x64 起,微软引入了DSE(Driver Signature Enforcement,驱动签名强制执行)技术,要求所有内核驱动必须具备可信证书颁发机构(CA)的签名,此举消灭了大部分自定义的恶意驱动。
自此,BYOVD技术应运而生,攻击者通过搜集带有合法数字签名但存在漏洞(例如:任意内存读写、IOCTL处理函数校验不足、特权API暴露等)的驱动,来获取内核执行权限。加载的驱动来源合法,带有官方数字签名,能够直接规避EDR检测;同时,其存在已知漏洞,攻击者可在用户态发送指令与漏洞驱动交互,以内核级权限执行各类恶意操作。
2.2 BYOVD经典攻击过程
本节以一个典型的驱动漏洞为例,该漏洞源于IOCTL处理函数缺乏校验,可导致任意进程终止,来描绘BYOVD的典型攻击流程。

1)获取管理员权限
加载内核驱动需要目标机器管理员权限,攻击者往往通过网络钓鱼、Web漏洞、本地提权等方式获取管理员权限。
2)投放漏洞驱动
攻击者将带有合法签名但存在漏洞的.sys驱动文件投放到目标机器中,由于该驱动文件本身来源可信且带有合法数字签名,因此不会被杀软或EDR拦截。
3)加载漏洞驱动
攻击者使用Windows SCM(Service Control Manager,服务控制管理器)或调用NtLoadDriverAPI将漏洞驱动注册为内核服务并加载。Windows会验证其数字签名是否有效,并追溯到微软信任的根证书。
然而,该签名验证流程存在缺陷,导致以下签名均被视为有效签名:
- 2015.07.29之前的旧证书:自Windows 10起,微软要求所有新的内核驱动都必须通过HDC(Hardware Dev Center,硬件开发中心)进行签名,而在此之前,开发者可以绕过微软使用第三方交叉证书自行签名。为了兼容,Windows将允许这些交叉签名的驱动加载,只要该交叉签名可追溯到可信CA。
- 已吊销的证书:由于驱动程序在系统启动过程早期加载,此时网络不可用,因此系统不会执行CRL(Certificate Revocation Lists,证书吊销列表)检查,只要签名时间戳(而非当前时间戳)位于证书有效期即可。
4)提权
漏洞驱动加载到内核后,该驱动即拥有内核(Ring 0)级权限。
5)下发指令
攻击者通过驱动的漏洞点,下发对应的IOCTL指令,指示驱动终止EDR进程。由于IOCTL处理函数缺乏校验,且此时EDR进程与漏洞驱动均位于Ring 0内核态,因此,EDR进程被成功杀死。
6)执行恶意操作
此时,免除于EDR的监控与阻断,攻击者可以为所欲为,执行任意操作,包括:投放病毒/勒索软件、禁用ETW监控、在内核中运行rootkit等。
三、BYOVD技术分析
本节以开源项目BlackSnufkin/BYOVD中的漏洞驱动STProcessMonitor作为案例,复现BYOVD攻击,并分析其技术原理。
注1:BlackSnufkin/BYOVD 是一个用于演示BYOVD攻击的开源项目,提供了一组 PoC,展示了如何利用存在漏洞的驱动程序来禁用杀毒/EDR 程序。
注2:Safetica STProcessMonitor 驱动程序存在访问控制漏洞CVE-2025-70795,其中进程终止功能在未进行适当目标验证的情况下暴露给用户模式。这使得攻击者无需进行身份验证或授权检查即可在内核模式下终止任意进程。该漏洞已被银狐恶意组织利用。
3.1 环境搭建
该项目依赖Microsoft Visual Studio Build Tools中的Windows SDK构建,需要安装构建环境(务必勾选图中的“Windows 10/11 SDK ”和 “MSVC v143 - VS 2022 C++ x64/x86 生成工具”):

同时,需要安装Cargo,该软件自行下载安装即可,在此不赘述。
3.2 载荷准备&分析
使用命令编译载荷:
cargo build --release -p STProcessMonitor-Killer

编译后的载荷STProcessMonitor-Killer.exe在target/release目录下,将其拷贝到目标机器,并将.sys文件一并拷贝到同目录(这里使用STProcessMonitor_v114.sys驱动)。
右键查看STProcessMonitor_v114.sys文件属性,发现其携带Microsoft Windows Third Party Component CA 2012颁发的有效数字签名证书,尽管有效期为2025.02.12 - 2026.02.19,但证书签发时间戳为2025年5月9日 11:43:46,在有效期范围内,因此,仍然会被微软认定为有效签名。

3.3 载荷执行
目标机器上安装并运行了火绒安全软件,以此作为操作对象。
首先通过管理员权限启动cmd窗口,尝试直接杀进程,观察是否可行,可以看到结果显示失败:

执行命令尝试杀掉火绒的HipsDaemon.exe进程:
STProcessMonitor-Killer.exe --version 114 -n HipsDaemon.exe
可以看到,执行成功,该进程被成功杀掉:

点开火绒界面,可以看到其显示安全服务异常:

如法炮制,使用命令杀掉火绒的HipsTray.exe进程,也成功了,此时火绒已经成功退出:
STProcessMonitor-Killer.exe --version 114 -n HipsTray.exe

3.4 驱动文件逆向
通过Ghidra对STProcessMonitor_v114.sys文件进行逆向,从DriverEntry入口顺着设备注册逻辑入手,可以看到在处理IOCTL指令的fun_140001b70函数中,存在以下漏洞片段:

当IOCTL设备控制码为0xB822200C时,程序仅校验了缓冲区大小是否大于7字节(近乎于无门槛),即进入了进程终止逻辑。从用户缓冲区获取进程ID,启动ZwOpenProcess以最大权限访问该进程,然后调用ZwTerminateProcess终止目标进程。由于该驱动加载后位于Ring 0,为系统最大权限,使得其可以达成杀死任意进程的目的。
3.5 BlackSnufkin/BYOVD项目分析
接着再来看看BlackSnufkin/BYOVD项目做了什么,关键函数分析如下:
其byovd-lib/src/lib.rs文件中,定义了DriverManager,其new操作中使用SCM创建了一个服务,并注册为内核驱动,以此将漏洞驱动加载到内核。该方法对应BYOVD利用链中的驱动加载环节(如前文2.2.3一节所述)。

该操作类似命令行:
sc.exe create <driver_name> type=kernel binPath=<driver_path>
sc.exe start <driver_name>
并定义了send_ioctl函数,瞄准对应的IOCTL控制码,发送指令(该方法对应BYOVD利用链中的发送IOCTL指令环节,如前文2.2.5一节所述):

进入到STProcessMonitor-Killer/src/main.rs文件,可以看到这里定义的存在漏洞的IOCTL控制码和前文3.4一节逆向分析的一致:

四、BYOVD检测与防御
4.1 LoLDrivers
LoLDrivers(Living Off The Land Drivers)是一个安全社区维护的开源项目,持续收集并记录已被证实存在漏洞、被APT组织或勒索软件滥用的合法签名驱动程序。

LoLDrivers数据库提供了一系列驱动文件哈希(MD5/SHA1/SHA256),可借助以下工具对系统驱动进行扫描:
- Powershell脚本:下载LoLDrivers数据文件,借助Powershell脚本进行驱动文件哈希比对,实现扫描
- LOLDrivers-client客户端程序:同样根据LoLDrivers数据文件,可实现快速扫描
- Yara扫描:使用Yara扫描系统驱动程序目录,匹配的文件即为漏洞驱动
4.2 Windows事件日志
在BYOVD攻击中,驱动释放、服务注册及模块加载都会在Windows事件日志中存在相应记录,通过配置并收集特定的事件日志,可实现检测:
- Sysmon Event ID 11:文件创建事件日志,由Sysmon提供,监控
.sys驱动文件是否由异常进程(cmd.exe、powershell.exe、wcript.exe、Web进程等)释放到磁盘。 - System Event ID 7045:服务创建事件日志,当驱动通过SCM注册服务时会触发该日志记录。重点关注
ImagePath字段指向非系统驱动C:\Windows\System32\drivers\目录,且服务类型为Kernel Mode Driver的异常日志。 - Sysmon Event ID 6:驱动加载日志,由Sysmon提供,记录了驱动加载的文件路径、哈希和签名等重要信息,可用于识别漏洞驱动加载。
- CodeIntegrity Event ID 3004 / 3033:Windows代码完整性日志。驱动因签名无效或命中内核黑名单被系统拦截或审计时会触发该日志,可据此检测。
4.3 基于行为特征检测
基于文件哈希识别的漏洞驱动静态检测存在滞后性,攻击者可能使用尚未被记录的0-day/1-day漏洞驱动,此时可使用基于行为特征的检测方式:
- 异常的IOCTL通信监控:利用 EDR 的底层探针或ETW,监控用户态进程对驱动设备的
CreateFile(打开设备句柄)和DeviceIoControl(发送控制码)调用。若一个普通的非系统进程频繁向冷门的硬件驱动(如网卡诊断驱动)发送IOCTL请求,视为可疑行为。 - 行为关联分析:监控可疑的进程调用链,例如:普通Web进程调用
sc.exe create或sc.exe start命令拉起一个内核服务、用户态进程发送IOCTL指令后安全软件相关进程终止。 - 敏感API调用与权限提升行为:监控
NtLoadDriver或ZwLoadDriver等底层 API 的直接调用。重点关注驱动加载后,是否出现了安全软件PPL标志位降级或token被篡改等提权行为。
4.4 启用HVCI与WDAC
WDAC(Windows Defender Application Control)是微软提供的原生应用程序控制框架,可通过设置拦截策略,决定哪些驱动能够被加载到内核中。
- 设置微软漏洞驱动拦截列表(Vulnerable Driver Blocklist):通过该名单,开启策略后,系统会在加载驱动时对比文件哈希及特征,阻止拦截列表中的漏洞驱动加载。配置方法如下:
- 下载 应用控制策略刷新工具
- 下载并提取 易受攻击的驱动程序阻止列表二进制文件
- 选择“仅审核版本”(会产生事件日志,可用于检测)或“强制版本”(会直接阻断驱动加载),并将文件重命名为
SiPolicy.p7b - 将
SiPolicy.p7b复制到%windir%\system32\CodeIntegrity - 运行在上述步骤 1 中下载的应用控制策略刷新工具,以激活和刷新计算机上的所有应用控制策略
- 启用HVCI(Hypervisor-protected Code Integrity,虚拟机监控程序保护的代码完整性):其利用Windows虚拟化强制实施内核代码完整性。即使漏洞驱动被加载进内核,也能在硬件层面阻止内核内存页被标记为“可写可执行”,导致恶意rootkit或shellcode注入内核失败,从而降低BYOVD攻击的危害。配置方法如下:
- 同时按下
win+R,打开运行对话框,输入gpedit.msc回车,打开组策略编辑器 - 进入菜单:
计算机配置->管理模板->系统->Device Guard->打开基于虚拟化的安全,在弹出的对话框中选择已启用,在基于虚拟化的代码完整性保护中选择需要UEFI锁启用,点击确定后重启电脑即可启用HVCI。
- 同时按下

五、WDAC拦截策略实践
针对上述4.4一节中的WDAC拦截策略设置,本节以漏洞驱动STProcessMonitor_v114.sys为例,说明如何添加WDAC规则。
5.1 环境准备
- 检查当前操作系统版本,是否为专业版pro(家庭版亲测不支持;若为非专业版Pro,可执行步骤2检查)
- 检查当前系统是否支持代码完整性策略模块,打开Powershell,输入
New-CIPolicyRule -Level Publisher -DriverFilePath "D:\test\byovd\STProcessMonitor_v114.sys"命令,查看其是否报该函数/模块找不到、不识别之类的错误,若无此类报错,则表明系统支持后续操作 - 下载 应用控制策略刷新工具
- 下载并提取 易受攻击的驱动程序阻止列表二进制文件
- 下载微软官方的可视化编辑工具WDAC Wizard
5.2 策略生成
5.2.1 基于黑名单的策略
可针对漏洞驱动/恶意驱动,在微软官方提供的阻止列表基础上添加针对性的黑名单策略。
- 双击下载的Wizard Installer安装程序,安装后启动,选择
Policy Editor:

- 选取
环境准备一节步骤2中下载的阻止列表文件中的SiPolicy_Audit.xml,保存的文件名填写为SiPolicy.xml,然后点击Next:

- 这一步为策略配置,注意最下方的
Audit Mode选项,若该选项开启,则规则生效后仅告警;若关闭,则还会在告警的基础上,直接阻断驱动加载,这里选择关闭,以更直观展示策略效果:

-
此时进入规则编辑界面,该列表内置了许多微软官方的规则,可在此基础上添加针对漏洞驱动的规则。点击右上角的
Add Custom Rule,在弹出的对话框中,针对Rule Action选择Deny(用于阻止),Rule Type支持多种模式,笔者探索了以下3种:-
Provider:根据驱动的发行方信息进行匹配(每个条件之间以and连接),包括签署的CA、发行商、产品名、原始文件名、最小版本号等信息。
-
File Hash:根据驱动文件的Hash(SHA1或SHA256)进行匹配,可直接选取文件识别,也可手动录入hash值
-
File Attributes:根据驱动文件自身信息匹配(每个条件之间以and连接),包括:原始文件名、文件描述、产品名称、内部名称(驱动加载后的设备名称)等信息(此类型的规则添加,不受系统版本限制,Windows家庭版也可以操作成功)。
-
规则添加完毕后,点击
Next,等待片刻,即可看到策略生成成功界面:

- 此时查看对应路径下的文件,应该能看到
SiPolicy.xml和SiPolicy.p7b这两个文件生成,若仅有SiPolicy.xml文件,则表明策略文件生成失败(该工具不会有任何报错,需要自行排查) - 此时查看
SiPolicy.xml文件内容,应能看到刚刚添加的规则(这里以File Hash类型的规则为例):

5.2.2 基于白名单的策略
微软还支持基于白名单的策略,但需注意:若白名单设置不合理,可造成系统蓝屏!建议谨慎操作。
- 前期步骤参见
基于黑名单的策略一节,直到规则设定这一步骤 - 在规则设定界面的列表中,找到以下两条规则:
Action为Allow、Level为FileAttributes、Name为空、Associated Files为*FileName: *、Rule ID分别为ID_ALLOW_ALL_1和ID_ALLOW_ALL_2,选择右下角的Remove Rule删掉这两条规则:

- 在此基础上,添加白名单规则,
Rule Action选择Allow,选取各个合法且安全的驱动(务必包含系统运行必备驱动)以允许其加载 - 后续步骤参照黑名单策略
注意:若白名单设置不合理,遗漏了部分系统驱动,可能造成系统下一次重启后蓝屏,无法正常开机!此时,开机会报错(例如:网络连接失败等),可进入系统安全模式,将%windir%\system32\CodeIntegrity\SiPolicy.p7b策略文件删掉,再次重启,即可正常开机
5.3 激活规则
- 将
SiPolicy.p7b复制到%windir%\system32\CodeIntegrity(这一步需要管理员权限) - 运行
环境准备一节步骤 3 中下载的应用控制策略刷新工具,以激活和刷新计算机上的所有应用控制策略
5.4 测试规则
进行规则测试,验证策略是否生效。
- 按下
win+R快捷键,输入eventvwr.msc打开事件管理器,在应用程序和服务日志-Microsoft-Windows-CodeIntegrity中,查看是否存在事件ID为3099的日志(其中的PolicyGUID应和上述查看的SiPolicy.xml文件内容中PolicyTypeID一致,PolicyHash应和策略文件SiPolicy.p7b的SHA256 hash值一致),若存在,则表明策略加载成功:

- 使用管理员权限打开cmd命令窗口,执行以下命令,验证策略是否成功阻断驱动加载:
sc.exe create vuln_driver type=kernel binPath="D:\test\byovd\STProcessMonitor_v114.sys"
sc.exe start vuln_driver
应看到如图所示的拦截结果:

注: 若在策略生效前成功加载过该驱动,可能会存在缓存(偶现),导致拦截失败。此时可尝试复制/删除该驱动(达到切换/清除磁盘中的文件句柄的目的),使用复制/重新拷贝的驱动再次尝试,即可成功
- 查看事件管理器,应能看到事件ID为3077(策略生成时选取了
Deny模式)或3076(策略生成时选取了Audit模式)的日志:


其中,可通过PolicyHash和PolicyGUID字段确认生效的策略为刚刚添加的策略。
- 此时,再次执行byovd攻击,可以看到攻击失败:




