최후의 0day 탈옥: Tachy0n
(blog.siguza.net)- tachy0n은 iOS 13.0~13.5를 위한 최신 0day 탈옥 익스플로잇 공개 사례임
- 이 버그는 Lightspeed라 불리는 lio_listio 시스템 콜의 경쟁 상태(race condition)로, 커널 LPE(권한 상승) 취약점 이용임
- Spice 및 unc0ver 등 여러 탈옥 프로젝트에서 이 취약점을 실제로 활용한 사례가 있으며, 취약점 이용 방식과 메모리 관리 이슈 해킹 기법 설명임
- Apple은 이 exploit이 공개된 후 패치와 리그레션 테스트 도입, 더 강력한 커널 오브젝트 분리(Zone, kheap 등) 및 포인터 보호 기능 대폭 강화함
- 이후 iOS 14부턴 탈옥·커널 exploit 환경이 근본적으로 변하여, 공개된 커널 exploit이 더이상 존재하지 않는 상황임
0. 서론
- tachy0n은 iOS 13.0부터 13.5까지 적용되는 구형 exploit임
- 2020년 5월 23일 unc0ver v5.0.0에 0day로 공개, 불과 1주일 만에 Apple이 긴급 패치함
- 해당 취약점은 이미 이전에 1day로 활용된 이력이 있어, exploit 기법 측면에서 의미 있는 사례로 평가됨
- 취약점 소스 및 발견 경위를 상세히 풀어 설명하는 글임
1. Lightspeed
- 해당 취약점은 Synacktiv이 발표한 Lightspeed 버그(CVE-2020-9859 등) 로,
lio_listio
syscall의 비동기 I/O 컨텍스트 메모리 해제 시 경쟁 상태 문제가 발생함 - 메모리 더블 프리 조건을 만들기 위해 I/O 연산 타이밍을 조절, 두 번의 객체 해제를 통해 같은 메모리 영역에 여러 객체를 중첩시켜 활용 가능함
- 커널의
kalloc.16
존에서 동적 메모리 할당 구조를 익스플로잇에 활용함 - 본질적으로 경쟁 레이스를 수차례 반복해 성공 확률을 높이는 방법임
- 커널의
2. Spice
- 해당 exploit은 과거 team Jake Blair가 제작한 Spice 탈옥에서 사용됨
- racoon과 app에서 서로 다른 exploit 변종을 구현했고, 주요 목표는 mach 포트 위조임
- iOS 11.x 당시엔 PAN(Protection Against Null dereference) 우회가 쉬웠으며, 커널 infoleak 및 sandbox escape와 결합한 다양한 해킹 기법을 시도함
- racoon의 경우 IOKit 접근 제한으로, OSUnserializeXML을 활용해 커널 해당 존(spray) 대상 객체를 생성
- sysctl_procargsx, 커널 uninitialized memory leak, sandbox 정책 등 세부 차이 및 후속 기술 발전상도 서술함
3. unc0ver
- unc0ver 적용 당시엔 A8~A13 포함 광범위한 SoC에서 동작하도록 exploit 구조 설계됨
- OSData 객체의 중첩 및 오버랩핑 추적, 적절한 시점에 원하는 객체를 해제/할당하여 메모리 영역을 통제함
- IOMemoryDescriptor와 같은 커널 객체를 활용, 사용자가 제어하는 데이터 버퍼 주소를 노출 및 커널에서 직접 읽기/쓰기를 구현함
- zone_require 우회 등 iOS 13 커널 메모리 할당기 정책의 취약점을 적절히 이용함
- 전체 exploit 구조는 공개된 GitHub 저장소(tachy0n)에서 상세 구현 확인 가능
4. 후속 영향
- 0day exploit의 공개는 보안 커뮤니티 및 Apple에 큰 반향을 불러옴
- 실 exploit 공개 4시간 만에 Project Zero와 Synacktiv에서 세부 분석 및 대응 이루어짐
- Apple은 패치 이후 해당 취약점에 대한 정식 리그레션 테스트를 XNU에 추가하는 등, 근본적인 보안 전략 강화 기조로 전환함
- iOS 14부터는 allocation 영역 분리, 오브젝트 시큐어 가드, PAC(포인터 인증 코드), kheap 구조 등 exploit 제작 난이도를 크게 높이는 대대적인 변화가 도입됨
- 이제는 exploit 전략 자체가 더 중시되고, 공개 정보와 비공개 연구 간의 격차가 커져 iOS 17~18에 대해선 공개 커널 exploit이 아예 없는 실정임
5. 결론
- iOS 보안/탈옥 분야가 5년 만에 극적으로 변화함을 명확하게 보여주는 사례임
- 탈옥/익스플로잇 커뮤니티, 연구자, 그리고 Apple의 기술 방향성이 어떻게 변화했는지 통찰을 제공함
- IL을 공유하고 도전했던 시절은 이제 과거의 일이 되었고, iOS 14 이후부턴 exploit 정보 공유가 현저히 축소됨
참고 및 문의
- 관련 소스코드 및 자세한 정보는 Siguza 개인 웹사이트와 공개 GitHub 저장소에서 확인 가능
애플의 하드웨어가 훌륭하기는 하지만 소프트웨어는 사용자를 목줄 채우려는 의도로 가득하죠.
자신이 만들어 빌드한 앱을 자신의 기기에서만 작동시키려고 해도 100달러짜리 구독이 필요합니다.
중소규모 오픈 소스 앱을 사용하고 직접 빌드해 쓰는 개발자라면
애플의 기기에서 취약점을 이용해 탈옥해가며 사이드로드 하는 것 보단 그냥 안드로이드 쓰는 것이 편해요.
Hacker News 의견
- 내가 생각하기에 그가 애플 같은 거대 기업을 이긴 비결은 단순하지만 지루하고 반복적인 작업, 바로 회귀 테스트라는 점 강조
SockPuppet이 과거에도 iOS 12 시절 탈옥에 사용된 적 있었고, Project Zero의 Ned Williamson이 애플에 제보해서 iOS 12.3에서 패치된 이후에도 다시 iOS 12.4에서 재등장했다는 사실 언급
아마도 애플이 XNU를 별도 브랜치로 포크하면서 해당 패치를 누락시킨 것 같고, 근본적으로 이런 신규/기존 취약점에 대한 회귀 테스트가 전무했다는 점이 큰 문제점
내가 직접 알려진 1-day 취약점 몇 개만 회귀 테스트로 자동화해 돌려봤는데 바로 성공적으로 취약점을 찾아냈다
이런 식으로 리눅스, FreeBSD, OpenWRT, OpenSSH 등 다양한 오픈소스 프로젝트에서도 새 버전에 예전 취약점 회귀 테스트를 돌리고 있는지 궁금
각 취약점을 자동화된 형태로 작성하고, CI에서 리소스 투입해서 돌릴 여건만 된다면 충분히 이득이 클 것이라는 생각 - 회귀 테스트, 즉 고친 버그가 다시 나타나지 않도록 체크하는 작업은 QA의 표준 절차라는 점 강조
20년 전 대학 시절 Mozilla에서 자원봉사 QA 활동을 하며 수백 가지 회귀 테스트 사례가 있었던 경험 공유
주로 렌더링/레이아웃, JS 엔진 버그가 많았고, 최소화된 테스트 케이스를 만들면 CI 파이프라인에 바로 추가 가능한 구조
버그 자체는 어쩔 수 없지만, 이미 고친 버그가 다시 나타나면 시간과 비용 낭비라는 점이 최악이고, 품질에 신경 쓰는 조직은 반드시 회귀 테스트에 많은 투자를 한다고 봄
아쉽게도 QA를 무시하거나 외주로만 해결하고, 제대로 신경 쓰지 않는 조직도 많다
애플이 탈옥 관련해서 회귀 테스트가 없었다는 점은 이해가 안 됨
예전부터 Mozilla 등에서는 Tinderbox, Bugzilla 같은 도구를 활용해 훌륭한 QA 및 CI/CD 환경을 구축했고, DevOps라는 개념이 뜨기 전부터 이런 방식이 일반적이라고 생각했으나 실제로는 그렇지 않았다는 사실을 뒤늦게 알게 됨 - 이름이 기억나지 않지만, 오픈소스 프로젝트 중 각 이슈마다 테스트 케이스를 갖춘 곳이 있었다는 사례 언급
수천 개의 테스트 케이스가 있었고, Sqlite였던 것 같음
패치 백포팅을 안 하면 해당 테스트도 같이 백포팅하지 않을 확률이 높다는 점 추가 - 많은 조직에서 보안 이슈를 별도 워크플로와 다른 유형의 버그로 분리하는 구조 자체가 문제의 근본 원인
결국 콘웨이의 법칙(Conway's law)이 보안과 기능 개발 사이에도 그대로 적용
따라서 빌드/릴리즈 절차에서 회귀 테스트가 잘 갖춰진 조직이라도, 내부 조직 구조 때문에 보안 관련 이슈들이 빠질 가능성이 높아짐 - ‘이런 회귀 테스트 실행을 다른 프로젝트도 하고 있냐’는 질문에 대해,
정보기관(G10, 러시아, 중국, 북한 등)과 많은 사설 그룹들은 당연히 이런 방식으로 취약점 회귀 테스트를 하고 있을 것이라는 의견 표명 - 나는 보안 연구자는 아니지만, 이번 사례가 개인적으로도 매우 공감된다는 입장
- “heap 분리 관련 지식, 각종 미티게이션 기법 다 잊으라” 등에 대해
친구랑 외국어로 대화하다 다음 순간 뇌수술이나 핵물리학 같은 전문적인 주제로 넘어가면 머릿속이 하얘지는 상황에 비유
예전에 제철소 수리 관련 대화를 해석하려던 기억이 떠오름
탈옥이 사라진 현실이 아쉬운데, 탈옥된 아이패드를 딱히 유용하게 활용하진 못했지만 그 자체로 재미를 느꼈던 경험
지금이라면 테더링 앱이나 UTM, JIT 솔루션을 설치하고 싶음
SideStore가 유망해 보여서 써보고 싶지만, 내 애플 계정이 과거 유료 개발자 계정이었고 10개 앱 ID가 만료되지 않아서 그런 앱 설치에 제약이 걸림
새 계정을 만들거나 다시 돈을 내야 가능 - 내 예전 iPhone 4를 탈옥해서 썼던 경험이 있음
탈옥 없이는 iPhone을 메인 폰으로 쓸 이유가 전혀 없었고, 결국 Android로 넘어감
그때쯤 Android가 기본 기능 측면에서 많이 따라잡았던 시기였음 - 애플이 이제는 탈옥에 대해 백만 달러를 보상 지급한다고 들었고, 이것이 시장에서 형성되는 최저가라는 점 설명
- 사실 이 가격 한계는 이미 2015년 깨졌고, 1백만 달러 사례 기사 공유
- 탈옥 성공 시 애플에 수백만 달러 보상을 받으려면 어떻게 연락해야 하는지 궁금
중간 브로커를 통해야 할지, 공식 이메일이나 창구가 있는지, 단순히 1차 지원팀에서 묻힐 우려가 없는지 문의 - 이게 곧 시장 가격이고, 관련 기사 링크 Zerodium의 제로데이 현상금 공유
- 만약 애플의 전략이 맞다면, 루트 권한 얻는 모든 방법을 막아버림으로써 탈옥 개발자들이 무료로 찾아 낸 취약점까지 애플이 얻는 구조라는 점 언급
- 하지만 현실은 그렇지 않음
글에 언급된 것처럼, 여전히 프라이빗 커뮤니티에서는 취약점을 소유하고 있고 애플은 계속 패치
대중에게 공개되는 탈옥만 줄어들었을 뿐 - 혹시 맥락상 단어 의미가 다르더라도, 해당 슬랭이 뭘 의미하는지는 충분히 알 수 있지 않냐는 의견
- 그 단어를 처음 만들어낸 것으로 생각했을지 모르지만, 사실 이미 슬랭으로 사용되고 있던 사례 존재