您好,登录后才能下订单哦!
# 在野样本中如何利用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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。