Windows Wi-Fi 驱动程序 RCE 漏洞分析 (CVE-2024-30078)
漏洞概述
CVE-2024-30078 是 Windows Wi-Fi 驱动程序 (nwifi.sys) 中的一个远程代码执行 (RCE) 漏洞,微软在 2024 年 6 月的"补丁星期二"中修复了该漏洞。该漏洞被标记为"重要"级别,允许未经身份验证的攻击者通过向相邻系统发送恶意数据包实现远程代码执行。
受影响组件
- 驱动程序文件: nwifi.sys (Wi-Fi 驱动程序)
- 受影响版本: Windows 11 23H2 及之前版本
- 易受攻击版本: 10.0.22621.3527 (SHA1: 788E6FD6D60F3CD5A6FAC5C14883A4A3EF53A355)
- 修复版本: 10.0.22621.3733 (SHA1: BF5871100143804B77185314BD4DD433AFAC816B)
技术细节
漏洞位置
漏洞位于 Dot11Translate80211ToEthernetNdisPacket() 函数中,该函数负责将 IEEE 802.11 数据包转换为以太网数据包。
漏洞类型
越界写入 (Out-of-Bounds Write)
根本原因
在存在漏洞的版本中,当处理 VLAN (IEEE 802.1Q) 标头时,缺少对数据包缓冲区是否包含足够字节的检查。具体来说:
- 函数会检查 LLC 标头(8 字节)是否存在
- 如果 LLC->Type == 0x8100 (表示 VLAN),应该额外检查 4 字节的 IEEE 802.1Q 标头是否存在
- 在易受攻击版本中,缺少对这 4 字节的检查
- 当 LLC->Type == 0x8100 且 LLC 的 8 字节之后没有数据时,会发生越界读取
补丁分析
修复版本中添加了对 IEEE 802.1Q 标头的额外检查:
cmp [rsp+58h+var_20], 0Ch ; 检查是否有足够的字节(8+4)
jb short loc_1400D5F4 ; 如果不足则跳转
数据包转换逻辑
以太网报头可以放置在四种不同情况下:
-
情况1: LCC->type != 0x81 && LCC->type < 0x600
- v17 = LCC offset - 0xE
- 以太网报头在 LCC 标头之前构建
-
情况2: LCC->type != 0x81 && LCC->type >= 0x600
- v17 = LCC offset - 0xE + 8
- 以太网报头重写 LCC 标头
-
情况3: LCC->type == 0x81 && vlanid < 0x600
- v17 = LCC offset - 0xE + 4
- 以太网报头重写一半的 LCC 标头
-
情况4: LCC->type == 0x81 && vlanid >= 0x600
- v17 = LCC offset - 0xE + 4 + 8
- 以太网报头将被写入外部内存 (漏洞触发点)
攻击场景
攻击前提
- 攻击者必须与目标位于同一 Wi-Fi 网络
- 攻击者不需要在目标系统上进行身份验证
- 攻击者必须在目标系统附近才能发送和接收无线电传输
攻击方法
有两种主要攻击方式:
-
设置假AP:
- 配置与目标设备相同的假AP
- 目标设备自动连接到攻击者的AP
-
连接到同一AP:
- 需要知道/破解AP密钥
- 适用于公共网络
- 更难预测目标捕获哪些数据包
假AP实现
可以使用 Python 和 scapy 库构建假AP,需要实现以下基本功能:
- 定期发送信标数据包(每102.4毫秒)
- 响应探测请求(广播和直接)
- 处理开放系统身份验证请求
- 响应关联请求
示例攻击数据包生成代码:
def send_payload_v1(self, destination, with_vlan):
radiotap = RadioTap()
dot11 = Dot11(type=2, subtype=0, addr1=destination,
addr2=self.ap.mac, addr3=self.ap.mac,
SC=self.ap.next_sc(), FCfield='from-DS')
llc = LLC(dsap=0xaa, ssap=0xaa, ctrl=0x03) / SNAP(OUI=0x000000, code=0x8100)
packet = radiotap / dot11 / llc # 可添加额外字节
sendp(packet, iface=self.ap.interface, verbose=False)
漏洞利用分析
利用限制
-
内存布局要求:
- 需要数据包缓冲区后面有适当的字节才能通过 tpid 和 vlanid 检查
- 无法控制数据包内的这些字节
-
信息泄露缺失:
- 缺乏必要的信息泄露漏洞辅助
- 难以确定内存布局
-
被覆盖内存区域:
- 被覆盖的内存区域不包含有用数据(如指针)
- 内存区域标签未知,大小为 0x7800
- 在适配器连接时分配,断开时释放
实际影响
尽管被标记为 RCE 漏洞,但实际利用难度很高:
- 只能覆盖紧跟数据包后面的有限字节
- 覆盖区域不包含关键数据
- 需要精确的内存布局
- 缺乏控制执行流程的手段
防御建议
- 及时安装微软提供的安全更新
- 对于无法立即更新的系统,考虑以下缓解措施:
- 禁用不必要的 Wi-Fi 适配器
- 在可信网络环境中使用有线连接
- 启用网络隔离功能
参考资源
结论
CVE-2024-30078 虽然在理论上是远程代码执行漏洞,但由于多种限制因素,实际利用难度很高。微软正确地修复了该漏洞,但攻击者要成功利用此漏洞需要非常特定的条件和一定的运气成分。尽管如此,仍建议用户及时应用安全更新,因为未来可能会发现更有效的利用方法。