メモリを二重/多重で開放してはいけない
#🌱
from: https://x.com/gorilla0513/status/1748722125731774629?s=20
二重開放/多重開放してはいけない理由についての詳しい理由
mallocしたものを二重でfree()したときどうなるか
解放されたメモリに再びアクセスしてときに返ってくる値は不定で、何が返ってくるかはわからない
C言語上は未定義動作
意図しないメモリを変更してしまうことがある
free()で解放された領域(ポインタ)をダングリングポインタと呼ぶ
CWEでの分類はCWE-415
CWE - CWE-415: Double Free (4.13)
バッファオーバーフロー攻撃に脆弱になるとのこと
解放した領域にはNULLを詰めておくと二重開放してしまっても安全らしい
code:c
char *message;
int message_type;
/* message と message_type を初期化 */
if (message_type == value_1) {
/* message type 1 を処理 */
free(message);
message = NULL;
}
/* ...*/
if (message_type == value_2) {
/* message type 2 を処理 */
free(message);
message = NULL;
}
// ref: MEM01-C. free() した直後のポインタには新しい値を代入する. https://www.jpcert.or.jp/sc-rules/c-mem01-c.html
参考
二重解放 | Programming Place Plus 用語集
write-what-where状態とは何? わかりやすく解説 Weblio辞書
CWE - CWE-415: Double Free (4.13)
MEM01-C. free() した直後のポインタには新しい値を代入する
メモ
MEM30-C. 解放済みメモリにアクセスしない
MEM31-C. 動的に割り当てられたメモリは一度だけ解放する
任意コード実行 - Wikipedia
CWE - CWE-415: Double Free (4.13)
CWE - CWE-123: Write-what-where Condition (4.16)
未定義の動作