ABV.ITERATOR
バッファオーバーフロー - 反復で配列インデックスが範囲外
ABV.ITERATOR は、配列と反復のポインターを使用して、範囲外の配列要素へのアクセスをチェックします。このチェッカーは、この状況の結果としてバッファオーバーフローが発生する可能性のあるどのコードにもフラグを立てます。
脆弱性とリスク
バッファオーバーフローの結果には、有効なデータの上書きや、恣意的なコードや潜在的に悪意のあるコードの実行なども含まれます。
脆弱コード例 1
コピー
int example1()
{
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int *p;
for (p = a ; p < a + 10; p++)
{
if (bar(*p) < 5)
break;
}
return *p; // ABV.ITERATOR
}
Klocwork は 10 行目について、ポインター 'p' の値が配列 'a' の範囲を超える可能性を指摘する、バッファオーバーフローレポートを生成します。ポインター 'p' は 'a' に割り当てられ、5 行目で反復されています。この場合は反復により配列 'a' がその上限 10 を超える可能性があります。
修正コード例 1
コピー
int example1()
{
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int *p;
for (p = a ; p < a + 10; p++)
{
if (bar(*p) < 5)
break;
}
if (p < a + 10)
return *p;
return 0;
}
修正コード例では、10 行目で配列 'a' がオーバーフローしないことを確認するチェックが行われます。
脆弱コード例 2
コピー
int example2(int x)
{
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int *p = bar (a, x); //function returns a pointer to some element in "a"
if (p < a + 5)
return *p;
return p[5]; // DEFECT: p[5] points to a[11] or beyond
}
Klocwork は 8 行目について、配列 'a' が反復後にオーバーフローすることを指摘する、ABV.ITERATOR レポートを生成します。
修正コード例 2
コピー
int example2(int x)
{
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int *p = bar (a, x); //function returns a pointer to some element in "a"
if (p >= a + 5)
return *p;
return p[5];
}
修正コード例では、5 行目の構文が修正され、バッファオーバーフローが防止されています。
関連チェッカー
外部参考資料
- CERT ARR00-C: 配列の仕組みを理解する
- CERT ENV01-C: 環境変数のサイズについて仮定を行わない
- CERT EXP08-C: ポインター算術が適切に使用されていることを確認する
- CWE-119: メモリバッファの範囲内の操作の不適切な制限
- CWE-120: 入力サイズのチェックをしないバッファコピー ('古典的バッファオーバーフロー')
- CWE-124: バッファアンダーライト ('バッファアンダーフロー')
- CWE-125: 範囲外の読み取り
- CWE-787: 範囲外の作成
- CWE-805: 不正確な長さの値でのバッファアクセス
- CWE-806: ソースバッファのサイズを使用したバッファアクセス
- STIG-ID:APP3590.1 バッファオーバーフローに脆弱なアプリケーション
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。
拡張機能
このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。