2019年,checkpoint研究人员发现了Remote Desktop Protocol (RDP) 客户端中的安全漏洞——CVE-2019-0887。研究人员在测试MacOS RDP客户端过程中发现不仅可以绕过微软的发布的补丁,还可以绕过任意的路径规范化检查。
CVE-2019-0887补丁
微软2019年就发布了CVE-2019-0887漏洞的安全补丁。该补丁非常简单,根据最佳实践,基于PathCchCanonicalize函数加入了一个验证检查,如图1所示:
图 1: PathCchCanonicalize用于计算文件名的规范化形式
如果成功,规范化的输出就会与原始文件名进行比较,如果不匹配就会产生错误。也就是说如果文件名中含有. 或 ..这样的字符串,当转化为规范化形式时,有效性检查就会失败。但是该补丁确实修复了路径遍历漏洞。
MacOS RDP 客户端
研究人员Chris发现CVE-2019-0887漏洞也可以应用于Microsoft RDP客户端。Checkpoint研究人员就对macOS RDP客户端进行了测试,发现漏洞利用可以绕过微软发布的补丁。
PathCchCanonicalize
研究人员随后对微软的主路径规范化函数——PathCchCanonicalize进行了简单的测试。如图2所示:
图 2: 用\测试PathCchCanonicalize
测试输出的结果为: “The canonical string is: Evil.bat, and the status code: 0.”
之后,研究人员用/进行了同样的测试,结果如图3所示:
图 3: 用/测试PathCchCanonicalize
测试后的结果为:“The canonical string is: ../../Evil.bat, and the status code: 0.”
从以上结果可以得出结论:遵循了Windows最佳实践的PathCchCanonicalize函数好像忽略了 /分割的字符。之后,研究人员通过逆向该函数确认了这点:该函数只搜索了\分割的路径,而忽略了/。
PathCcCanonicalize函数称只在MSDN中实现,但是实际上由于潜在的缓存溢出漏洞而被强烈反对。
图 4: MSDN解释如何使用WinAPI来拦截路径遍历
研究人员让高级软件开发人员实现一个接受文件路径作为输入、验证要写入之前预定义好的文件夹的文件的内容的函数。也就是用Windows API和最佳实践来拦截路径遍历攻击。得到的结果如图5所示:
图 5: 使用PathCchCanonicalize的路径处理样本代码
换句话说,在遵循微软的最佳实践时,一些高级开发人员使用了有漏洞的函数来处理/和\分割的路径。也就是说全球有很多个类似的样本存在着路径遍历攻击的风险。
Windows Paths 101
在基于Unix的系统中,使用的路径分割字符是/,而在Windows系统中使用的是分割字符为\。但Windows最早是支持/和\的。因此,执行任何文件操作都会遇到这两个分隔符。
研究人员发现的漏洞是一个检查的实现漏洞。许多核心Windows功能的开发人员可能忘记了Windows系统也支持/字符,所以会重新实现只支持\的文件路径逻辑。
CVE-2020-0655
研究人员联系了微软,并通知了其CVE-2019-0887漏洞补丁引发的新漏洞的技术细节。微软在2月的补丁日发布了该漏洞的补丁,并将该漏洞命名为CVE-2020-0655。
PathCchCanonicalize位于KernelBase.dll中,但是在2月的Windows更新中该文件并没有更新。如图6所示,kerberos.dll在2月的补丁中更新了,但是KernelBase.dll并没有。
图 6: 表明KernelBase.dll没有更新的Windows dll文件时间戳
研究人员分析补丁中更新的文件发现mstscax.dll可能是潜在的补丁文件。如果真的是这样的话,微软可能只修复了RDP客户端的攻击场景,忽略了有漏洞的API函数的使用。
如图7所示,可以看到作为CVE-2019-0887漏洞补丁一部分的函数CFormatDataPacker::ValidateFilePaths也再次被修改了:
图 7: RDP中将/ chars替换为\ chars的补丁
可以得到一个结论,研究人员最初的猜测是正确的,微软通过在有漏洞的PathCchCanonicalize函数中加入了一个变通的方法来修复之前发布的CVE-2019-0887漏洞补丁中的问题。
目前还没有关于警告用户不要使用有漏洞的路径规范化的安全公告,微软MSDN仍然建议用户在尝试对恶意输入进行处理时使用该函数。
研究人员分析后认为,PathCchCanonicalize是拦击使用/的潜在路径遍历攻击的补丁的最佳位置。
微软响应
在分析了微软的补丁后,研究人员联系了微软SRC,但目前还没有接到来自微软的反馈。
本文翻译自:https://research.checkpoint.com/2020/reverse-rdp-the-path-not-taken/如若转载,请注明原文地址