EN JP CN

SV.TAINTED.LOOP_BOUND

SV.TAINTED.LOOP_BOUND

ループ境界として使用される未検証の入力

入力がユーザーまたは外部環境から受け入れられるときは常に、入力のタイプ、長さ、書式、および範囲を検証してから使用する必要があります。適切に検証されるまでは、そのデータは 汚染 していると言われます。SV.TAINTED ファミリーチェッカーは、コードでの汚染データの使用箇所を探します。

未検証引数がループ境界として使用されると、SV.TAINTED.LOOP_BOUND エラーが報告されます。

脆弱性とリスク

コードへの入力が適切に検証されないと、攻撃者は入力をアプリケーションが予期しない形で作成することができます。意図しない入力を受け取ると、制御フローの改変、任意リソースの制御、および任意のコードの実行につながる可能性があります。この種のチャンスがある場合、攻撃者は次のことを行えます。

  • 予期しない値を提供し、プログラムクラッシュを引き起こします。
  • 過剰なリソース消費を引き起こします。
  • 機密データを読み取ります。
  • 悪意のある入力を使用して、データを書き換えたり制御フローを変えたりします。
  • 任意のコマンドを実行します。

脆弱コード例

1  void iterateFoo()
2   {
3     unsigned num;
4     int i;
5     scanf("%u",&num);
6     for (i = 0; i < num; i++){
7       foo();
8     }
9    }

Klocwork は 6 行目で指摘レポートを生成し、未検証の整数値 'num' が 5 行目での 'scanf' の呼び出しを通じて渡され、6 行目でのループ条件に使用できることを示します。この場合、汚染されている可能性のあるデータがループ境界として使用されます。 これは、悪意のあるユーザーによって悪用される可能性があります。

修正コード例

1  void iterateFoo()
2   {
3     unsigned num;
4     int i;
5     scanf("%u",&num);
6     if (num > 20) return;
7     for (i = 0; i < num; i++){
8       foo();
9     }
10   }

修正コードでは、整数 'num' が 6 行目でチェックされてから、ループ条件として使用されます。