SV.DLLPRELOAD.NONABSOLUTE.DLL

潜在的 DLL 预加载劫持载体

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

DLLPRELOAD.NONABSOLUTE.DLL 检查器会标记出相关的代码实例,在这些实例中,将 LoadLibrary 和 LoadLibraryEx 调用至 .dll 文件的系统文件操纵函数缺少路径名,或路径名为空。

漏洞与风险

攻击者可以使用相对路径名绕过安全机制,从而读取、修改或覆盖关键文件。如果不使用完全限定的路径,应用程序可以加载非预期的 DLL。攻击者可以利用该漏洞获取用户权限、提升自身的权限,甚至控制系统。

缓解与预防

要避免相对路径问题:

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

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

漏洞代码示例

复制
  HINSTANCE myLoadLibraryX() {
      return LoadLibrary("X.dll"); 
  }

Klocwork 针对第 2 行生成问题报告,说明在不使用完全限定的路径的情况下,调用 LoadLibrary 可能导致应用程序从任意位置加载 DLL。任何对使用相对路径名或空路径名的文件操纵函数的调用,都可能产生不可预知的、可能导致危险状况的响应。

修正代码示例

复制
  HINSTANCE myLoadLibraryX() {
      return LoadLibrary("C:\\myapp\\X.dll"); 
  }

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