flawopen.com/Simulators/Heap Use-After-Free
kfree()後のダングリングポインタ、tcacheフリーリストの再利用、Linuxカーネル権限昇格に至る実行フローの乗っ取りを再現。
ホテルの304号室をチェックアウトして鍵を返却したものの、合鍵をポケットに残したとします。ホテルは別の客に304号室を貸し出します。夜間に合鍵で部屋に入り、新しい客の日記を盗み見ることができてしまいます。この合鍵がダングリングポインタ(未無効化ポインタ)です。
// Vulnerable cleanup routine
void release_session(struct session_mgr *mgr) {
if (mgr->active_session) {
kfree(mgr->active_session);
// FLAW: mgr->active_session remains dangling!
}
}
// Hardened cleanup routine
void release_session(struct session_mgr *mgr) {
struct user_session *sess;
sess = xchg(&mgr->active_session, NULL);
if (sess) {
memzero_explicit(sess, sizeof(*sess));
kfree(sess);
}
}