Big Fish: OpenBSD의 37년 된 커널 버그 악용하기

1 hour ago 3

16비트 공유 메모리 연결 카운터의 오버플로가 경쟁 상태를 통해 해제 후 사용으로 이어졌으며, 별도의 커널 범위 밖 쓰기 취약점과 결합해 로컬 root 권한 상승이 가능했음 Calif는 KARL, SMAP, SMEP가 활성화된 OpenBSD에서 별도의 정보 유출 취약점 없이 커널 코드 실행과 root 셸 획득에 성공함 결정론적인 커널 메모리 할당 방식 때문에 같은 하드웨어에서는 부팅 초기 구조체 주소를 예측할 수 있었고, 여기에 저장된 함수 포인터가 공격 표적이 됨 두 취약점은 errata 026과 018에서 수정됐으며, 연결 리스트 안전성 검사와 페이지 테이블 매핑 및 메모리 할당 무작위화로 공격 경로를 추가 차단할 수 있음 배열 경계 검사와 Alloc Tokens 같은 컴파일러 기능은 취약점 유형 전반의 악용을 억제할 수 있으며, AI 지원 취약점 탐색 시대에는 이런 방어와 공격 복잡도 증가가 더욱 중요해짐 37년 된 공유 메모리 카운터와 취약점 수정 Calif는 OpenBSD에 여러 취약점을 신고하면서 일부에는 수정 패치도 함께 전달했으며, 그중 하나는 약 37년 전 BSD 원본 코드까지 거슬러 올라가는 공유 메모리 연결 카운터 문제였음 shm_nattch가 부호 있는 16비트 short로 정의돼 있어, 공유 메모리 연결 기록을 가진 프로세스를 반복해서 fork하면 최댓값 32,767을 넘어 음수로 순환할 수 있었음 이 정수 오버플로는 경쟁 상태를 거쳐 해제 후 사용(use-after-free) 으로 이어질 수 있었고, 별도의 커널 범위 밖 쓰기 취약점과 결합하면 로컬 root 권한 상승이 가능했음 카운터 관련 문제는 errata 026에서 수정됨 별도의 범위 밖 쓰기 문제는 errata 018에서 수정됨 보호 기능이 활성화된 환경에서의 공격 흐름 KARL, SMAP, SMEP가 활성화된 상태에서도 정보 유출 취약점 없이 로컬 root 권한을 획득함 먼저 SysV 공유 메모리 연결 카운터를 음수로 순환시키고 힙 배치를 조정함 공유 메모리 세그먼트 127개를 매핑한 뒤 munmap()으로 해제하고, 프로세스 259개를 fork해 연결 수를 -32,643으로 만듦 sysctl(KERN_MALLOCSTATS)의 kb_total, kb_totalfree 같은 지표로 할당과 새 페이지 할당 시점을 추적하며 힙을 배치함 한 프로세스에서 IPC_RMID를 실행하는 동시에 보조 프로세스에서 크기 혼동이 발생한 새 공유 ...

Read Entire Article