FNH.MUST
非ヒープメモリの解放
スタティックメモリまたはスタックメモリのインスタンスに対して、非ヒープメモリの割り当て解除を行うと、プログラムのメモリ管理構造が壊れる可能性があります。FNH.MUST チェッカーは、malloc()、calloc()、realloc() などのヒープ関数を使用して割り当てられなかったメモリをアプリケーションが解放する状況にフラグを立てます。
脆弱性とリスク
非ヒープメモリを解放するとプログラムのメモリを破壊してプログラムがクラッシュする結果になったり、攻撃に悪用される脆弱性をもたらす可能性があります。たとえば、悪意のあるユーザーは、free() を使用してメモリの場所にアクセスし、データを変更し、または認証されていないコマンドやコードを実行する可能性があります。
軽減と防止
非ヒープメモリの解放を回避するには、以下を確実に行います。
- 事前に malloc() を使用してヒープ上に割り当てられたポインターのみを解放します。
- ポインターを追跡して、1 回だけ解放します。
- プログラムの右側部分に属するメモリだけを解放します。
脆弱コード例
コピー
class A{
public:
void foo();
};
void A::foo()
{
int localArray[2] = { 11, 22 };
int *p = localArray;
delete[] p; //@FNH.MUST
}
Klocwork は、非ヒープメモリの割り当て解除レポートを生成し、'localArray' が delete[] に渡されるときに非ヒープメモリを指すことを指摘します。非ヒープメモリを解放するとアプリケーションがクラッシュしたり、攻撃に対して脆弱になる可能性があります。
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。
拡張機能
このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。