UNIX 도메인 소켓에 어떻게 낭만을 느끼지 않을 수 있을까?

2 days ago 9

DEFCON 34에서 발생한 iOS 데모 충돌을 추적한 결과, 같은 UNIX 도메인 소켓의 inode 번호가 두 번째 fstat() 호출에서 바뀌는 커널 버그를 발견함 원인은 0을 미초기화 값으로 쓰면서 첫 inode에도 0을 할당하는 로직임. 전역 카운터의 후위 증가 연산 때문에 다음 조회에서 inode를 다시 할당함 데모의 VM은 UNIX 도메인 소켓 쌍으로 사용자 공간 TTY를 구현하고 inode로 마스터/슬레이브를 구분했으며, inode 변경으로 무결성 검사가 실패함 같은 버그가 첫 Mac OS X의 XNU 123.5와 4.3BSD-Tahoe에도 존재하며, 관련 로직의 역사는 1985년 12월까지 거슬러 올라감 커널에서는 증가 연산 순서를 바꾸면 되지만, 기존 iOS 버전도 지원하려면 inode가 0일 때 fstat()을 다시 호출하는 Apple 전용 우회 처리를 고려해야 함 DEFCON 데모에서 시작된 조사 DEFCON 34의 iOS 기술 발표 Rage Against the Sandbox에서 데모가 시작 직후 충돌했지만, 다시 실행하자 정상 작동함 데모에는 성공률이 36%인 1-day 로컬 권한 상승(LPE) 익스플로잇 DarkSword가 포함됐으며, 익스플로잇 자체는 무대에서 첫 시도에 성공함 시작 시 발생한 충돌은 익스플로잇과 무관했음 코드 공개를 앞두고 프로젝트를 마무리하면서 충돌을 조사한 결과, iOS 기기를 재부팅한 뒤 첫 실행에서만 발생하고 두 번째 실행부터는 발생하지 않았음 이 재현 패턴 때문에 ASLR 같은 무작위성이나 멀티스레드 경쟁 조건보다는 다른 원인을 추적함 iOS 앱 안의 VM과 사용자 공간 TTY 프로젝트는 iOS 애플리케이션 안에서 SSH 서버를 실행하는 VM임 iOS는 앱의 자식 프로세스 생성을 허용하지 않으므로, VM이 프로세스 생성 함수를 재정의함 실제 프로세스 대신 같은 프로세스 안에 자원과 메모리를 복제한 스레드를 만들어 다중 프로세스 동작을 구현함 VM은 논리적 코드 서명 우회도 구현함 데모는 작업 제어와 TTY를 위해 다중 프로세스 동작이 필요한 SSH 연결을 통해 서명되지 않은 1-day 익스플로잇을 실행함 TTY 명세는 프로세스당 제어 터미널 1개만 허용하므로, 하나의 iOS 앱 프로세스에서 여러 SSH 세션을 지원하려면 커널 TTY 구현에 의존할 수 없음 서로 연결된 UNIX 도메인 소켓 쌍을 만들고 양쪽으로 들어오는 데이터를 전처리해 사용자 공간에서 TTY...

Read Entire Article