NPD.FUNC.MIGHT

可能性のある null ポインターが逆参照される場合があります

null ポインターを使用してデータにアクセスしようとすると、ランタイムエラーが発生します。有効だと思っていたのに実際は null だと判明したポインターをプログラムが逆参照すると、null ポインター逆参照が起こります。null ポインター逆参照欠陥は、エラー処理または競合状態が無効なためにしばしば起こります。通常、プログラム終了の異常が発生します。ポインターが C/C++ コードにおいて逆参照される前に、null に等しくないことを確認するためにチェックする必要があります。

NPD チェッカーは、null または null ポインターが逆参照されるインスタンスを探します。

NPD.FUNC.MIGHT チェッカーは、null を返す可能性がある関数呼び出しからのポインター値が、後で null についてチェックされずに逆参照する場合がある関数に渡されるまたは明示的に逆参照される状況にフラグを立てます。

脆弱性とリスク

通常、null ポインターの逆参照は、プロセスに失敗する結果となります。これらの指摘は通常、無効な例外処理が原因で発生します。

軽減と防止

この脆弱性を回避するには、次の操作を実行します。

  • 値を返すすべての関数の結果において null 値についてチェックします
  • すべての外部入力が検証されていることを確認します
  • 変数を明示的に初期化します
  • 異常な例外が正確に処理されていることを確認します

脆弱コード例

コピー
  void xstrcpy(char *dst, char *src){
    if (!src) return;
    dst[0] = src[0];
  }
  
  char global;
  
  char *xmalloc() {
    if (global) return &global;
   return 0;
 }
 
 void npd_func_might(int flag, char *arg) {
   char *p = &arg;
   if (flag) p = xmalloc(); // xmalloc() may return NULL
   if (arg) { p = arg; } // p may get a new value here
   xstrcpy(p, "Hello"); // p will be dereferenced in xstrcpy()
 }

9 行目の条件付きステートメントによっては、関数 xmalloc は null ポインターを 16 行目の条件によっては逆参照される関数 npd_func_might に渡した後で xstrcpy に渡します。このタイプの脆弱性が原因で、予期しない結果や意図しない結果となる可能性があります。

修正コード例

コピー
  void xstrcpy(char *dst, char *src){
    if (!src) return;
    if (!dst) return;
    dst[0] = src[0];
  }
  
  char global;
  
  char *xmalloc() {
    if (global) return &global;
   return 0;
 }
 
 void npd_func_might(int flag, char *arg) {
   char *p = &arg;
   if (flag) p = xmalloc(); // xmalloc() may return NULL
   if (arg) { p = arg; } // p may get a new value here
   xstrcpy(p, "Hello"); // p will be dereferenced in xstrcpy()
 }

修正されたコードでは、*dst は逆参照前に 3 行目で null についてチェックされます。

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。