SV.DLLPRELOAD.NONABSOLUTE.EXE

潜在的 DLL 预加载进程注入载体

应用程序加载外部库时,代码应该使用完全限定的路径,这一点很重要。如果指定了不完全限定的路径,则恶意攻击者就可以控制搜索路径,并且将其用作远程执行任意代码的载体。此类威胁称为二进制植入或 DLL 预加载攻击。

DLLPRELOAD.NONABSOLUTE.EXE 检查器会标记出相关的代码实例,在这些实例中,将 CreateProcess、WinExec、LoadModule、_exec*、_wexec*、_spawn*、_wspawn* 和 ShellExecute 调用至 .exe 文件的系统文件操纵函数中使用了相对路径名。

漏洞与风险

攻击者可以使用相对路径名绕过安全机制,从而读取、修改或覆盖关键文件。例如,恶意用户可以在密码文件的末尾添加新帐户以规避身份验证,或者读取密码文件以侵入系统中的帐户。在最坏的情况下,用户不能访问系统、软件可能无法运行,或者可以执行未授权的命令或代码。

如果不使用完全限定的路径,应用程序可以加载非预期的可执行文件。攻击者可以利用该漏洞在用户的计算机上注入并运行恶意的可执行代码。

缓解与预防

要避免相对路径问题:

  • 尽可能使用完全限定的路径名,确保安全加载外部库
  • 在代码中包括内置路径规范函数,例如 realpath() 或 canonicalize_file_name()
  • 在难以访问的单独路径中存储库文件、包含文件和实用工具文件
  • 确保错误消息不会泄露路径信息

有关缓解与预防 DLL 预加载攻击的更多建议,请参阅 Microsoft 的动态链接库安全性文章。

漏洞代码示例

复制
  BOOL createChild() {
      return CreateProcess("child.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL); 
  }

Klocwork 针对第 2 行生成问题报告,说明在不使用完全限定的路径的情况下,调用 CreateProcess 可能导致应用程序从任意位置加载 .exe 文件。任何对使用相对路径名的文件操纵函数的调用,都可能产生不可预知的、可能导致危险状况的响应。路径中诸如父目录快捷方式 (..) 和文件名分隔符 (/) 之类的特殊元素可以使路径成为远程执行任意代码的载体。

修正代码示例

复制
  BOOL createChild() {
      return CreateProcess("C:\\MyApp\\child.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);  
  }

在经修正的代码示例中,提供了完全限定的路径,消除了恶意访问的可能性。