CS Insights

리눅스 Kernel Panic 크래시 덤프 분석: kdump를 이용한 커널 모드 널 포인터 참조 버그 해부

리눅스 Kernel Panic 크래시 덤프 분석: kdump를 이용한 커널 모드 널 포인터 참조 버그 해부
백엔드 시스템이 며칠에 한 번씩 아무런 어플리케이션 로그도 남기지 않은 채 돌연사(Reboot)하는 기괴한 현상을 마주했습니다. dmesg에도 남지 않는 죽음의 원인을 캐기 위해, 운영체제 자체의 부검 시스템인 kdump(Kernel Dump) 서비스를 전격 활성화시켰습니다. kdump의 원리는 놀랍습니다. 메인 커널이 치명적인 버그(Panic)를 감지하여 죽음을 직감하는 찰나의 순간, 미리 메인 브레인의 격리된 메모리 구석에 잠들어 있던 또 다른 '구급차 커널(Crash Kernel)'을 긴급 부팅시킵니다. 이 구급차 커널은 쓰러진 메인 커널의 램(RAM) 메모리를 건드리지 않고 그대로 파일(vmcore)로 덤프(Dump)를 떠서 하드디스크에 저장한 뒤 서버를 재부팅 시킵니다. 즉, 기계가 죽기 직전 0.1초의 메모리 스냅샷을 박제해 내는 것입니다. 재부팅 후 crash 유틸리티 도구로 이 시체(vmcore)를 열어부 보았습니다. 수십 만 줄의 커널 스택 메모리 덤프를 파고들어간 끝에, 써드파티 보안 모듈의 특정 네트워크 훅(Hook) 함수가 해제된 메모리 영역을 다시 접근하려는 널 포인터 역참조(Null Pointer Dereference) 버그를 범하고 있음을 커널 어셈블리어 레벨에서 정확히 지목해 냈습니다. 유저 스페이스를 벗어나 운영체제 그 자체의 피와 뼈를 직접 메스로 가르고 들어가 원인을 적발해 낸 커널 해킹의 카타르시스는 압도적이었습니다.

Related Posts