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服务器响应时的特定功能。该漏洞由两个关键函数中的缺陷导致:

  1. UpdateDomainSearchOption - 负责处理DHCP消息传递
  2. DecodeDomainSearchListData - 由第一个函数连续调用

漏洞背景

在分析DHCP相关代码时,研究人员注意到DhcpExtractFullOptions函数中存在两个堆栈分配的数组,每个数组包含256个元素。关键问题在于:

  • 没有对数组迭代器值的边界检查
  • 攻击者可以发送特制DHCP响应包导致缓冲区溢出

技术细节

漏洞函数分析

DhcpExtractFullOptions函数

  • 负责解析从DHCP服务器接收数据包中的所有选项
  • 初始化时会将两个256元素的数组及其迭代器清零
  • 处理选项时会填充两个数组:
    • all_tags数组:存储所有接收到的消息选项标记
    • unknown_tags数组:仅包含解析器未知的选项标记

漏洞点

  • 数组元素类型为int(4字节),但选项标记大小为1字节
  • 没有检查数组索引是否超过256的限制
  • 当接收超过256个选项时,会导致堆栈缓冲区溢出

溢出机制

  1. 每个选项标识符写入数组时占用4字节空间
  2. 攻击者控制每个第4个字节(选项标识符值),其余字节在覆盖时归零
  3. 溢出可以覆盖:
    • 堆栈安全cookie
    • 函数返回地址
    • 局部变量

漏洞利用

攻击准备

  1. 模拟DHCP服务器
  2. 构造特制DHCP响应包:
    • 包含至少0x1a0(416)个选项
    • 每个选项标识符设为0xaa
    • 每个选项大小为2字节(包含头部)
    • 总数据包大小约1100-1200字节(在以太网MTU限制内)

攻击效果

  1. 选项标识符覆盖:
    • 堆栈cookie
    • 函数返回地址
  2. 在目标系统的svchost.exe进程中触发异常

利用限制

现代保护机制(如ASLR、DEP等)增加了利用难度:

  • 防止返回地址和异常处理程序被覆盖
  • 阻止在未分配内存中执行代码
  • 难以预测地址

但攻击者仍可能利用溢出覆盖局部变量实现攻击。

防御措施

  1. 应用微软2019年3月发布的补丁
  2. 网络层面监控异常DHCP流量(大量选项的响应包)
  3. 启用堆栈保护机制

相关漏洞

  • CVE-2019-0547:由微软员工Mitch Adair发现的另一个DHCP漏洞
  • CVE-2019-0726:文中提到的另一个相关漏洞

教学要点

  1. 代码审计技巧

    • 注意未检查边界的数组操作
    • 记录看似无关但可能有潜在风险的代码片段
    • 定期回顾之前标记的代码区域
  2. 漏洞挖掘方法

    • 通过分析已知漏洞发现新漏洞
    • 关注数据处理流程中的边界条件
    • 注意类型转换和大小不匹配问题
  3. 利用开发要点

    • 理解内存布局和覆盖范围
    • 考虑现代保护机制的绕过方法
    • 精确控制溢出内容和位置

参考资源

原始技术分析文章:PT Security博客

微软安全响应中心:https://msrc.microsoft.com/update-guide/vulnerability/CVE-2019-0697

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