☰
BYOVD攻击链路解析:硬件ID欺骗与内核内存修改
2026/10/19 9:41:15 网站建设 项目流程

做安全和攻防对抗的人,应该都听过这个词:BYOVD,全称叫“Bring Your Own Vulnerable Driver”,直译是“带上你自己的脆弱驱动”。这名字起得很传神,因为它点破了内核防御体系的一个尴尬现实:系统只校验驱动“签名合法”,却不校验驱动“是否值得信任”。于是,一种极具讽刺意味的攻击手法就诞生了——攻击者不需要自己写能被系统信任的代码,只需要捡一把“官方发出去的好钥匙”,就能悄无声息地打开内核最核心的房间。

而“某CPU厂商漏洞驱动 + 硬件ID欺骗 + 内核内存修改”这条技术路线,正是围绕着BYOVD思路衍生出来的一种组合拳。硬件ID欺骗负责解决“目标机器没装对应设备、驱动程序不愿配合”的前置难题,内核内存修改则负责拿到RW(读写)能力之后真正干“脏活”。对于做防守、做红队评估、做驱动级反作弊绕过或者安全产品攻防验证的人来说,理解这条链路的内核逻辑,比背几个利用工具重要得多。这篇文章我会从原理、流程、实战坑点和防御策略四个角度来拆,内容偏蓝队视角,但红队也能顺着思路做排查。

1. 内核防线为什么会被一个“合法驱动”撕开

1.1 签名合法不等于行为安全

先聊一个底层认知:内核驱动加载的最强校验机制,是数字签名验证。系统在加载驱动时,会检查文件的签名链是否完整、签名证书是否受信任、时间戳是否有效。通过这一整套流程的驱动,就可以获得Ring 0级别的执行权限。

但这里有个关键问题:签名只证明“这个文件是谁签发的”,它不承担“这个驱动做不做坏事”的责任。就像一张门禁卡只证明“你是公司员工”,完全不保证你进来之后不会偷文件。绝大多数官方驱动在开发时都会有安全审查,但业务复杂度越高、代码量越大,出问题的概率就越大。尤其是显卡驱动、主板管理引擎驱动、BIOS更新工具这类常年需要直接访问物理内存和底层硬件的组件,漏洞几乎不可避免。

一旦某款官方驱动被发现有任意物理内存读写漏洞,它的签名就变成了“最佳帮凶”。攻击者不需要自己写驱动,不需要弄到合法的内核签名证书,只要把这款带漏洞的官方驱动安装到目标机器上,然后利用漏洞本身提供的读写能力去篡改内核数据,就能实现完整的提权与反杀。

这就是BYOVD的核心思路:借官方之手,把攻击武器送进内核。

1.2 BYOVD攻击链路全景

整个攻击过程可以分成五个阶段,每一个阶段都有对应的检测机会,但也都有对应的绕过思路。

第一阶段是“选人”:攻击者会针对某个公开发布过漏洞的官方驱动,收集它的下载链接、文件哈希、攻击接口信息。这一步并不难,很多安全研究员会公开分析报告和PoC,攻击者只需要在这些公开资料上做二次开发。

第二阶段是“伪装”:驱动本来是为特定硬件设备服务的,比如某款显卡、某款网卡。如果目标机器上根本没有这个硬件,系统自然不会让驱动匹配运行。这时候就需要硬件ID欺骗,通过修改系统设备标识或INF匹配规则,让驱动误以为自己管理的硬件存在。

第三阶段是“加载”:把驱动文件放到磁盘上,创建一个服务或设备对象,触发加载。如果目标系统允许加载未签名驱动,这一步很顺利;如果不允许,攻击者会利用系统已有的、具备驱动加载能力的合法接口(比如某些安全产品自己的驱动加载器、系统更新模块)来绕过签名强制。

第四阶段是“利用”:驱动成功加载之后,攻击者通过与驱动通信的IOCTL接口,触发漏洞函数,获得任意内核内存读写能力。至此,攻击者就已经拿到了Ring 0权限。

第五阶段是“篡改”:用拿到的读写能力,修改关键内核对象、禁用安全机制、注入恶意代码到系统进程。完成这一步后,攻击者通常会把漏洞驱动卸载,甚至清空日志。

1.3 硬件ID欺骗在整个链条中的位置

很多人第一次看到“硬件ID欺骗”这个概念时会困惑:驱动加载不是主要看签名吗?为什么还需要骗硬件ID?

原因在于,驱动加载机制分两层:签名校验决定“能不能安装”,硬件ID匹配决定“系统乐意不乐意用你”。一个驱动文件被解压到系统中之后,系统会通过PNP(即插即用)管理器把设备实例的硬件ID与驱动INF文件中列出的支持ID做匹配。只有匹配成功,系统才会把驱动绑给那个设备,并允许它启动。

