RNPD.CALL
null チェック前の関数呼び出し時のポインターの不審な逆参照
null ポインターを使用してデータにアクセスしようとすると、ランタイムエラーが発生します。有効だと思っていたのに実際は null だと判明したポインターをプログラムが逆参照すると、null ポインター逆参照が起こります。null ポインター逆参照欠陥は、エラー処理または競合状態が無効なためにしばしば起こります。通常、プログラム終了の異常が発生します。ポインターが C/C++ コードにおいて逆参照される前に、null に等しくないことを確認するためにチェックする必要があります。
NPD チェッカーは、null または null ポインターが逆参照されるインスタンスを探します。
RNPD.CALL チェッカーは、関数に渡される引数によってポインターが null チェックの前に逆参照されるインスタンスを検出します。逆参照とチェックの間の追跡でポインターの変更がない場合、逆参照でポインターが null になるか、または null チェックの前に逆参照される可能性が高くなります。
脆弱性とリスク
通常、null ポインターの逆参照は、プロセスに失敗する結果となります。これらの指摘は通常、無効な例外処理が原因で発生します。
null チェック前の逆参照は次のような結果となる可能性があります。
- ポインターが null であった場合、ランタイムエラー
- 書かれている条件が不正確である場合、意図しないプログラムの結果
- 冗長なチェックがある場合、不要なコードの生成
軽減と防止
この脆弱性を回避するには、次の操作を実行します。
- 値を返すすべての関数の結果において null 値についてチェックします
- すべての外部入力が検証されていることを確認します
- 変数を明示的に初期化します
- 異常な例外が正確に処理されていることを確認します
脆弱コード例
void deref(int *p){
*p = *p + 10;
}
void rnpd_2(int *t){
deref(t);
if (!t) return;
*t ++;
}
この例では、コードは 't' を 2 回逆参照します。 1 回目は、関数 deref() への呼び出しによって確認なしで行われます。Klocwork は、7 行目の逆参照の後に null チェックが発生する 8 行目にフラグを立てます。もちろん、ポインターが null の場合は、1 回目の逆参照の後にアプリケーションはクラッシュします。
関連チェッカー
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。