Hacker News보안

37년 전 OpenBSD 커널 버그로 루트 권한 확보

원제 Big Fish: Exploiting a 37-Year-Old Kernel Bug in OpenBSD

109 포인트댓글 28
Key Point

37년된 버그로 최신 보안 기법들을 우회해 루트 권한을 획득하는 경로를 공개했으며, 이는 장기간 방치된 레거시 코드의 위험성과 커널 할당자 결정성이 얼마나 심각한 공격 표면인지를 보여준다.

핵심 요약

  • OpenBSD의 공유 메모리 첨부 카운터가 부호 있는 16비트 short로 정의된 것을 악용한 취약점이 37년 전 원래 BSD 소스까지 거슬러 올라간다.
  • 프로세스를 반복해서 fork하여 카운터를 32,767을 넘도록 밀어서 음수로 wrap되게 하는 정수 오버플로우를 유발할 수 있다.
  • 이를 통해 race condition으로 use-after-free 취약점을 트리거하고, 별도의 커널 out-of-bounds write와 조합하면 로컬 권한 상승이 가능하다.
  • 공격자는 KARL, SMAP, SMEP 보호 기법이 활성화된 상태에서도 정보 공개 취약점 없이 루트 셸을 확보할 수 있다.
  • 공격 방식은 127개 SysV 공유 메모리 세그먼트를 매핑한 뒤 259개 프로세스를 fork해서 카운터를 -32,643으로 wrap시키고, 힙 grooming과 경쟁 조건 승리를 통해 커널 포인터를 덮어쓴다.
  • IP 멀티캐스트 TTL을 2로 설정해 16바이트 ip_moptions 구조체를 할당하고, 그 끝 부분의 두 개 16비트 카운터 필드를 out-of-bounds write로 덮어 쓸 수 있다.
  • 취약점은 OpenBSD 에라타 026, 018으로 이미 패치되었다.
  • 완화 방안으로는 안전한 unlink 기법(doubly linked list 불변식 검증), PTE 자체 참조 매핑 주소 무작위화, 커널 할당자 비결정성화(base address 및 할당 순서 무작위화) 등이 제시된다.
  • KARL은 함수와 데이터 주소는 무작위화하지만 메모리 할당자는 결정적이어서, 부트 시 할당은 같은 하드웨어에서 동일 위치에 배치되는 문제가 있다.
  • 커널 할당자가 함수 포인터를 포함한 구조체를 예측 가능한 위치에 할당하기 때문에 lo0, enc0 ioctl 핸들러 같은 목표물이 악용될 수 있다.
  • 배열 경계 sanitizer는 고정 크기 배열 out-of-bounds 접근을 제거할 수 있으며, Alloc Tokens는 포인터 할당과 비포인터 할당을 분리해 use-after-free 악용을 어렵게 할 수 있다.
  • OpenBSD는 소스 감사, 안전하지 않은 API 대체, 고급 암호화 해싱, 권한 분리, 샌드박싱, ASLR/W^X 같은 메모리 안전 기법으로 일관되게 보안을 강화해왔다.
AI 요약 안내

AI가 한국어로 정리한 내용입니다. 정확한 정보는 원문을 확인해 주세요.

요약 원칙 ↗