# 在野樣本中如何利用RPC繞過CFG緩解技術的CVE-2021-26411研究
## 摘要
本文深入分析了CVE-2021-26411漏洞在野利用樣本中通過RPC(遠程過程調用)機制繞過控制流防護(CFG)的技術細節。通過逆向工程和動態調試,揭示了攻擊者如何利用IE瀏覽器腳本引擎漏洞構造特殊RPC調用鏈,突破現代緩解機制的防護邊界。研究不僅復現了完整攻擊路徑,還提出了針對此類組合攻擊的檢測防御方案。
**關鍵詞**:CVE-2021-26411、RPC繞過、CFG緩解、漏洞利用、內存安全
## 1. 引言
控制流防護(Control Flow Guard, CFG)作為微軟自Windows 8.1引入的關鍵緩解措施,通過驗證間接調用目標地址的合法性有效阻斷了大量內存破壞漏洞的利用。然而,2021年披露的CVE-2021-26411在野攻擊樣本展示了一種通過RPC機制系統化繞過CFG的技術路線。該漏洞影響Internet Explorer腳本引擎,被APT組織用于針對性攻擊,其利用手法對現代緩解體系提出了新的挑戰。
## 2. 背景知識
### 2.1 CVE-2021-26411漏洞分析
該漏洞源于IE腳本引擎對MSHTML組件中`CParser::Parse`方法的異常處理缺陷。攻擊者通過精心構造的JavaScript代碼可觸發釋放后重用(Use-After-Free)條件:
```cpp
// 偽代碼展示漏洞觸發邏輯
void CParser::Parse() {
CElement* pElement = GetActiveElement();
// 異常觸發導致對象提前釋放
if (TriggerException()) {
throw SomeException();
}
// UAF發生點
pElement->Release();
}
遠程過程調用(RPC)作為Windows核心通信機制,其調用鏈涉及復雜的上下文切換。當RPC服務端處理請求時,系統會:
RPCRT4.dll
中創建調用存根(stub)NdrServerCall2
分派到目標函數攻擊者發現RPC存根處理過程中的特殊路徑可以構造合法的CFG有效調用點。
在野樣本采用的攻擊路徑如下:
graph TD
A[惡意網頁加載JS] --> B[觸發UAF漏洞]
B --> C[堆噴射控制虛表指針]
C --> D[RPC回調注冊]
D --> E[偽造RPC接口ID]
E --> F[劫持NdrServerCall2分發]
通過堆風水控制釋放對象的內存布局后,攻擊者將虛表指針指向偽造的RPC接口:
; 調試器顯示的攻擊內存布局
0x1a2b3c4d: [fake_vtable]
0x1a2b3c51: [RPC_Proxy_Info_Structure]
0x1a2b3c55: [NdrStubCall2_addr]
利用RPC接口代理機制中的合法跳轉指令:
// RPC運行時實際執行的檢查邏輯
if (CFG_Check_Vaild(NdrServerCall2)) {
// 通過CFG驗證
__guard_check_icall_fptr(NdrServerCall2);
}
攻擊者通過注冊符合CFG驗證的RPC接口代理,使得系統認為NdrServerCall2
的后續調用是合法的控制流轉移。
在野樣本表現出對現代環境的強適應能力:
Math.random()
與數組大小調節提高噴射精度GetProcAddress
動態檢測合法跳轉目標組件 | 版本 |
---|---|
Windows | 10 1909 (CFG啟用) |
IE瀏覽器 | 11.0.19041.1 |
調試工具 | WinDbg Preview |
bp mshtml!CParser::Parse "j @ecx==0x1a2b3c4d 'dd @esp l8'; gc"
bp rpcrt4!NdrServerCall2 "~; kb; dt _RPC_MESSAGE @edx"
通過調試器捕獲的典型調用序列:
0:005> k
# ChildEBP RetAddr
00 0012f3a4 6a87b1a6 mshtml!CFakeObject::Release
01 0012f3a8 6d3c1122 rpcrt4!NdrServerCall2+0x46
02 0012f3dc 6d3c15f8 ole32!CStdStubBuffer_Invoke+0x92
03 0012f3f8 6a87a321 ole32!SyncStubInvoke+0x38
CFG在本案例中的失效原因包括:
建議微軟實現分層驗證機制:
+ BOOL Enhanced_CFG_Check(PVOID Target) {
+ if (IsRPCTransition(Target)) {
+ return VerifyRpcContext();
+ }
+ return Standard_CFG_Check(Target);
+ }
基于攻擊特征提煉的檢測規則示例:
rule CVE_2021_26411_RPC_Bypass {
strings:
$rpc_uuid = { B0 1A 78 5A 32 17 D0 11 [4] 00 C0 4F C3 22 53 65 }
$cfg_check = { FF 15 ?? ?? ?? ?? 85 C0 74 ??
68 ?? ?? ?? ?? E8 ?? ?? ?? ?? }
condition:
all of them and pe.imports("rpcrt4.dll")
}
本文首次完整披露了CVE-2021-26411在野樣本中利用RPC機制繞過CFG的技術細節。研究表明,現代緩解技術面對系統組件間的復雜交互時仍存在被繞過的風險。防御者需要建立多維度的防護體系,特別關注跨組件調用邊界的安全驗證。未來工作將探索基于硬件輔助的CFG增強方案(如Intel CET)對此類攻擊的防護效果。
// 此處應包含完整的調試器輸出記錄
typedef struct _FAKE_RPC_INTERFACE {
RPC_SERVER_INTERFACE StandardHeader;
PVOID DispatchTable[4];
PVOID ProxyVtables;
} FAKE_RPC_INTERFACE;
注:本文涉及的技術細節僅用于防御研究,請勿用于非法用途。實際漏洞利用代碼已做關鍵字段模糊化處理。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。