ABV.STACK
バッファオーバーフロー - ローカル配列インデックスが範囲外
ABV.STACK は、呼び出された関数内部でのバッファオーバーフローを検出するプロシージャ間チェッカーです。関数に渡される引数は、バッファのどの要素がアクセスされるかを制御します。このチェッカーは、通常は関数内のローカル変数か、またはグローバル変数であるバッファが関数に渡されないときの欠陥を検出します。
脆弱性とリスク
範囲外のローカル配列へのインデックス付けは、アプリケーションの不安定性、注意深く練られた攻撃、データ開示脆弱性、コード挿入、その他の脆弱性につながることがあります。
脆弱コード例
コピー
void foobar(int x)
{
int local_array[7];
local_array[x] = 0;
}
int main() {
foobar(15);
return 0;
}
この例では、関数 'foobar' は 'local_array' へアクセスするインデックスで使用される値を取得します。Klocwork は 8 行目で、呼び出しメソッド 'foobar' がパラメーター 15 のため有効な値 (0 ~ 7) を超えていることを示す指摘レポートを生成します。この場合は、関数 'foobar' 内部で見つかったバッファ内の欠陥を検出しました。
修正コード例
コピー
void foobar(int x)
{
int local_array[7];
// verify the parameter is in range
if (x >= 0 && x < 7)
{
local_array[x] = 0;
}
}
int main() {
foobar(15);
return 0;
}
修正コード例では、ローカル配列 'local_array' へのインデックスが 7 行目で使用される前に、パラメーター 'x' の値が 5 行目で検証されます。これ以外の場合、類似コードの修正では、呼び出し関数内で値をチェックするのがベストでしょう。
関連チェッカー
外部参考資料
- CERT ARR00-C: 配列の仕組みを理解する
- CERT ARR30-C: 範囲外のポインターまたは配列添え字を形成したり使用したりしない
- CERT CTR50-CPP: コンテナーインデックスと反復子が有効な範囲内に収まるようにする
- CERT ENV01-C: 環境変数のサイズについて仮定を行わない
- CWE-119: メモリバッファの範囲内の操作の不適切な制限
- CWE-120: 入力サイズのチェックをしないバッファコピー ('古典的バッファオーバーフロー')
- CWE-121: スタックベースのバッファオーバーフロー
- CWE-124: バッファアンダーライト ('バッファアンダーフロー')
- CWE-125: 範囲外の読み取り
- CWE-787: 範囲外の作成
- CWE-788: バッファ終端後部のメモリ位置のアクセス
- CWE-805: 不正確な長さの値でのバッファアクセス
- CWE-806: ソースバッファのサイズを使用したバッファアクセス
- STIG-ID:APP3590.1 バッファオーバーフローに脆弱なアプリケーション
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。
拡張機能
このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。