CS.UNSAFE.DLLPRELOAD

潜在的 DLL 预加载劫持载体

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

CS.UNSAFE.DLLPRELOAD 检查器会标记其中使用的绝对路径名称未带 DllImport 属性的代码实例。

漏洞与风险

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

缓解与预防

要避免相对路径问题:
  • 尽可能使用完全限定的路径名称,确保安全地加载外部库。
  • 在难以访问的单独目录中存储库文件、包含文件和实用工具文件。
  • 确保错误消息不会泄露路径信息。

漏洞代码示例

复制
   using System;
   using System.Text;
   using System.Runtime.InteropServices;
   
   namespace CS.UNSAFE.PRELOAD
   {
       class Program
       {
           [DllImport("CoreDLL.dll")];
          public static extern void SimulateGameDLL(int a, int b);
      }
  }

在此示例中,DllImport 路径不是绝对路径,因此容易受恶意输入影响。Klocwork 在第 10 行将此问题报告为 CS.UNSAFE.DLLPRELOAD 缺陷。

修正代码示例

复制
   using System;
   using System.Text;
   using System.Runtime.InteropServices;
   
   namespace CS.UNSAFE.PRELOAD
   {
       class Program
       {
           [DllImport("C:\\space\\user32.dll", CharSet = CharSet.Unicode)]
          public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
      }
  }

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

相关检查器

安全培训

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