CreateRCE — CreateUri 中的又一个漏洞
内容提要
Akamai 研究人员 Ben Barnea 在 Microsoft Windows 中发现了一个关键漏洞,该漏洞被指定为 CVE-2023-35628。
互联网上的攻击者无需利用任何用户互动(零点击),即可对 Outlook 客户端触发该漏洞。
该漏洞出现在 CreateUri 函数对路径的解析之中。目前,我们已经发现有两种方法可以触发此漏洞:(1) 通过向 Outlook 客户端发送特制的电子邮件;或者 (2) 诱使用户在文件资源管理器中导航至包含恶意下载文件的文件夹。
该漏洞已披露给 Microsoft,并在 2023 年 12 月的 Patch Tuesday中予以解决。
安装了 2023 年 12 月软件更新的 Windows 计算机可以有效防范此漏洞。此外,如果 Outlook 客户端使用的是已经用 2023 年 3 月软件更新进行修补的 Exchange 服务器,那么这些 Outlook 客户端也可以防范这个被滥用的功能。
简介
漏洞中的传奇
在 2023 年 3 月的 Patch Tuesday 所解决的漏洞当中,有一个 Microsoft 自己发现的 Outlook 漏洞(被指定为 CVE-2023-23397),它曾 被攻击者广泛利用,而攻击者据称是受到俄罗斯国家资助的Forest Blizzard。
2023 年 12 月,Microsoft 与波兰网络司令部联合 发布 消息称,他们近期发现同一攻击者试图利用该漏洞进行攻击。攻击者利用该漏洞强制 Outlook 客户端连接到他们操控的服务器。在连接过程中,客户端会将 NTLM 凭据发送给攻击者。攻击者随后可以离线破解这些凭据,或者利用它们执行中继攻击。 此漏洞可以通过互联网进行远程利用,无需任何用户交互(零点击)。
在针对此漏洞发布补丁之后,我们又发现了两个 绕过漏洞 和一个声音解析漏洞。将绕过漏洞和解析漏洞串联在一起后,会导致在 Outlook 客户端上形成完整的零点击 RCE 基元。
MapUrlToZone
在 Outlook 漏洞 CVE-2023-23397的补丁中,负责处理自定义提醒声音的代码增加了对 MapUrlToZone的调用。该调用会检查通过扩展 MAPI 属性 PidLidReminderFileParameter指定的已提供 URL 是否未指向某个互联网资源。
尽管这样可以抵御初始漏洞,但也增加了新的攻击面,也就是函数 MapUrlToZone 本身;我们控制了传递到 MapUrlToZone的路径。
在 MapUrlToZone所执行的解析中,将会调用 CreateUri。 CreateUri 会创建一个表示统一资源标识符 (URI) 的 IUri 对象。为了创建该对象,函数 知道要解析 URL 和部分 DOS Windows 路径。
在使用文件路径调用 CreateUri 时(例如,使用 file:// scheme或指向某个文件/目录的 Windows 路径),将会调用函数 CrackUrlFile 。这也是包含 上一篇博文中介绍的绕过漏洞的函数。
新漏洞
在 CrackUrlFile开始时,如果它接收的 URL 不是一个 Windows 路径,则会创建一个输入副本,然后使用 PathCreateFromUrlW将该 URL 副本转换为 Windows 路径。工作缓冲将被标记为动态分配,从而确定稍后要将其释放。如果该函数接收到 Windows 路径,则会直接使用输入的路径,因而不需要释放缓冲区指针。
在工作缓冲解析期间,可以将缓冲区前移,例如,对于本地设备路径(以“\\.\”或“\\?\”开头),该函数会将指针前移 4 个字符。如果设备名称是“UNC\”,则会再多前移 4 个字符。如果有多个反斜杠,该函数还会将缓冲区前移至超过重复的反斜杠。
在将补丁反向转换为绕过漏洞的过程中,我们在 2023 年 7 月注意到了 CrackUrlFile 中增加的新代码,它似乎与我们的绕过漏洞没有关联(图 1)。
在对路径进行解析时,该函数会检查路径组件是不是一个驱动器路径或根路径。如果是这样,则会将该路径标记为本地路径。如果该路径是一个驱动器路径,新代码会将原来的缓冲区指针覆盖为指向该路径组件的指针(前移的缓冲区)。
这就是错误的由来: 保存的是已前移的指针。之后,如果原始缓冲区指针(图 1 中的PPWorkingBuffer )已被动态分配,则会将其恢复并释放。由于它已被覆盖为前移后的指针,调用 free() 函数时使用的将不是由 malloc 函数返回的指针。 这样将为攻击者提供一个基元,使其能够在内存分配器中植入一个恶意块的元数据。
为了触发这一漏洞,我们首先需要指定一个文件方案 URL,其中包含一个 UNC 路径。然后,我们需要将该路径标记为驱动器路径,所以必须使用一个共享位置 (C:)。用于触发该漏洞的完整路径看上去类似于下图:
file://./UNC/C:/Akamai.com/file.wav
现在,修复后的代码将使用 RtlMoveMemory 复制路径组件的字节,而不是保存指针。
通过资源管理器触发
总结
这是我们关于 CVE-2023-23397 潜在影响研究的最后一篇博文。
我们在 2023 年 5 月发现第一个绕过漏洞时,就已建议移除这一被滥用的功能,因为使用 MapUrlToZone 会增加新的攻击面。我们还曾提到过,如果以零点击的方式将声音解析攻击面暴露在远程攻击者面前,并且不使用任何沙盒,给用户造成的危险就会大于创造的价值。
在我们的后续研究当中,我们发现了 两个 绕过漏洞、一个 声音解析漏洞,最后还发现一个 Windows 路径解析内存损坏漏洞,这些都最终证明了我们的观点。
通过这些博文,我们希望您学到了一些关于 Windows 路径、声音编解码器和不同漏洞的新知识。我们鼓励其他研究人员也能关注这些补丁,想想如何能够绕过它们。我们不能排除存在更多 MapUrlToZone 绕过漏洞的可能。