CVE-2019-0697:通过DHCP漏洞发现其余两个关键漏洞
字数 1337 2025-08-27 12:33:22
CVE-2019-0697 DHCP漏洞分析与利用教学文档
漏洞概述
CVE-2019-0697是Windows DHCP客户端服务(dhcpcore.dll)中的一个堆栈缓冲区溢出漏洞,影响Windows DHCP客户端处理DHCP服务器响应时的特定功能。该漏洞由两个关键函数中的缺陷导致:
UpdateDomainSearchOption- 负责处理DHCP消息传递DecodeDomainSearchListData- 由第一个函数连续调用
漏洞背景
在分析DHCP相关代码时,研究人员注意到DhcpExtractFullOptions函数中存在两个堆栈分配的数组,每个数组包含256个元素。关键问题在于:
- 没有对数组迭代器值的边界检查
- 攻击者可以发送特制DHCP响应包导致缓冲区溢出
技术细节
漏洞函数分析
DhcpExtractFullOptions函数:
- 负责解析从DHCP服务器接收数据包中的所有选项
- 初始化时会将两个256元素的数组及其迭代器清零
- 处理选项时会填充两个数组:
all_tags数组:存储所有接收到的消息选项标记unknown_tags数组:仅包含解析器未知的选项标记
漏洞点:
- 数组元素类型为
int(4字节),但选项标记大小为1字节 - 没有检查数组索引是否超过256的限制
- 当接收超过256个选项时,会导致堆栈缓冲区溢出
溢出机制
- 每个选项标识符写入数组时占用4字节空间
- 攻击者控制每个第4个字节(选项标识符值),其余字节在覆盖时归零
- 溢出可以覆盖:
- 堆栈安全cookie
- 函数返回地址
- 局部变量
漏洞利用
攻击准备
- 模拟DHCP服务器
- 构造特制DHCP响应包:
- 包含至少0x1a0(416)个选项
- 每个选项标识符设为0xaa
- 每个选项大小为2字节(包含头部)
- 总数据包大小约1100-1200字节(在以太网MTU限制内)
攻击效果
- 选项标识符覆盖:
- 堆栈cookie
- 函数返回地址
- 在目标系统的svchost.exe进程中触发异常
利用限制
现代保护机制(如ASLR、DEP等)增加了利用难度:
- 防止返回地址和异常处理程序被覆盖
- 阻止在未分配内存中执行代码
- 难以预测地址
但攻击者仍可能利用溢出覆盖局部变量实现攻击。
防御措施
- 应用微软2019年3月发布的补丁
- 网络层面监控异常DHCP流量(大量选项的响应包)
- 启用堆栈保护机制
相关漏洞
- CVE-2019-0547:由微软员工Mitch Adair发现的另一个DHCP漏洞
- CVE-2019-0726:文中提到的另一个相关漏洞
教学要点
-
代码审计技巧:
- 注意未检查边界的数组操作
- 记录看似无关但可能有潜在风险的代码片段
- 定期回顾之前标记的代码区域
-
漏洞挖掘方法:
- 通过分析已知漏洞发现新漏洞
- 关注数据处理流程中的边界条件
- 注意类型转换和大小不匹配问题
-
利用开发要点:
- 理解内存布局和覆盖范围
- 考虑现代保护机制的绕过方法
- 精确控制溢出内容和位置
参考资源
原始技术分析文章:PT Security博客
微软安全响应中心:https://msrc.microsoft.com/update-guide/vulnerability/CVE-2019-0697