SV.TAINTED.CALL.GLOBAL

在赋值运算中使用未经验证的整数

但凡使用被污染的数据通过函数调用来分配全局变量,此检查器便会报告缺陷。

漏洞与风险

全局变量在整个程序范围中可见。程序员或分析工具可能难以完全控制其在程序中的分配或读取。降低全局变量对程序控制流的影响的了解,可能会在代码的整数数据输入未经适当验证并用于分配全局变量时引入安全风险。

漏洞代码示例

复制
   #define MAX  10
   int gVar = 0;
   int getTaintedData()
   {
      int i;
      scanf(%d” , &i);
      return i;
   }
   void foo() 
  {
    int t = getTaintedData();
    bar(t);
  }
  void bar() 
  {
    gVar = t;
  }

在以上示例中,攻击者可为全局变量“gVar”提供任意值,该值随后可能被用于代码中程序员无法控制甚至未意识到的其他位置。这样可能会引入涉及该变量的安全漏洞的风险。

Klockwork 在第 12 行报告 SV.TAINTED.GLOBAL 缺陷,指出:“第 11 行中接收自 getTaintedData 的未经验证的整数值 t 被用来通过第 12 行中的调用 bar() 分配全局变量”。

修正代码示例

复制
   #define MAX  10
   int gVar = 0;
   int getTaintedData()
   {
       int i;
       scanf(%d” , &i);
       return i;
   }
   void foo() 
  {
      int t = getTaintedData();
      If (t < MAX) {
          // value validated
          bar(t);
      }
  }
  void bar() 
  {
      gVar = t;
  }

在此示例中,由于整数值“t”经过验证,Klocwork 不再报告缺陷。