如果攻击者锁定的漏洞驱动是“某款已停止生产的老显卡驱动”,而目标机器上新安装的GPU型号完全不在INF的支持列表里,PNP管理器就不会自动加载这款驱动。这时攻击者可以通过修改设备实例的硬编码ID、伪造一个虚拟设备节点、或者在INF匹配库中混入目标设备ID等方式,骗系统说“这个驱动确实支持当前硬件”。

一个比较形象的说法是:签名校验负责检查你是不是“持证人员”,硬件ID匹配负责检查你的证件是不是“这个单位的”。BYOVD攻击者伪造硬件ID,相当于拿了别人单位的证件混进去——证件本身是真的,但单位是假的。

2. 硬件ID欺骗的具体手法与匹配机制

2.1 系统如何决定加载哪个驱动

要理解怎么欺骗,先得知道系统是怎么“认人”的。设备驱动的匹配逻辑一般是这样:

系统为每个设备实例维护一组硬件ID,格式类似“PCI\VEN_xxxx&DEV_yyyy”,其中VEN表示厂商编号,DEV表示设备编号。设备接入系统时,PNP管理器从总线驱动获取设备返回的ID字符串,然后在系统驱动仓库中搜索INF文件里的硬件ID列表,找到匹配项后,再比较该INF文件与其他候选INF文件的排位优先级。

这里有几个值得注意的细节。第一,硬件ID的匹配不仅限于完整的“VEN+DEV”组合,很多INF文件还会使用通配符来匹配多家厂商、多个设备型号。第二,系统会为每个匹配的INF文件计算一个“排名分”,分数越高的INF越优先被选中。第三,INF文件中还可以声明“兼容ID”,允许设备以宽松条件被识别过来。

攻击者通常利用的就是这个“兼容ID”和“通配符”机制。他们可以把目标设备的硬件ID伪装成某款已知存在的旧设备,或者把漏洞驱动的INF文件复制一份,加上目标设备的兼容ID条目。

2.2 三种现实中常见的硬件ID欺骗路径

从以往安全研究员公布的案例来看,硬件ID欺骗的实现路径主要有三类,防御者有必要都了解一遍。

第一类:伪造设备实例ID。攻击者利用设备管理接口,创建一个虚拟的设备节点,并把该节点的硬件ID设置为漏洞驱动支持的那个ID。这类手法在测试机上很容易复现:不需要真实硬件,只需要用系统原生的设备安装接口注册一个“假设备”,然后让PNP管理器自动匹配到目标漏洞驱动。

第二类:修改INF文件的兼容ID字段。把官方驱动解包后,直接改动INF文件文本,在“DeviceList”段落中加上攻击者想要欺骗的设备ID。改动后需要重新生成驱动包的哈希,或者使用未签名模式加载。这种方法更加隐蔽,因为设备本身是真实的,驱动队列里也多了一个“可用驱程”,普通检查者很难一眼看出异常。

第三类:利用开发者模式或测试签名模式。严格来说,这不算是“硬件ID欺骗”,但它经常与ID欺骗配合使用。攻击者开启某系统的开发者模式之后,可以安装未签名驱动文件;再配合INF修改,就能把官方驱动的漏洞代码“移植”到一个伪造的、支持目标硬件的驱动壳中。

2.3 验证欺骗是否成功的几个检查点

在分析相关样本时,我一般会关注几个关键点,可以帮你们快速判断一次硬件ID欺骗尝试是否成功。

先看系统事件日志。驱动加载失败常会有对应的错误记录,包括错误代码、设备状态。如果某驱动一直尝试加载但因为硬件ID不匹配而失败,事件日志里会有线索。再看驱动服务对应的镜像路径。很多BYOVD工具会把漏洞驱动放到临时目录,文件名伪装成系统组件。最后看设备管理器里是否存在异常的“未知设备”或“虚构设备”。某些攻击脚本在完成欺骗后会留下一个幽灵设备节点,这是很好的取证点。

我在分析一个模拟样本时,发现攻击者把漏洞驱动的INF文件复制到了C盘临时目录,并在其中追加了一段“TargetDeviceId”的属性,直接把目标机器的网卡VID/VID组合写进去。系统重启后,网卡设备被错误地绑定到了这个漏洞驱动上,驱动启动后主动映射了物理内存范围,给上层工具输送了读写原语。整个过程在设备管理器里看起来只是“网卡使用了一款非官方驱动”,没有任何服务告警。

提示:硬件ID欺骗并不等于加载任意驱动。如果驱动文件本身的签名不可信,或系统开启了严格的内存完整性策略,即使硬件ID匹配成功,驱动依然无法加载。ID欺骗只是整个链路中的一环。

3. 内核内存修改原语从哪来,能改什么

3.1 “漏洞驱动的任意读写”是三把钥匙的汇合

