从一个隐藏18年的漏洞谈起
现代操作系统,如Windows和MacOS,实现了安全边界,以分离不同信任级别的代码和数据。这些边界是隔离敏感数据和高级权限执行环境的基本保护机制。然而,这些安全边界很容易被文件劫持漏洞突破。文件劫持漏洞代表了一种安全漏洞,攻击者可以通过操作文件来违反安全边界,包括文件路径和内容,它们可能导致严重的安全问题,如任意代码执行、权限提升和数据丢失。
下图描述了官方Git客户端中文件劫持漏洞(CVE-2022-24765)的示例,这是由于对文件路径的处理不当,导致任意命令执行。自Git项目启动以来,这个漏洞已经存在了18年,并且可以在所有主流操作系统中加以利用,包括Windows、Linux和MacOS。为了说明利用这个漏洞,让我们假设Bob是攻击者,而Alice是受害者。
- Bob创建了C:\.git\目录,他可以在其中修改该目录中的任何内容。请注意,Bob没有权利修改以下目录: C:\Users\Alice\和C:\Users\。但是,Authenticated Users组中的任何人都可以在路径C:\下创建目录。
- Alice调用Git命令,例如Git登录到她的主目录中(C:\Users\Alice\)。
- 如果在调用目录C:\Users\Alice\中没有存在.git\目录,则Git客户端将在其父目录中递归地搜索.git\。在这种情况下,Git客户端将找到由Bob创建的C:\.git\目录,并将其视为Git主目录。
- Bob可以将githooks(git钩子是可以放在hook目录中的程序,用于在git执行的特定时刻触发操作)放在目录C:\.git\,这将由Git客户端执行。因此,Bob可以欺骗Alice执行任意命令。
攻击者如何利用文件劫持漏洞
为了利用文件劫持漏洞,必须满足两个必要条件:
- 攻击者必须能够劫持某些文件或目录;
- 易受攻击的软件必须通过敏感操作与被劫持的文件或目录交互。
被劫持文件的来源
大多数被劫持的文件是由于程序和底层操作系统所采用的5种搜索策略引发的结果,而其余的则来自于权限较弱的程序所创建的文件。
当没有提供绝对文件路径时,操作系统或程序通常会使用不同的文件搜索策略来定位目标文件。通常,这些搜索策略可能会返回权限的目录,这允许攻击者植入恶意文件。以下涵盖的5种搜索策略都有可能会返回具有弱权限的目录。
- 路径搜索顺序。在Windows系统中,当执行命令时,系统首先尝试在当前工作目录(CWD)中找到被调用的可执行文件,然后搜索PATH环境变量中定义的路径。当CWD的权限较弱时,该策略会造成安全风险。以Github Cli中的一个漏洞为例。当执行命令gh时,CLI客户端将尝试在CWD中找到可执行文件git.exe。一旦CWD(例如,C:\ProgramData)具有弱权限,攻击者就可以在该目录中放置一个恶意的可执行文件git.exe。
- Windows上的Linux路径。跨系统迁移是软件开发中常见的一种做法。当Windows系统上不存在Linux路径时,系统会从C:\目录下进行搜索。由于C:\在默认情况下是可写的,因此这允许攻击者轻松地植入恶意文件。以CVE-2019-5443为例。程序curl读取默认的配置文件/usr/local/ssl/openssl.cnf。在Windows上,该文件不存在,系统会搜索配置文件C:\usr\local\ssl\openssl.cnf。由于路径C:\具有较弱的权限,因此攻击者可以很容易地劫持该文件并控制引擎配置,从而导致任意的代码执行。
- 未加引号的路径。未加引号的路径是指未用引号括起来的文件路径。当未加引号的路径包含空格或特殊字符时,Windows系统会截断该路径,并使用被截断的路径搜索该文件。例如,在CVE-2020-13884中,Citrix工作空间程序调用CreateProcess API来执行文件TrolleyExpress.exe(其路径为C:\ProgramData\ Citrix\Citrix Workspace 1911\TrolleyExpress.exe) 。因此,Windows系统用空格截断路径,并使用路径C:\ProgramData\Citrix\Citrix.exe搜索文件,实际上加载的文件是Citrix.exe而不是TrolleyExpress.exe。由于路径C:\ProgramData\Citrix\Citrix具有弱权限,攻击者可能会劫持Citrix.exe,从而导致权限提升。
- 符号链接。符号链接(也称为软链接)是计算机文件系统中的一种文件类型,它作为指向另一个文件或目录的引用或指针。当访问符号链接时,操作系统会按照该链接来定位目标文件或目录。CVE-2022-39845就是这样一个例子,它导致任意目录删除。具体来说,Samsung Kies(三星官方提供的可将手机与电脑连接的一款PC套件工具)的卸载程序试图删除一个不存在的目录C:\ProgramData\Samsung \DeviceProfile\Cache。由于攻击者可以拥有对C:\ProgramData\Samsung的写权限,攻击者可以创建符号链接C:\ProgramData\Samsung\DeviceProfile\Cache,用于指向任意目录(例如C:\)。因此,卸载程序将删除C:\中的所有文件。
- 动态加载的库。比如Windows上的动态链接库(DLL)文件和Linux上的共享对象(SO)文件。当在Windows中加载DLL时,系统会按以下顺序搜索目标DLL:当前工作目录、system目录、windows目录和PATH环境变量中声明的目录。另一方面,当Linux中的可执行文件加载SO文件时,系统首先在可执行文件的DT_RPATH和DT_RUNPATH部分中声明的目录下搜索已加载的文件。如果搜索失败,则系统将搜索在环境变量LD_LIBRARY_PATH和配置文件/etc/ld.so中声明的目录。在搜索动态库的过程中,操作系统会在搜索到的目录中查找这些库。但是,如果在此搜索过程中遇到权限较弱的目录,它可能会允许攻击者劫持要加载的动态库。
敏感操作
最有可能被攻击者利用的6种操作:移动、创建、删除、读取、进程创建和镜像加载。
- 移动、创建和删除。如CVE-2022-39845所述,这三种类型的操作是危险的。对被劫持的符号链接的操作会导致数据丢失和文件完整性的破坏。
- 读取。程序通常从配置文件中读取不同的设置,这些配置文件会受到文件劫持攻击。例如,攻击者可能会篡改配置文件中的数据库连接字符串,从而可以将后续查询重定向到恶意数据库。或者,攻击者也可以在配置文件中插入有害的文件路径,从而欺骗程序以执行恶意代码。
- 进程创建。进程创建涉及创建一个新的进程来执行文件,如果文件被劫持,可能会导致任意代码执行。例如,在安装过程中,程序可以首先从互联网上下载安装文件,然后启动下载的文件来启动安装过程。劫持下载的文件可能会欺骗程序执行任意命令。
-
镜像加载。镜像加载是指分别在Windows和Linux上加载动态加载的库,即DLL和SO文件。被劫持的库可能会导致任意的代码的执行。
为什么Windows中文件劫持漏洞更多
Windows具有更多弱权限的现有目录。在类Unix的系统中,只有/tmp目录是全局可写的。它的目的是容纳只需要很短时间的数据,例如由系统上运行的程序生成的临时文件。在Windows系统中,除了类似于/tmp的目录C:\Windows\Temp之外,还有另外两个目录的弱权限导致文件劫持漏洞,即, C:\ProgramData和C:\root目录。虽然, C:\ProgramData被设计用于存储共享的程序数据和配置文件,但一些软件程序可能会错误地在此目录中存储敏感的配置文件和可执行文件。这可能会增加文件劫持漏洞发生的风险。此外,由于历史原因[4],[82],C:\root目录的权限较弱。这导致了许多劫持问题。当在C:\中创建新的文件夹时,它们就继承了C:\的权限,并成为全局可写的,这进一步加剧了安全风险。
Windows具有更多弱权限的搜索目录。许多搜索策略,如自底向上的搜索策略、路径搜索顺序、符号链接和动态加载的库,都适用于类Unix系统和Windows系统。然而,与Windows相比,这些策略在类Unix系统中的文件劫持漏洞相对较少。其中一个原因是,在Windows中,当搜索可执行文件时,操作系统会查看当前工作目录以及在PATH环境变量中指定的目录。相比之下,类Unix系统仅将其搜索限制在PATH变量列出的目录中。就符号链接而言,Windows有一个特殊的目录链接,称为连接点,它在创建过程中不进行严格的权限检查。此特性在类Unix系统中不存在。此外,Windows在软件程序目录和当前工作目录中搜索动态加载的库(dll),而类Unix的系统不搜索。这些差异意味着,与类Unix系统相比,与搜索相关的漏洞在Windows中有更大的攻击面。
为什么文件劫持漏洞仍然广泛存在
首先,开发人员并没有考虑到多用户的场景,甚至有些开发人员认为他们开发的软件是针对单用户的。
其次,开发人员缺乏对api的安全使用。该操作系统为开发人员提供了许多安全的API选项。例如,在LoadLibraryEx API 中,参数LOAD_LIBRARY_SEARCH可以指定搜索优先级,以避免在目标dll之前加载恶意dll。然而,在实际开发中,开发人员可能不会有意使用这些参数。
最后,开发者缺乏安全责任。一些开发人员认为权限较弱的文件是由于用户使用不当而引入的,而软件本身并不需要加强防御。
此外,目前还没有有效的文件劫持漏洞检测工具,可以涵盖每个检测面。
如何防御和减轻文件劫持漏洞
针对软件开发人员提出了如下建议:
- 避免使用具有弱权限的内置目录。软件开发人员应该将敏感文件放置到具有严格权限的路径(即C:\Program Files)或公共路径(即C:\ProgramData),同时主动为敏感文件设置正确的权限。例如,大多数公共配置文件,如rubygem的系统配置都被放置在C:\ProgramData等公共路径中,以确保所有用户都可以评估和共享它们。因此,在安装过程中,软件应该创建一个新的配置文件,并为其分配高级权限。
- 更正API用法。有必要仔细阅读API文档,以确保它们正确地使用了API及其参数。由动态加载库搜索策略产生的大多数文件劫持漏洞可以归因于当前工作目录。因此,建议开发人员使用LoadLibraryEx而不是LoadLibraryA,并通过配置LOAD_LIBRARY_SEARCH标志来管理搜索策略,以防止在搜索路径中包含当前工作目录。(dll搜索顺序)此外,在执行创建或删除文件等敏感操作时,主动设置相关参数以防止符号链接解析问题至关重要。比如,函数CreateFileA需要添加FILE_FLAG_OPEN_REPARSE_POINT参数。
- 谨慎地设计软件定制的搜索策略。软件定制的搜索策略可能会导致各种文件劫持漏洞。因此,开发人员需要谨慎地设计搜索策略,并考虑到多个用户场景。
- 在使用前检查文件状态。开发人员应该通过检查它们的所有权来验证敏感文件是否被劫持了。如果文件的所有者与用户的所有者不同,软件应该终止其操作或提示用户确认他们是否希望继续处理潜在的“被劫持”的敏感文件。
对系统管理员的建议如下:
- 系统管理员可以通过使用自定义安装模式和将软件安装在具有高权限的目录中来确保双重安全性。此外,我们发现根目录C:\的各种直接子目录,在初始系统中并不存在,由于初始化期间Windows 系统的权限设置过于宽松,容易被劫持。
- 建议系统管理员从C:\目录中删除Authenticated Users 组的写入权限。这样可以显著降低路径劫持的可能性,同时其副作用最小。
最后,软件用户在使用软件时意识到安全风险并遵循安全实践也是至关重要的。特别是,用户应该避免在权限较弱的路径上启动软件程序,如C:\ProgramData\。此外,在使用公开可写路径中的软件之前,用户需要检查任何可疑的文件。例如,当用户使用公开可写的路径从互联网下载的软件时,用户应该通过检查校验和来验证其完整性。
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)