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