驱动漏洞是存在于操作系统内核模块或第三方硬件驱动中的安全缺陷。由于驱动程序大多在 内核态(Ring 0) 运行,具有高权限,一旦被攻击者利用,可能直接获得系统最高控制权,实现提权(Privilege Escalation)、任意代码执行或系统崩溃(DoS)。
驱动程序(Device Driver)是操作系统与硬件之间的桥梁,负责管理设备(如显卡、网卡、USB、键盘等)的通信。驱动程序可以是:
.sys 文件(内核模式驱动).ko驱动程序运行在内核态,意味着一旦有漏洞,其影响将远大于用户态程序。常见导致漏洞的原因包括:
| 漏洞原因 | 说明 |
|---|---|
| 输入未校验 | 未检查用户输入,直接传入内核函数,如 ioctl 参数。 |
| 任意地址读/写 | 用户可控制内核地址进行读写(任意内存读写)。 |
| 缓冲区溢出 | 内部函数处理用户输入时未做边界检查。 |
| 函数指针劫持 | 指针被覆盖,可跳转至攻击者指定地址执行。 |
| 未初始化内存泄露 | 内核分配的结构未清零就返回给用户,可能泄露敏感信息。 |
| 类型 | 描述 |
|---|---|
| 任意地址读写(Arbitrary R/W) | 允许用户读写任意内存地址,可用于提权或绕过保护。 |
| 内核缓冲区溢出 | 内核函数中处理用户输入时越界访问内存。 |
| Use-After-Free(UAF) | 已释放的内核对象被再次使用,可导致任意代码执行。 |
| 未初始化堆栈变量 | 返回数据中包含未清零内容,可能泄露内核信息。 |
利用任意写修改 Token
修改当前进程的权限令牌,提权为 System。
ROP 链构造
如果存在函数指针可控,可以构造 ROP 链执行内核代码。
DLL 注入辅助提权
驱动漏洞结合用户态注入技术进行持久化控制。
加载恶意驱动(BYOVD)
即“Bring Your Own Vulnerable Driver”,利用已知有漏洞的驱动进行提权。
漏洞描述:
WinRing0.sys 是一个被很多硬件监控工具(如 CPU-Z)使用的驱动,存在一个 IOCTL 接口,允许任意用户以任意地址读写内核内存,没有权限检查。
影响:
攻击者可在普通用户权限下,使用该驱动实现内核内存写入,直接修改自身 Token 或回调函数,完成本地提权。
利用步骤:
DeviceIoControl 发送构造好的 IOCTL 请求示意代码片段(伪代码):
// 修改当前进程 Token 的地址
DWORD64 tokenAddress = GetSystemTokenAddress(); // 查找 SYSTEM 进程的 token
DWORD64 currentProcessToken = GetCurrentProcessTokenAddress();
ArbitraryWrite(currentProcessToken, tokenAddress); // 用漏洞进行内存写
修复方式:
参考链接:https://nvd.nist.gov/vuln/detail/CVE-2019-16098
概念:
攻击者借助已有签名的、可正常加载但存在漏洞的驱动,绕过驱动签名保护,加载后利用其漏洞实现提权。
常用漏洞驱动列表:
可配合工具:
⚠️ 注意:驱动漏洞非常危险,常用于勒索病毒、Rootkit 等持久化攻击中。