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 行目で指摘レポートを生成し、未検証の整数値 'num' が 11 行目での 'scanf' の呼び出しを通じて渡され、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);
}
修正された例では、整数値 'num' が 13 行目でチェックされてから、反復が行われます。