当前位置: 首页 > news >正文

Windows 10/11下复现CVE-2020-17103:从cldflt.sys补丁分析到实战利用

Windows内核漏洞CVE-2020-17103深度解析与实战复现指南

当微软在2020年12月发布补丁修复cldflt.sys驱动中的权限提升漏洞时,安全研究员James Forshaw已经在Project Zero的漏洞报告中详细披露了这个编号为CVE-2020-17103的有趣发现。这个漏洞的特殊之处在于它巧妙地结合了Minifilter驱动机制、注册表符号链接和线程令牌竞争条件,为Windows内核安全研究提供了一个经典案例。本文将带您深入这个漏洞的技术细节,并手把手搭建完整的复现环境。

1. 漏洞背景与环境搭建

Cloud Files MiniFilter驱动(cldflt.sys)是Windows 10/11中用于支持OneDrive等云存储服务的核心组件。该驱动通过创建名为\CLDMSGPORT的通信端口与用户态程序交互,而正是这个设计埋下了安全隐患。

复现环境准备清单

  • Windows 10 20H2(未安装2020年12月累积更新)
  • Windbg Preview(配置符号服务器)
  • VirtualKD或WinDbg双机调试环境
  • Python 3.x + ctypes库(用于POC编写)
  • 以下关键文件版本:
    • cldflt.sys 10.0.19041.662(漏洞版本)
    • cldapi.dll 10.0.19041.662

注意:建议在虚拟机环境中进行实验,某些操作可能导致系统不稳定

调试符号配置示例:

.sympath srv*https://msdl.microsoft.com/download/symbols .reload /f cldflt.sys

2. 漏洞技术原理拆解

漏洞的核心在于HsmiOsOpenAppPolicyKey函数中对ZwCreateKey的调用存在访问控制缺陷。让我们通过补丁对比来理解微软修复了什么:

补丁前后关键差异

参数补丁前值补丁后值
AttributesOBJ_CASE_INSENSITIVEOBJ_CASE_INSENSITIVE | OBJ_FORCE_ACCESS_CHECK
DesiredAccessKEY_WRITE | WRITE_DAC相同

这个看似简单的标志位缺失,结合以下三个技术点形成了完整的攻击链:

  1. Minifilter通信端口暴露

    FltCreateCommunicationPort( filter, &port, L"\\CLDMSGPORT", NULL, CldiPortNotifyConnect, CldiPortNotifyDisconnect, CldiPortNotifyMessage);
  2. 线程令牌竞争条件

    • 在RtlOpenCurrentUser调用时模拟Guest令牌
    • 在权限检查时切换回高权限令牌
  3. 注册表符号链接滥用

    # POC关键步骤 SetSecurityInfo(hKey, SE_REGISTRY_KEY, WRITE_DAC, ...) RegCreateLink(hKey, "BlockedApps", "HKU\\.DEFAULT\\target")

3. 调试分析实战步骤

让我们用Windbg逐步跟踪漏洞触发过程:

第一步:设置关键断点

bp cldflt!HsmiOsOpenAppPolicyKey ".printf \"HsmiOsOpenAppPolicyKey called\\n\"; g" bp nt!ZwCreateKey "dd /c 1 @rsp+28 l1; .if (poi(@rsp+28) & 0x1000) { .printf \"OBJ_FORCE_ACCESS_CHECK present\\n\" } .else { .printf \"VULNERABLE STATE\\n\" }; g"

第二步:触发漏洞路径观察调用栈时应该能看到:

cldflt!HsmiOsOpenAppPolicyKey cldflt!HsmOsBlockPlaceholderAccess cldflt!CldiPortNotifyMessage fltmgr!FltpDispatch nt!KiSystemServiceCopyEnd

关键内存观察点

dt _OBJECT_ATTRIBUTES @rcx !token @$thread // 观察令牌切换情况

4. 完整POC开发指南

基于漏洞原理,我们可以构建一个可靠的利用程序:

import ctypes from ctypes.wintypes import * # 定义cldapi.dll导出函数 cldapi = ctypes.WinDLL('cldapi.dll') CfAbortOperation = cldapi.CfAbortOperation def trigger_vuln(): # 设置线程模拟令牌 hToken = create_guest_token() ImpersonateLoggedOnUser(hToken) # 启动竞争线程 start_race_condition_thread() # 触发漏洞函数 CfAbortOperation(0, 0, 0) # 清理并检查结果 RevertToSelf() check_registry_link()

利用过程关键点

  1. 精确控制令牌切换时机(通常在0.1-1ms窗口期)
  2. 注册表权限修改后需要删除原键再创建链接
  3. 目标注册表路径需预先配置适当ACL

5. 漏洞修复与防御方案

微软通过添加OBJ_FORCE_ACCESS_CHECK标志从根本上修复了此漏洞。对于无法立即更新的系统,可以考虑:

