SV.TAINTED.CALL.LOOP_BOUND

通过函数调用将未经验证的输入用作循环边界

每当从用户或外部环境接受输入的时候,都应该在使用前验证类型、长度、格式和范围。在得到妥善验证之前,数据将被视为已被污染。SV.TAINTED 系列检查器会查找代码中使用已污染数据的情况。

当循环变量被作为参数传递给其他函数并用作循环边界时,将报告 SV.TAINTED.CALL.LOOP_BOUND 错误。

漏洞与风险

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

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

漏洞代码示例

复制
  void iterate(int n){
     int i;
     for (i = 0; i < n; i++){
       foo();
     }
  
   }
   void iterateFoo()
   {
    unsigned num;
    scanf("%u",&num);
 
    iterate(num);
   }

Klocwork 针对第 13 行生成问题报告,指出在第 11 行通过调用 scanf 所接收的、未经验证的整数值 num 可能在第 13 行通过调用 iterate 用于循环条件。在这种情况下,SV.TAINTED.CALL.LOOP_BOUND 检查器查找那些使用传递给其他函数的可能被污染的数据作为循环边界的代码。

修正代码示例

复制
  void iterate(int n){
     int i;
     for (i = 0; i < n; i++){
       foo();
     }
  
   }
   void iterateFoo()
   {
    unsigned num;
    scanf("%u",&num);
 
    if (num < 100) iterate(num);
   }

在此修正代码示例中,在迭代前于第 13 行对整数值 num 进行检查。