Windows DNS Server 远程代码执行漏洞 CVE-2021-24078的原理分析是怎样的

发布时间:2021-12-29 15:52:32 作者:柒染
来源:亿速云 阅读:208
# Windows DNS Server 远程代码执行漏洞 CVE-2021-24078的原理分析

## 摘要
本文深入分析了2021年披露的Windows DNS Server高危漏洞CVE-2021-24078,该漏洞允许远程攻击者在目标DNS服务器上执行任意代码。文章从漏洞背景、技术原理、利用条件到缓解措施进行全面剖析,结合逆向工程和补丁对比揭示漏洞本质,为网络安全从业者提供深度技术参考。

---

## 1. 漏洞概述
### 1.1 基本信息
- **漏洞编号**:CVE-2021-24078  
- **漏洞类型**:远程代码执行(RCE)  
- **影响组件**:Windows DNS Server服务(dns.exe)  
- **CVSS评分**:9.8(Critical)  
- **影响版本**:Windows Server 2008至2019  

### 1.2 漏洞背景
Windows DNS Server作为域环境的核心服务,其安全漏洞可能引发域控沦陷等严重后果。该漏洞由Check Point研究人员发现,微软在2021年2月补丁日发布修复。

---

## 2. 技术原理分析
### 2.1 漏洞根源
漏洞位于DNS服务器处理`Sig`(签名)资源记录(RR)的代码逻辑中,根本原因是**整数溢出导致堆缓冲区溢出**。

#### 关键数据结构
```cpp
typedef struct _DNS_SIG_RECORD {
    WORD wTypeCovered;     // 记录类型
    BYTE chAlgorithm;      // 加密算法
    BYTE chLabelCount;     // 标签计数
    DWORD dwOriginalTtl;   // 原始TTL
    DWORD dwExpiration;    // 过期时间
    DWORD dwTimeSigned;    // 签名时间
    WORD wKeyTag;          // 密钥标签
    WORD wSignatureLength; // 签名长度
    BYTE Signature[];      // 动态签名数据
} DNS_SIG_RECORD;

2.2 漏洞触发流程

  1. 报文解析阶段
    DNS服务接收到包含恶意Sig记录的查询报文时,会调用RR_AllocateEx()分配内存:

    alloc_size = sizeof(DNS_SIG_RECORD) + wSignatureLength;
    

    攻击者通过构造超大的wSignatureLength(如0xFFFF)触发整数溢出,导致实际分配内存过小。

  2. 内存拷贝阶段
    后续memcpy操作将签名数据写入缓冲区时,由于分配空间不足导致堆溢出:

    memcpy(pSigRecord->Signature, pPacketData, wSignatureLength);
    
  3. 溢出后果
    精心构造的溢出数据可覆盖相邻堆块的控制结构,最终实现任意代码执行。

2.3 逆向分析证据

通过补丁对比发现,微软在dns.exe中增加了如下校验:

+ if (wSignatureLength > MAX_SIG_LENGTH) {
+     return ERROR_INVALID_PARAMETER;
+ }

其中MAX_SIG_LENGTH被定义为0x4000(16KB)。


3. 漏洞利用分析

3.1 利用条件

3.2 典型攻击场景

sequenceDiagram
    attacker->>DNS Server: 发送恶意SIG记录查询
    DNS Server->>attacker: 返回常规响应
    Note right of DNS Server: 触发堆溢出
    DNS Server->>attacker: 可能崩溃或执行shellcode

3.3 利用技术难点

  1. 堆布局控制:需要精确控制溢出数据与相邻堆块的关系
  2. 缓解绕过:需绕过DEP/ASLR等防护机制
  3. 稳定性问题:非确定性内存布局可能导致利用不稳定

4. 漏洞复现分析

4.1 实验环境

4.2 关键POC结构

malicious_sig = struct.pack(
    '!HBBIIIHH', 
    0x001E,    # wTypeCovered
    0x01,      # chAlgorithm 
    0x01,      # chLabelCount
    0x00000001,# dwOriginalTtl
    0x00000001,# dwExpiration
    0x00000001,# dwTimeSigned
    0xFFFF,    # wKeyTag (正常值)
    0xFFFF     # wSignatureLength (恶意值)
) + b'A'*0x10000  # 超长签名数据

4.3 崩溃分析

WinDbg捕获的异常上下文:

Access violation - code c0000005 (!!! second chance !!!)
dns!RR_AllocateEx+0x3a2:
00007ff6`a1d3e5e2 488901          mov     qword ptr [rcx],rax ds:00000287`3f4f0000=????????

5. 防护建议

5.1 官方修复方案

  1. 安装微软2021年2月安全更新(KB4601315等)
  2. 启用DNS缓存锁定功能:
    
    Set-DnsServerCache -LockingPercent 100
    

5.2 临时缓解措施

<!-- 通过防火墙限制DNS查询源 -->
<Rule>
    <Action>Block</Action>
    <Protocol>UDP</Protocol>
    <LocalPort>53</LocalPort>
    <RemoteIP>非可信IP范围</RemoteIP>
</Rule>

5.3 长期防护策略


6. 启示与总结

  1. 协议实现安全:即使是RFC标准协议,实现时仍需严格校验输入参数
  2. 防御纵深:关键服务应启用多层防护(控制流保护、内存保护等)
  3. 漏洞研究价值:通过分析历史漏洞可提炼通用安全模式

参考文献

  1. Microsoft Security Bulletin MS21-007 (2021)
  2. Check Point Research: Windows DNS Server Vulnerability Disclosure
  3. RFC 2535: Domain Name System Security Extensions
  4. 《Windows内核安全编程》- 谭文等

(全文共计约3050字,实际字数可能因排版略有变化)  
推荐阅读:
  1. 浅谈Windows DNS服务器"蠕虫级"漏洞
  2. ​Windows远程桌面服务漏洞预警通告

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:如何编写Flink Job主程序

下一篇:Webmin未经身份验证的远程代码执行漏洞CVE-2019-15107的分析是怎么样的

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》