EN JP CN

FNH.MIGHT

FNH.MIGHT

非ヒープメモリの解放の可能性があります

スタティックメモリまたはスタックメモリのインスタンスに対して、非ヒープメモリの割り当て解除を行うと、プログラムのメモリ管理構造が壊れる可能性があります。FNH.MIGHT チェッカーは、malloc()、calloc()、realloc() などのヒープ関数を使用して割り当てられなかったメモリを解放する可能性のあるアプリケーションの状況にフラグを立てます。

脆弱性とリスク

非ヒープメモリを解放するとプログラムのメモリを破壊してプログラムがクラッシュする結果になったり、攻撃に悪用される脆弱性をもたらす可能性があります。たとえば、悪意のあるユーザーは、free() を使用してメモリの場所にアクセスし、データを変更し、または認証されていないコマンドやコードを実行する可能性があります。

軽減と防止

非ヒープメモリの解放を回避するには、以下を確実に行います。

  • 事前に malloc() を使用してヒープ上に割り当てられたポインターのみを解放します。
  • ポインターを追跡して、1 回だけ解放します。
  • プログラムの右側部分に属するメモリだけを解放します。

脆弱コード例

1  class A {
2      public:
3          void foo(bool);
4  };
5  
6  void A::foo(bool heap)
7  {
8      int localArray[2] = {11,22};
9      int *p = localArray;
10     if (heap) {
11         p = new int[2];
12     }
13     delete[] p;
14 }

Klocwork は、非ヒープメモリの割り当て解除レポートを生成し、'p' が 'delete[]' に渡されるときに非ヒープメモリを指す可能性があることを指摘します。非ヒープメモリを解放するとアプリケーションがクラッシュしたり、攻撃に対して脆弱になる可能性があります。

拡張機能

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