真正承载BYOVD杀伤力的,是漏洞驱动提供的任意内存读写原语,业内一般称为Arbitrary Read/Write。它通常来自于驱动暴露的某个IOCTL接口处理函数。

以某CPU厂商显卡驱动为例,旧版本中存在一个与显存映射相关的功能函数,用户态程序可以向驱动发送一个包含物理地址、映射大小的请求,驱动在没有充分校验的情况下直接对该物理地址执行了映射和读写操作。这意味着,任何进程只要拿到了驱动的设备句柄,就能通过这个IOCTL读取或修改整个物理内存空间。

很多人在理解这个概念时会有一个疑问:Ring 3程序不是本来就能通过API读取别的进程内存吗?为什么还需要“任意物理内存读写”?

原因是:普通的用户态API访问其他进程内存需要满足权限要求,而且无法触碰内核页表所在的内存区域,更不可能绕过杀毒软件的钩子。而物理内存读写则完全绕开了这些限制——它直接访问物理地址层,相当于在内存之下的“地基”层面自由走动,不需要经过任何高层权限检查。

这里用一个比喻:普通用户态访问内存像“在酒店房间之间走动,需要门卡、楼层限制”;物理内存读写则像“拿着建筑图纸和结构钥匙,把承重墙、配电房、通道全部打开”。安全产品做再多用户态监控,也管不到这个层面。

3.2 拿到内存读写之后可以做什么

内核内存修改的攻击价值,可以从四个维度来理解。

第一,权限令牌修改。这是最经典的用途。攻击者定位系统进程的“Token”对象,把其中表示权限级别的字段整体替换为更高权限的令牌,或者直接在用户态进程的Token中增加特权信息,从而绕过管理员权限限制,获得系统级权限。由于不需要触发任何驱动加载、不需要调用特权API,这个操作在检测方看来完全静默。

第二,进程保护与隐藏。很多安全产品和游戏反作弊系统会通过内核回调机制监控进程创建、线程创建、模块加载。攻击者可以用物理内存读写把当前目标的进程对象中的“保护标志位”改成受保护状态,让安全产品的回调无法终止或检查该进程。

第三,修补内核回调与过滤驱动。在拿到任意写后,攻击者甚至可以直接修改杀毒驱动自身在内核中注册的回调函数指针,让杀毒驱动在每次进程创建时直接返回成功,或者在关键过滤函数开头写入跳转指令。这种操作比前面几种更显“暴力”,但因为发生在内核态,检测成本非常高。

第四,修改分页结构实现代码执行。虽然很多新系统默认开启内核内存隔离(HVCI),不允许修改内核的代码段和执行权限,但在老版本系统、关闭内存完整性的环境下,攻击者可以将某个内核模块的代码页属性改为可写,写入恶意Shellcode后再恢复执行权限,实现持久化。配合上面提到的物理内存读写,整个过程可以做到全程不落地文件、不创建服务,完全在内存中进行。

3.3 与传统内核漏洞利用相比,稳定性和容量都更优

传统内核漏洞利用,比如栈溢出、类型混淆、UAF(释放后使用),一般需要精确定位对象偏移、绕过现代堆防护机制,还要适配不同系统版本。这导致传统利用链源码可靠性低、环境适配成本高。

BYOVD路线则完全不同。漏洞驱动是一个固定的、已经编译好的官方文件,它的攻击接口和对象布局是公开的。整个利用过程相当于“用官方驱动提供的正确API去操作内核”,不需要考虑堆布局、不需要绕过DEP/ASLR,只要硬件ID欺骗成功、驱动加载成功,后续原语就是确定的。

这也是为什么攻防社区里很多人形容BYOVD为“降维打击”——它不是在与系统机制正面较量,而是利用系统机制自己做内鬼。

4. 防守方如何在疑似BYOVD攻击中“接招”

4.1 加载阶段的拦截点:名单、签名策略与内存完整性

针对BYOVD攻击,防守可以按“加载前、加载中、加载后”三个时间窗口来做布防。

先看加载前。主流系统已经提供了两份重要“黑名单”机制:一是易受攻击驱动拦截名单,二是内核内存完整性策略(HVCI)。前者维护了已知漏洞驱动的哈希、文件名、版本信息;后者限制内核代码区域只能在签名后写入,从机制上阻断了物理内存读写对内核代码区域的篡改。

在实际测评中,我发现一个常见误区:很多团队以为只要把“HVCI”策略开启,BYOVD攻击就完全失效了。但HVCI只能阻断对内核代码段的篡改,并不能阻止攻击者通过RW原语直接修改其他可利用的内核数据对象,比如进程Token、回调指针、引用计数。如果攻击者不碰代码段,只操作数据段,HVCI的保护效果就会打折扣。因此,HVCI之外还必须叠加进程回调和ETW事件监控。

