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'に任意の値を提供できます。この値は、その後、プログラマーが制御できないか、あるいは認識すらしていないコード内の別の場所で使用される可能性があります。結果として、その変数に関係したセキュリティ脆弱性のリスクが発生する可能性があります。

Klocwork が、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 は欠陥を報告しません。