CS.UNSAFE.SEARCH_PATH

使用搜索路径解析绝对路径

当应用程序使用外部提供的搜索路径(通常使用搜索路径变量)搜索关键资源时,该路径可能指向不受应用程序直接控制的资源。这可能让攻击者执行自己的程序,访问未授权的数据文件,或以预期以外的方式修改配置。如果应用程序使用搜索路径来查找关键资源(例如程序),则攻击者可以修改该搜索路径以指向恶意程序,从而导致目标应用程序执行恶意程序。

CS.UNSAFE.SEARCH_PATH 检查器会标记其中的硬编码相对路径被分配给变量的代码,而该变量可以用作参数以供例程调用外部进程。

漏洞与风险

如果攻击者可以修改 $PATH 变量以指向恶意二进制文件并导致程序在其环境中执行,那么加载的内容会变成恶意二进制文件,而非预期文件。然后,此恶意二进制文件将以程序的权限运行,这会让攻击者有机会完全控制系统。最常见的不受信任搜索路径变体如下:

  • 在各种基于 UNIX 和 Linux 的系统中,可以通过查询 PATH 环境变量来查找可执行程序,并且可以使用 LD_PRELOAD 来查找单独的库。
  • 在各种基于 Microsoft 的系统中,如果在搜索顺序中较早出现的其他路径中找不到 DLL、可执行文件、目录等,可以通过查询 PATH 环境变量来查找这些内容。

通过此类机会,攻击者可以:

  • 提供无法预料的值并导致程序崩溃
  • 导致过度的资源消耗
  • 读取机密数据
  • 使用恶意输入来修改数据或改变控制流
  • 执行任意命令
  • 运行攻击者可能想运行的任何进程

缓解与预防

尽可能避免在应用程序中使用相对路径。此外,还建议在将原始输入用作路径名之前添加验证代码。验证代码必须包含针对下列项的检查:

  • 点-点-斜杠 (../):通过使用此序列及其变体,攻击者可浏览您的文件系统并获得任何文件的访问权限。请注意,(../) 可出现在不同的编码中,例如“ ../../../etc/shadow”。
  • 绝对路径:在预计相对路径也可能提供对系统中任意文件访问权限的情况下,使用绝对路径,例如“/etc/shadow”。
  • 空符号:在应用程序通过检查或附加特定扩展名限制可能的文件扩展名时,如果使用空符号,则可能让攻击者有机会截断所生成的文件名,从而扩大攻击范围,例如 application.cfg%00.pdf。

漏洞代码示例

复制
   using System.IO;
   namespace Example
   {
       System.Diagnostics.Process ExternalProcess = new System.Diagnostics.Process();
       ExternalProcess.StartInfo.FileName = "dir"; // Because the path is relative, the PATH environment variable will be used to resolve full path.
       ExternalProcess.StartInfo.Arguments = secretDirectoryPath;
       ExternalProcess.Start();
       ExternalProcess.WaitForExit();
   }

在此示例中,Klocwork 在第 8 行报告缺陷,其中在我们尝试启动的进程中,其 FileName 属性包含硬编码相对路径。在这种情况下,使用可能不安全的文件启动进程时,可能导致进程遭到恶意用户利用。

修正代码示例

复制
   using System.IO;
    
   namespace Example
   {
       System.Diagnostics.Process ExternalProcess = new System.Diagnostics.Process();
       ExternalProcess.StartInfo.FileName = "C:\\absolute_path\\filename.dat";
       ExternalProcess.StartInfo.Arguments = secretDirectoryPath;
       ExternalProcess.Start();
       ExternalProcess.WaitForExit();
  }

在此修正代码示例中,Klocwork 未在第 8 行报告问题,因为已为 FileName 分配了一个绝对路径,系统无需解析该路径。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。