简介
Windows备份服务为计算机提供备份和还原的功能。它依赖于Microsoft Windows备份引擎,提供了备份和还原的基本功能,例如备份系统镜像、文件、文件夹和应用程序数据等。CVE-2023-21752微软在2023年1月份修复的一个位于Windows备份服务中的任意文件删除漏洞。由于Windows备份引擎在文件夹权限验证时处理不当,攻击者可构造恶意代码实现任意文件删除,进而导致特权提升。
01:漏洞分析
sdengin2.dll是Microsoft Windows备份引擎的一个动态链接库文件,用于提供备份和还原功能的底层支持,漏洞出现在IsWritable函数中 :
函数功能比较简单,该函数功能为判断文件或者文件夹是否可写,如果openFlag=7,说明该路径是文件夹,则调用GetTempFileNameW创建一个临时文件,并且删除该文件,如果删除成功则说明该文件夹可写。其次如果是文件,则尝试打开文件后调用DeviceIoControl函数向文件发送一个请求,判断文件是否可写。如果返回成功,则说明该文件可写。
这里我们可以可以去查看GetTempFileNameW的实现
可以看到在最终的CreateFileW中,dwFlagsAndAttributes为0x80,也就是FILE_ATTRIBUTE_NORMAL,微软对其的解释是,该文件没有设置其他属性。此属性仅在单独使用时有效。也就是说,该临时文件并未被被锁住,我们可以在创建临时文件后,删除文件前的时间窗口内在其他线程内用机会锁锁住该临时文件,并且将其文件路径指到任意文件漏洞后释放机会锁,触发SxDeleteFile实现任意文件删除。所以这是一个由条件竞争引起的任意文件删除漏洞。
02:漏洞验证
对IsWritable函数进行交叉引用,可以找到一个比较方便的触发路径,也就是CSdCommonImpl::QueryStorageDevice,
可以看出QueryStorageDevice是一个名为SdEngine2的com接口,而由于sdengin2.dll的特殊性,这个接口无法为我们直接使用,由于其本身是服务于SDRSVC备份服务,最终在sdrsvc.dll里面的CSdController::QueryDeviceProperties找到调用操作,函数中调用了ISdCommon2 COM接口中的方法,用于查询设备属性。
而查看该函数的虚表,可知该函数为SdController中的ISdScheduledBackup com接口。
那么我们可以通过调用ISdScheduledBackup com接口,从而触发漏洞函数。
这里我们通过ReadDirectoryChanges函数监控目标函数创建文件行为后创建机会锁锁住该文件,然后设置文件路径指向目标文件后释放机会锁,从而实现任意文件删除。
03:漏洞修复
对sdengin2.dll进行diff,如下图所示。
可以看到,在补丁更新后,原本的创建临时文件然后删除的流程被更改成了由CheckDevicePathIsWritable判断。
而在CheckDevicePathIsWritable中。
可以看到创建文件依然存在,但只是dwFlagsAndAttributes属性变为0x4000080,查询文档后得知加入了FILE_FLAG_DELETE_ON_CLOSE属性,即:该文件将在其所有句柄关闭后立即删除,其中包括指定的句柄和任何其他打开或重复的句柄。
这就意味着,该补丁将创建和删除文件操作合并为一步,从而消除了条件竞争的问题。
参考文献
[1] https://github.com/Wh04m1001/CVE-2023-21752
[2] https://paper.seebug.org/2045/
绿盟科技天元实验室专注于新型实战化攻防对抗技术研究。
研究目标包括:漏洞利用技术、防御绕过技术、攻击隐匿技术、攻击持久化技术等蓝军技术,以及攻击技战术、攻击框架的研究。涵盖Web安全、终端安全、AD安全、云安全等多个技术领域的攻击技术研究,以及工业互联网、车联网等业务场景的攻击技术研究。通过研究攻击对抗技术,从攻击视角提供识别风险的方法和手段,为威胁对抗提供决策支撑。
M01N Team公众号
聚焦高级攻防对抗热点技术
绿盟科技蓝军技术研究战队
官方攻防交流群
网络安全一手资讯
攻防技术答疑解惑
扫码加好友即可拉群