flawopen.com/Simulators/Heap Use-After-Free
kfree() 이후 널 포인터 처리를 누락하여 발생하는 댕글링 포인터와 리눅스 커널 루트 권한 획득 흐름을 시뮬레이션합니다.
호텔 304호에서 체크아웃하며 열쇠를 반납했지만, 주머니에 복제 열쇠를 몰래 남겨둔 상황을 상상해보세요. 호텔은 새 투숙객에게 304호를 배정합니다. 밤에 복제 열쇠로 문을 열고 새 투숙객의 소지품을 열람할 수 있습니다. 이 복제 열쇠가 바로 댕글링 포인터(Dangling Pointer)입니다.
// 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);
}
}