web-dev-qa-db-ja.com

カスタムmalloc / callocおよびfreeをLD_PRELOADするだけで二重解放から保護するのは簡単ですか?

返される前にグローバルハッシュテーブルに返されたポインターアドレスを追加するmalloc/callocラッパーを実装し、解放する前にテーブル内のポインターの存在をチェックするフリーラッパーを実装することはできません(存在しない場合は削除し、存在する場合は削除します)。次に、二重解放から保護するために、Firefoxなどのプログラムでこれらのmalloc/callocおよび解放関数をLD_PRELOADしますか?標準のmalloc/callocおよびfree関数がこのような手法を使用しない理由、またはstrcpyの代わりにstrcpy_sが提案される方法と同様に提案される安全なバリアントがない理由はありますか?

2
cyborg

いいえ。二重解放が脆弱性である理由は、2番目のfreeの前に、メモリが別の何かのために再割り当てされているためです。そのようなラッパーは、freeがそのアドレスでのメモリの最初または2番目の割り当てを意図したものかどうかを知る方法がありません。