37년 된 OpenBSD 커널 버그로 루트 권한 탈취

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

왜 중요한가

수십 년간 방치된 커널 정수 타입 오류가 현대 메모리 보호 기제를 우회하는 로컬 루트 익스플로잇으로 이어질 수 있음을 실증 사례로 보여줬다.

보안 연구기관 Calif가 2026년 10월 16일 공개한 보고서에 따르면, OpenBSD 커널에서 37년 전 BSD 원본 소스로 거슬러 올라가는 정수 오버플로우 취약점을 발견해 KARL·SMAP·SMEP 방어 기제가 활성화된 환경에서 별도의 정보 유출 없이 로컬 루트 권한 획득에 성공했다.

취약점의 근원은 SysV 공유 메모리 첨부 카운터가 부호 있는 16비트 short로 선언된 설계 오류다. 최댓값 32,767을 초과하면 음수로 반전되는 정수 오버플로우가 발생하며, 이를 레이스 컨디션과 결합하면 use-after-free로 이어진다. 여기에 커널 내 별도의 out-of-bounds write까지 연계하면 로컬 권한 상승이 가능하다. OpenBSD는 errata 026과 018을 통해 두 문제를 각각 수정했다.

익스플로잇 경로는 정밀하게 설계됐다. 먼저 SysV 공유 메모리 세그먼트 127개를 매핑 후 해제하고, 259개 프로세스를 fork해 첨부 카운터를 -32,643까지 감소시킨다. 이후 sysctl(KERN_MALLOCSTATS)의 kb_total·kb_totalfree 값을 활용해 힙 배치를 조정하고, IPC_RMID와 크기 혼동 공유 메모리 첨부로 레이스를 승리한다. IP 소켓과 IP_MULTICAST_TTL을 조작해 16바이트 구조체 ip_moptions를 할당한 뒤, out-of-bounds write로 멤버십 카운터 두 개를 동시에 덮어쓴다. 이어 소켓을 close()해 원자적 감소 연산을 유발하면 PTE 자기참조 매핑이 사용자 모드에서 슈퍼바이저 모드로 전환되어 커널 코드 실행이 달성된다.

Calif는 OpenBSD의 KARL이 커널 바이너리를 재링크해 함수·데이터 주소를 무작위화하지만, 부트타임 할당기와 best-fit 할당기는 베이스 주소 무작위화가 없어 초기 부팅 할당 위치가 동일 하드웨어에서 반복 재현된다는 점도 지적했다. 이 때문에 lo0·enc0의 ioctl 핸들러처럼 함수 포인터를 포함한 구조체가 안정적인 공격 타깃이 됐다.

출처

calif.io — 원문 읽기 →