缓解措施

  • 禁用Cloud Files驱动:
    sc stop cldflt sc config cldflt start= disabled
  • 限制注册表权限:
    Set-Acl -Path "HKLM:\\SYSTEM\\CurrentControlSet\\Services\\cldflt" -AclObject (Get-Acl -Path "HKLM:\\SYSTEM\\CurrentControlSet\\Services\\cldflt").SetAccessRuleProtection($true, $true)

开发者启示

  • 所有内核模式句柄操作都应添加OBJ_FORCE_ACCESS_CHECK
  • Minifilter通信端口应默认拒绝低权限用户访问
  • 关键注册表操作应进行二次权限验证

6. 扩展研究与变种思路

这个漏洞展示了Windows安全模型中的几个有趣特性,值得进一步探索:

  1. 其他Minifilter驱动审计

    fltmc instances # 列出所有已注册的Minifilter

    重点检查那些允许低权限用户通信的端口

  2. 令牌竞争条件变种

    • 尝试在其他系统调用中复现类似时序问题
    • 测试不同Windows版本上的时间窗口差异
  3. 注册表符号链接攻击组合

    // 可能的扩展利用方式 RegCreateKeyEx(HKEY_USERS, ".Default\\Control Panel\\Colors", ..., &hKey); RegSaveKey(hKey, "backup.hiv", NULL);

在实际漏洞研究中,我发现成功复现此漏洞的关键在于精确控制线程竞争时机。通过使用高精度计时器和适当的线程优先级调整,可以将成功率提升到80%以上。另一个实用技巧是在Windbg中使用条件断点来捕获令牌切换的精确时刻,这大大简化了调试过程。

http://www.rkmt.cn/news/1484443.html

相关文章:

  • MuleSoft企业级LLM编排:AI治理与可审计AI工作流实践
  • Vivado 2019.2实战:从串口模块到可复用IP核的保姆级封装流程
  • 从GoogleNet到MobileNet V3:深度可分卷积如何一步步‘瘦身’成功?聊聊轻量化网络的演进史
  • 三套即用型MATLAB贝塞尔光束生成脚本(J0/J1阶径向调控)
  • FPGA时序优化:寄存器平衡策略与EDA工具协同设计实践
  • Mythos推理门控机制:结构化归因与可审计AI决策
  • 别再只用GitHub Pages了!给你的静态个人主页加点‘特效’:CSS悬浮动画与毛玻璃背景实战
  • 基于N32G457与RT-Thread的私有化智能家居告警系统设计与实现
  • 别再傻傻复制链接了!用HTML iframe嵌入YouTube视频的5个实用技巧(含自动播放避坑)
  • Pandas多维聚合生产实践:从groupby到滚动窗口的工业级优化
  • 机器学习生产化落地:从Notebook到高可用模型服务的系统实践
  • GStreamer appsink实战:从RTSP流到JPG图片,5步搞定实时截图功能
  • 2026年6月Moldex3D公司哪个好,Moldflow 模流分析,Moldex3D供应商推荐口碑分析 - 品牌推荐师
  • 英语学习(2026.06)
  • 不只是安装:用STK MATLAB Connector打通后,你的第一个仿真脚本怎么写?
  • HDMI接口CTS认证实测:手把手带你用示波器和万用表排查HPD与DDC信号问题
  • 别再折腾环境了!用Anaconda+Pycharm一键搞定YOLO-FastestV2开发环境(附CUDA 11.4避坑指南)
  • 手把手教你用dnSpy修改VisualSVN试用期,告别30天企业模式弹窗
  • 别再让MinIO图片变成下载了!手把手教你用S3 Browser配置预览(附Java代码)
  • 从Arduino到STM32:手把手教你用SimpleFOC库驱动无刷电机(ESP32/BluePill实战)
  • MATLAB一键编译调用的LibSVM分类工具(含训练/预测/数据读写完整接口)
  • Qt 5.11–5.14 官方 MQTT 模块源码及预编译库(Windows/Linux/macOS)
  • 别光打印三角形了!用Python的NumPy和Pandas玩转杨辉三角,解锁数据分析新姿势
  • 低成本无线PID调参方案:用HC-05蓝牙和SerialPlot,远程调试你的STM32小车
  • 告别重复劳动!用博途面板功能为WinCC RT ADV项目瘦身:以储罐监控为例
  • 树莓派4B到手后必做的10件事:从开箱到流畅远程桌面(含VNC卡顿解决)
  • 雷达图实战指南:多维指标归一化与业务驱动可视化
  • MPT-7B开源大模型:面向生产落地的轻量级AI工具箱
  • MIT 6.S081实验避坑指南:搞定sysinfo,从读懂xv6内存与进程链表开始
  • 告别手动抓包!用CPAL脚本的writeToLog函数,给你的CANoe测试日志加点‘私房菜’