RedirectionGuard:缓解Windows中不安全的连接点遍历
随着攻击手段不断演进,微软致力于通过不仅响应漏洞,还预测和缓解整个威胁类别来保持领先。文件系统重定向攻击一直是权限提升的持久向量。为此,我们在Windows 11中开发并部署了名为RedirectionGuard的新缓解措施。本文概述了RedirectionGuard如何通过阻止不安全的连接点遍历,主动关闭主要攻击面,强化我们“设计即安全”原则的承诺,并减轻开发者和防御者的负担。
为什么文件路径重定向是一个问题?
当特权本地Windows服务访问包含重定向的文件路径而未意识到时,问题就会出现。例如,一个服务可能使用临时文件夹C:\MyService,在其中存储一些数据文件。完成后,该服务以SYSTEM级别权限删除C:\MyService中的所有内容。但如果非特权用户将MyService文件夹替换为指向C:\Windows\System32的连接点C:\MyService呢?现在,当服务清理其临时目录时,它会跟随连接点并删除C:\Windows\System32中的文件,损坏重要的系统文件。
过去的缓解措施
文件系统攻击和缓解措施并不是新概念。一种先前常见的攻击方法涉及硬链接,恶意地将文件操作从一个目标文件重定向到同一卷上的另一个文件。然而,这种技术已通过要求硬链接创建者对目标文件具有WRITE_ATTRIBUTES权限来大部分缓解。
对象管理器符号链接只能通过对象管理器路径直接到达,大多数本地Windows服务不接受这种路径。否则,文件操作必须首先通过另一个重定向原语(如连接点)指向对象管理器。符号链接虽然强大,但需要管理员权限或开发者模式来创建,使得标准用户无法使用。
连接点仍然是最大的现有漏洞。在沙箱之外,标准用户可以创建它们并目标系统上的任何文件夹。此外,它们可以与其他形式的重定向(如对象管理器符号链接)结合使用,以有效地重定向文件夹和文件。
原语 | 限制和缓解措施 |
---|---|
硬链接 | 只能目标文件;目标必须在同一卷上;创建者必须对目标具有WRITE_ATTRIBUTES访问权限 |
对象管理器符号链接 | 源必须在对象管理器命名空间中,但目标可以在文件系统或对象管理器命名空间中的任何位置;当创建者被沙箱化时,沙箱外的进程将无法跟随从沙箱内创建的任何链接 |
符号链接 | 创建者必须具有管理员权限或必须启用开发者模式 |
连接点 | 本身只能目标文件夹;创建者必须对源具有FILE_WRITE_DATA或FILE_WRITE_ATTRIBUTES访问权限;源目录必须为空;当创建者被沙箱化时,他们还必须对目标目录具有FILE_GENERIC_WRITE访问权限 |
鉴于硬链接缓解的成功,对连接点应用类似的方法可能看起来很简单。毕竟,连接点的创建者已经需要在沙箱化时对连接点的目标目录具有FILE_GENERIC_WRITE访问权限。那么,为什么不也要求从沙箱外创建的连接点对目标目录具有FILE_GENERIC_WRITE访问权限呢?挑战在于连接点在Windows上的典型使用方式。虽然硬链接通常目标创建者已经具有完全访问权限的文件,但连接点用于更多样化的场景。广泛要求对目标目录具有FILE_GENERIC_WRITE会破坏太多有效场景。
界定攻击场景
为了创建可行的解决方案,有必要具体定义问题。在这种情况下,攻击场景如下:
- 攻击者已入侵Windows机器上的本地标准用户。
- 他们可以根据被入侵帐户的权限在本地磁盘上的位置创建文件、文件夹和连接点。
- 他们可以以该用户身份与其他程序交互。
- 他们的目标是将权限提升到本地管理员或执行其他一些被入侵用户无法执行的特权操作。
由于这是基于文件系统的权限提升攻击,攻击者必须影响与文件系统交互并具有执行他们自己无法执行的特权操作权限的程序。这限制了受潜在缓解措施影响的程序数量,主要是以管理员或SYSTEM权限运行的Windows服务。在多用户机器上以其他用户身份运行的程序也可能有些兴趣。
符合这些条件的程序可能容易受到其他不利用连接点的文件系统攻击类型的影响。例如:
- 一个天真的服务可能接受一个文件的完整路径,然后删除它,不需要任何重定向。在这种情况下,对连接点的任何更改都不会缓解漏洞。
- 服务可能具有相对路径遍历漏洞,允许攻击者将文件操作重定向到驱动器上的任何位置。
- 如果服务正在模拟被入侵用户,该用户可以更改其设备映射以重定向文件操作。
2024年,MSRC发布了42个路径重定向漏洞的CVE。在这些案例中,只有10/42涉及攻击者完全控制文件路径、可以利用相对路径遍历或服务模拟被入侵用户的场景,使它们总体上占少数。其余32个案例依赖攻击者创建的连接点来利用服务。鉴于这种细分,将缓解措施范围限定为仅针对攻击者尚未通过其他方式任意控制文件操作目标的情况是合理的。
威胁模型
总结威胁模型,缓解措施假设攻击者具有以下权限和访问权限:
- 攻击者已入侵本地标准用户(非管理员)帐户,并可以根据该帐户的权限在系统上自由操作。
- 攻击者可以触发在特权(管理员)安全上下文或其他用户上下文中运行的更特权进程中的文件系统操作。
- 操作可以是任何类型,并且可以针对路径触发任意次数。路径可以受攻击者影响,但他们不能控制必须指向NTFS卷的起始元素。
上述攻击者在利用后通常具有以下目标:
- 权限提升:在特权进程的上下文中执行任意代码。这可以通过篡改系统代码/脚本文件或代码/命令注入来实现。
- 信息泄露:在没有权限访问这些文件的情况下泄露文件内容。
- 拒绝服务:通过在没有权限访问文件的情况下删除或篡改文件来导致信息丢失或系统损坏。
超出范围
缓解措施无法防止不依赖连接点或访问远程路径的漏洞利用,因此对攻击场景施加以下限制:
- 路径的起始不受攻击者控制,且
- 路径的起始指向文件系统命名空间内的元素,且
- 攻击者无法进行路径遍历,且
- 文件系统不受攻击者控制或以其他方式受损(即攻击者无法修改原始NTFS卷),且
- 操作不在被入侵帐户的安全模拟下进行。
引入RedirectionGuard
为了缓解定义威胁模型内的文件重定向漏洞,RedirectionGuard(一种新的连接点缓解措施)必须在攻击者试图恶意重定向文件操作时阻止连接点遍历。然而,它还必须通过允许尽可能多的安全连接点遍历来最小化回归。
因此,仅当满足以下两个条件时,才会阻止连接点遍历:
- 连接点正在由已选择加入RedirectionGuard缓解措施的进程跟随,且
- 连接点是由非管理员用户帐户创建的。
当连接点被创建或修改时,创建者/修改者的权限级别存储在文件的仅管理员备用数据流中。当RedirectionGuard被进程启用时,该进程将仅跟随“受信任”的连接点,这些连接点是以下之一:
- 由管理员创建,或
- 不包含权限元数据(表示连接点最后修改于缓解措施可用之前)。
这种设计缓解了定义威胁模型内的所有连接点文件重定向漏洞。回想一下之前服务删除某些攻击者控制的临时目录中所有文件的例子。以前,服务必须仔细检查文件路径上的所有文件夹是否有任何形式的重定向。这些检查必须在每个文件操作周围执行,花费大量开发时间,减慢程序速度,并增加代码大小。攻击者重定向文件操作的唯一方式是通过连接点,因此启用缓解措施后,攻击者创建的任何连接点将被标记为不受信任,并导致文件操作失败。通过简单地添加几行代码来启用缓解措施,开发者可以保护其程序中的所有文件操作免受路径重定向错误的影响。
启用RedirectionGuard
如前所述,许多进程不会从启用此缓解措施中受益,因为它们要么不以提升的权限运行,要么不以可 exploited 的方式与文件系统交互。为了避免潜在的兼容性问题,缓解措施是选择加入的。重点是首先在具有文件系统重定向漏洞历史的组件中启用缓解措施。用户配置文件服务、AppX部署服务和安装程序服务(路径重定向CVE的三大来源)已在Windows Insider版本中启用了缓解措施。
为程序启用缓解措施的最简单方法是通过代码使用SetProcessMitigationPolicy API。它可以在审计模式下启用以在事件日志中记录违规,或在强制执行模式下启用以阻止连接点遍历。以下是程序可能如何执行此操作的示例:
|
|
出于测试和研究目的,可以使用James Forshaw的NtObjectManager PowerShell模块查看进程是否启用了缓解措施。例如,要检查运行中进程PID 1496启用的所有缓解措施,请使用命令:
|
|
此命令可以在没有任何进程ID的情况下运行,以列出所有当前运行进程的缓解措施。
漏洞赏金
RedirectionGuard是我们的Windows Insider Preview赏金计划的一部分,以及通用路径重定向漏洞。RedirectionGuard绕过是在威胁模型范围内,尽管启用了缓解措施仍可 exploited 的路径重定向漏洞。如果您认为找到了路径重定向漏洞或RedirectionGuard绕过,请编写带有概念验证的报告,并通过我们的MSRC研究员门户提交。
结论
RedirectionGuard是许多Windows服务依赖的缓解措施,用于防止路径重定向漏洞。随着每个新版本的发布,更多服务正在启用它,关闭了曾经是Windows MSRC案例第二常见来源的攻击向量。
致谢
特别感谢Georgios Baltas对缓解措施开发的先前贡献,以及James Forshaw在开发过程中提供反馈和NtObjectManager PowerShell模块。