ABV.GENERAL.MULTIDIMENSION
バッファオーバーフロー - 配列インデックスが範囲外
バッファオーバーフローは、オーバーランとも呼ばれ、データをバッファに書き込むプログラムがバッファの境界でオーバーランし、近くのメモリに上書きする異常な状態を指します。通常、この問題は、プログラムが文字列をバッファにコピーするときに発生します。
C および C++ では、データへのアクセスまたはメモリの任意の場所へのデータの上書きに対する組み込み保護が用意されていません。また、配列 (その言語の組み込みバッファタイプ) に書き込まれたデータが配列の境界内にあるかを自動的にチェックしません。
ABV.GENERAL.MULTIDIMENSION チェッカーは、多次元 (2 次元から N 次元) 配列に対して、配列範囲の違反、つまり配列の範囲外の配列要素へのアクセスを検出する汎用のチェッカーです。
脆弱性とリスク
バッファオーバーフローは、コードを実行するように設計された、またはプログラムの動作方法の変更のために設計された入力によりトリガーされることがあります。これにより、メモリアクセスエラー、不正確な結果、クラッシュ、またはシステムセキュリティ違反など、異常なプログラムの動作を引き起こすことがあります。
バッファオーバーフローの結果には、有効なデータの上書きや、恣意的なコードや潜在的に悪意のあるコードの実行なども含まれます。たとえば、バッファオーバーフローによって、以下に示すように、プログラムが操作されることがあります。
- メモリ内のバッファの近くにあるローカル変数を上書きし、攻撃者の都合の良いようにプログラムの動作を変更する
- スタックフレームの戻りアドレスを上書きし、攻撃者が指定した戻りアドレス (通常はユーザー入力を格納しているバッファ) から実行が再開されるようにする
- 関数ポインターまたは例外ハンドラーを上書きして、後で実行する
脆弱コード例 1
#include<iostream>
using namespace std;
int main()
{
// an array with 3 rows and 2 columns.
int x[3][2] = {0,1,2,3,4,5};
int *p = &x[0][0];
cout<<"Array access: "<<*(p+9)<<endl;
return 0;
}
Klocwork は 10 行目について、多次元配列 'x' が範囲外である可能性を示す、バッファオーバーフローレポートを生成します。
修正コード例 1
#include<iostream>
using namespace std;
int main()
{
// an array with 3 rows and 2 columns.
int x[3][2] = {0,1,2,3,4,5};
int *p = &x[0][0];
cout<<"Array access: "<<*(p+2)<<endl;
return 0;
}
修正されたコード例では、多次元配列はインデックス範囲内でアクセスされます。
関連チェッカー
- ABV.ANY_SIZE_ARRAY
- ABV.GENERAL
- ABV.ITERATOR
- ABV.MEMBER
- ABV.STACK
- ABV.TAINTED
- ABV.UNICODE.BOUND_MAP
- ABV.UNICODE.FAILED_MAP
- ABV.UNICODE.NNTS_MAP
- ABV.UNICODE.SELF_MAP
- ABV.UNKNOWN_SIZE
外部参考資料
- CWE-119: メモリバッファの範囲内の操作の不適切な制限
- CWE-120: 入力サイズのチェックをしないバッファコピー ('古典的バッファオーバーフロー')
- CWE-122: ヒープベースのバッファオーバーフロー
- CWE-124: バッファアンダーライト ('バッファアンダーフロー')
- CWE-125: 範囲外の読み取り
- CWE-127: バッファアンダーリード
- CWE-193: Off-by-one エラー
- CWE-251: なし
- CWE-786: バッファ開始前のメモリ位置へのアクセス
- CWE-787: 範囲外の作成
- CWE-788: バッファ終端後部のメモリ位置のアクセス
- CWE-805: 不正確な長さの値でのバッファアクセス
- CWE-806: ソースバッファのサイズを使用したバッファアクセス
- CERT ARR30-C: 範囲外のポインターまたは配列添え字を形成したり使用したりしない
- CERT ARR38-C: ライブラリ関数が無効なポインターを形成しないようにする
- CERT POS30-C: readlink() 関数を適切に使用する
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。
拡張機能
このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。