CS.SV.TAINTED.FMTSTR

未经验证的输入 — 不受信任的数据被用作格式字符串。

此检查器会检测并标记将外部输入控制的数据用作格式字符串的实例。支持自定义格式字符串的 .NET 库期望这些实例遵守某些模式。无效的格式字符串可能会引发 FormatException 或以不同的方式改变程序行为。

漏洞与风险

当代码输入未经妥善验证时,攻击者可以精心地将输入编制为并非应用程序所预期的格式。接收意外的输入可能会导致控制流改变、任意的资源控制以及任意的代码执行。通过此类机会,攻击者可以
  • 提供无法预料的值并导致程序崩溃
  • 导致过度的资源消耗
  • 读取机密数据
  • 使用恶意输入来修改数据或改变控制流
  • 执行任意命令

缓解与预防

要避免受污染输入错误

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

漏洞代码示例 1

复制
   namespace CS.SV.TAINTED.FMTSTR
   {
       class Program
       {
           static void Main(string[] args)
           {
               string fmtStr = Console.ReadLine();
               int num = 10;
               Console.WriteLine(fmtStr, num); 
          }
      }
  }

在以上示例中,格式字符串读取自用户输入,因此是恶意输入的主体。Klocwork 将此漏洞报告为 CS.SV.TAINTED.FMTSTR 缺陷,表明在第 7 行通过调用 ReadLine 从外部函数获得的未经验证字符串 fmtStr 可能在第 9 行通过调用 WriteLine 而被用作格式字符串。这可能会导致字符串缓冲区中的缓冲区溢出,进而导致来自用户输入的任意代码执行。检查格式字符串运算中使用的字符串的长度和内容。

漏洞代码示例 2

复制
   namespace CS.SV.TAINTED.FMTSTR
   {
       class Program
       {
           static void Main(string[] args)
           {
               int res = 4;
               Console.Write(args[1], res); 
           }
      }
  }

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

安全培训

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