CS.SV.TAINTED.DLLPRELOAD

未经验证的输入 — 使用了不受信任的数据来加载 DLL

如果程序使用外部输入来加载 DLL,该程序可能会遭遇 DLL 加载攻击。如果使用外部(及不受信任的)字符串加载 DLL,此检查器就会报告缺陷。

漏洞与风险

当代码输入未经妥善验证时,攻击者可以精心地将输入编制为并非应用程序所预期的格式。接收意外的输入可能导致控制流被改变、任意的资源控制以及任意的代码执行。通过此类机会,攻击者可以

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

缓解与预防

要避免受污染输入错误:

  • 了解所有可能导致不受信任的输入进入软件的区域:参数或自变量、Cookie、读取自网络的输入、环境变量、反向 DNS 查找、查询结果、文件名、数据库以及任何外部系统
  • 使用白名单或“已知正确”策略进行输入,而不是仅依赖于黑名单或“已知错误”策略
  • 确保对输入的所有相关属性进行验证,包括长度、输入类型、范围、缺失或额外输入、语法以及一致性
  • 如果在应用程序的客户端一侧有安全性检查,请确保也在服务器端重复一遍
  • 如果应用程序组合来自多个来源的输入,请在组合来源之后再执行验证

漏洞代码示例 1

复制
   using System;
   using System.Reflection;
   
   namespace CS.SV.TAINTED.DLLPRELOAD
   {
       class Program
       {
           static void Main(string[] args)
           {
              string fullName = args[1];
              Assembly SampleAssembly2 = Assembly.ReflectionOnlyLoadFrom(fullName);
          }
      }
  }

在此示例中,字符串是从命令行参数中获取的,因此也易受恶意输入的影响。Klocwork 在第 11 行将此问题报告为 CS.SV.TAINTED.DLLPRELOAD 缺陷。

漏洞代码示例 2

复制
   using System;
   using System.Reflection;
   
   namespace CS.SV.TAINTED.DLLPRELOAD
   {
       class Program
       {
           static void Main(string[] args)
           {
              string fullName = Console.ReadLine();
              Assembly SampleAssembly = Assembly.LoadFile(fullName);
          }
      }
  }

在此示例中,字符串是从用户获取的,因此也易受恶意输入的影响。Klocwork 在第 11 行将此问题报告为 CS.SV.TAINTED.DLLPRELOAD 缺陷。

安全培训

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