4.2 运行时检测:关注驱动加载与异常IOCTL流量

驱动加载本身伴随着明确的事件:服务创建、映像加载、设备对象创建、IOCTL访问。这些事件都可以被内核回调与系统自带的可观察性平台捕捉到。

建议检测点可以至少覆盖以下四类信息:

  • 驱动文件哈希与已知漏洞驱动库进行比对,尤其是文件名伪装成系统驱动的可疑文件。
  • 驱动加载时的文件路径,关注是否在临时目录、用户目录、下载目录出现驱动加载行为。
  • 设备对象创建之后,是否伴随高频的IOCTL请求,以及这些请求的缓冲区大小、物理地址参数是否异常。
  • 驱动服务是否由某个低权限进程触发创建,这往往是攻击脚本自动化的一个破绽。

在实际复现中,我搭建过一个测试环境:用一个模拟的“驱动加载小工具”加载某款老显卡驱动,然后让用户态程序请求物理内存映射。防守侧用自定义内核回调收集事件,可以看到“某驱动加载之后,紧跟着出现大量设备输入输出控制请求,且缓冲区中携带物理地址高位参数”。这种IOCTL序列模式是识别BYOVD利用阶段的重要特征。

4.3 加固基线:从默认允许到默认拒绝的演进思路

从更宏观的角度看,单点检测是不够的,必须整体考虑几层策略的协同。

加固层级针对性缓解效果
签名强制(DSE强制)未签名驱动的加载阻断最基础的驱动注入
易受攻击驱动名单已知漏洞驱动的加载阻断已知武器库的二次利用
内存完整性(HVCI)内核代码段篡改限制RW原语对执行的滥用
安全管理中心策略非管理员安装驱动减少低权限攻击面
驱动加载事件监控BYOVD全流程行为识别提供事后可追溯性

对于企业安全团队,建议优先启用前三项,再配合统一日志采集做检测覆盖。对于个人用户,如果能接受性能损耗(约5%~10%),开启HVCI是最简单有效的单点缓解。

一个值得提的操作细节:很多设备驱动安装过程中会修改自身的INF文件或释放临时文件,安全团队在部署监控时,要特别注意区分“官方驱动更新导致的异常行为”和“恶意驱动加载导致的行为”。简单来说,需要针对每台机器建立驱动加载基线清单,任何偏离基线的驱动加载行为都触发告警。

5. 一些建议与实战心得

当然,这篇文章归根结底是技术分析,我不建议任何人拿去做攻击或恶意用途。但如果你身处安全研究、蓝队防御或安全产品研发的岗位上,以下几点是我长期测试中比较深的体会,放在这里当个参考。

第一,驱动样本的“标记白名单”非常重要。很多BYOVD工具会复用同一批厂商驱动文件,如果安全团队能提前把这批文件哈希收集完整,并通过阻断策略拦在用户态工具枚举之前,能让攻击者根本没有机会把武器送进内核。

第二,调试BYOVD类样本时,尽量把实验放在隔离的VM环境中。物理内存读写一旦出现地址错误,很容易直接导致系统蓝屏。多次实验的话,建议使用快照回滚而不是反复重置环境,能省下大量时间。

第三,对普通用户而言,应对BYOVD攻击并不需要自己安装第三方内核工具。保持系统自动更新开启,确保系统自带的内存完整性和驱动名单机制处于开启状态,就能挡掉绝大多数已知攻击。我看到过不少用户手动关闭更新来“提升性能”,结果反而把最重要的缓解武器都卸掉了。

第四,如果你在做安全产品研发,不要迷信单一检测技术。BYOVD链路跨越设备节点生命周期、服务创建、驱动加载、内核内存访问多个阶段,单一维度的检测必然存在绕过窗口。我在开发原型检测系统时,最早只做“驱动哈希匹配”,后来发现攻击者只要选一个不在名单里的旧版本厂商驱动,就能轻松绕过。加入“硬件ID异常+驱动加载事件源头进程”两个维度之后,检出率才明显提升到可用的水平。

最后再分享一个小技巧:当你怀疑系统被BYOVD攻击时,最简单快捷的排查方式是检查所有正在运行的设备驱动签名时间。如果一个本应随系统设备启动、但在你的机器上根本不存在对应硬件的驱动正在运行,这本身就足够引起警惕。结合硬件ID欺骗原理,如果事件日志中出现“设备驱动成功加载但设备未被发现”的异常,基本可以圈定嫌疑范围。

BYOVD和硬件ID欺骗这套组合看似高级,底层逻辑却并不复杂。它本质上是利用系统对“官方签名文件”的天然信任,把内核权限的钥匙交到了攻击者手上。理解了这个信任边界,攻防两边的发力点其实都会变得更清晰。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询