二重解放の脆弱性
読み:にじゅうかいほうのぜいじゃくせい
外語:double-free vulnerability
セキュリティホールの一つ。同じメモリー領域を、二重に解放(使用済のメモリー領域をシステムに返却)すること。
概要
Cの場合、一般に、メモリーの確保はmalloc関数、解放はfree関数を使う。
一度free関数で解放されたポインターを再度free関数で解放しようとすると、メモリーの内容を大きく破壊することになり、大きなバグを引き起こす。任意の不正コードを実行させられる脆弱性を引き起こすこともあるとされる。
これが、二重解放の脆弱性である。
対策
抜本的な解決法はないが、一度freeしたポインターには、すぐにNULL(あるいは相当するもの)を代入するのが経験上良いとされている。
free(p);
p = NULL;
free(NULL)は何もしないことが保証されているため、もしこの不具合を招くようなコードが存在したとしても、最悪の不具合を引き起こすことが無い。
但しこれも、マルチスレッドの処理がある場合は、freeとNULL代入の一瞬の間に不具合を起こす可能性もあるので、完全な解決法というわけでもない。過信は良い結果をもたらさない。
再検索