绿盟科技
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
简介
Windows备份服务为计算机提供备份和还原的功能。它依赖于Microsoft Windows备份引擎,提供了备份和还原的基本功能,例如备份系统镜像、文件、文件夹和应用程序数据等。CVE-2023-21752微软在2023年1月份修复的一个位于Windows备份服务中的任意文件删除漏洞。由于Windows备份引擎在文件夹权限验证时处理不当,攻击者可构造恶意代码实现任意文件删除,进而导致特权提升。
漏洞分析
sdengin2.dll 是Microsoft Windows备份引擎的一个动态链接库文件,用于提供备份和还原功能的底层支持,漏洞出现在IsWritable函数中
函数功能比较简单,该函数功能为判断文件或者文件夹是否可写,如果openFlag=7,说明该路径是文件夹,则调用 GetTempFileNameW 创建一个临时文件,并且删除该文件,如果删除成功则说明该文件夹可写。其次如果是文件,则尝试打开文件后调用DeviceIoControl 函数向文件发送一个请求,判断文件是否可写。如果返回成功,则说明该文件可写。这里我们可以可以去查看 GetTempFileNameW 的实现
可以看到在最终的 CreateFileW 中, dwFlagsAndAttributes 为0x80,也就是FILE_ATTRIBUTE_NORMAL ,微软对其的解释是,该文件没有设置其他属性。此属性仅在单独使用时有效。 也就是说,该临时文件并未被被锁住,我们可以在创建临时文件后,删除文件前的时间窗口内在其他线程内用机会锁锁住该临时文件,并且将其文件路径指到任意文件漏洞后释放机会锁,触发 SxDeleteFile 实现任意文件删除。所以这是一个由条件竞争引起的任意文件删除漏洞。
漏洞验证
对 IsWritable 函数进行交叉引用,可以找到一个比较方便的触发路径,也就是CSdCommonImpl::QueryStorageDevice ,
可以看出 QueryStorageDevice 是一个名为SdEngine2的com接口,而由于 sdengin2.dll 的特殊性,这个接口无法为我们直接使用,由于其本身是服务于SDRSVC备份服务,最终在sdrsvc.dll 里面的CSdController::QueryDeviceProperties 找到调用操作,函数中调用了ISdCommon2 COM接口中的方法,用于查询设备属性。
而查看该函数的虚表,可知该函数为 SdController 中的 ISdScheduledBackup com接口。
那么我们可以通过调用 ISdScheduledBackup com接口,从而触发漏洞函数。
这里我们通过 ReadDirectoryChanges 函数监控目标函数创建文件行为后创建机会锁锁住该文件,然后设置文件路径指向目标文件后释放机会锁,从而实现任意文件删除。
漏洞修复
对 sdengin2.dll 进行diff,如下图所示。
可以看到,在补丁更新后,原本的创建临时文件然后删除的流程被更改成了由CheckDevicePathIsWritable 判断。
而在 CheckDevicePathIsWritable 中。
可以看到创建文件依然存在,但只是 dwFlagsAndAttributes 属性变为 0x4000080 ,查询文档后得知加入了 FILE_FLAG_DELETE_ON_CLOSE 属性,即:该文件将在其所有句柄关闭后立即删除,其中包括指定的句柄和任何其他打开或重复的句柄。这就意味着,该补丁将创建和删除文件操作合并为一步,从而消除了条件竞争的问题。
参考链接
https://github.com/Wh04m1001/CVE-2023-21752
https://paper.seebug.org/2045/
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
