
CVE-2023-32434 기반의 결정론적 커널 익스플로잇.
Trigon은 CVE-2023-32434에 기반한 결정론적 커널 익스플로잇 및 PPL 우회 기법입니다. iOS 13 - 16.5.1을 실행하는 A9 - A16 기기를 지원합니다. 결정론적이라는 것은 이 익스플로잇이 익스플로잇 도중이나 이후에도 절대 패닉을 일으키지 않으며 완전히 신뢰할 수 있다는 뜻입니다.
Trigon은 XNU의 VM 계층에서 발생하는 정수 오버플로를 악용합니다. 이 취약점을 통해 임의의 물리 주소 매핑 프리미티브를 구축할 수 있습니다. 이를 통해 거의 모든 물리 주소에 대한 읽기/쓰기 프리미티브를 얻을 수 있지만, 이후의 익스플로잇 전략은 기기와 버전에 따라 달라집니다.
iOS 관련 기술 문서를 즐겨 읽으신다면 Trigon 시리즈를 읽어보시길 권합니다! iOS 연구자가 아니더라도 따라올 수 있도록 최대한 이해하기 쉽게 작성하려고 노력했습니다.
참고: 현재 iOS 16에서는 arm64 기기가 지원되지 않으며, arm64e 기기(A12+)만 지원됩니다.
arm64e 지원에는 여러 하드코딩된 값이 필요하며, 이 값들은 unique_offsets.h에 넣어야 합니다. 대부분은 매우 쉽게 찾을 수 있는데, 일부 구조체 오프셋은 Dopamine 소스 코드에서 찾을 수 있고, 다른 것들은 XPF를 실행하여 찾을 수 있습니다. 그러나 익스플로잇 이전에는 찾을 수 없는 세 가지 오프셋이 있으며, 이제 그 찾는 방법을 설명하겠습니다.
UniqueValues.addresses.base는 Trigon의 악성 메모리 매핑에 대한 물리적 베이스 주소입니다. 이를 찾는 쉬운 방법은 기존 값을 추정 베이스 주소로 사용한 다음 0x41410000과 같이 식별 가능한 물리 주소를 읽는 것입니다. 그런 다음 패닉 로그의 물리 주소에서 오프셋을 빼면 매핑의 올바른 베이스 주소를 확인할 수 있습니다.
pv_head_table 및 pp_attr_tableUniqueValues.offsets.pv_head_table 및 UniqueValues.offsets.pp_attr_table은 커널 물리 베이스로부터 두 커널 데이터 구조체까지의 상대 오프셋입니다. 이들은 커널 초기화 중 매우 이른 시점에 할당되기 때문에 물리 메모리에서 항상 커널 베이스로부터 정확히 동일한 오프셋에 위치합니다. 이를 찾으려면 kfd와 같은 기존 커널 익스플로잇을 사용하여 이 구조체들을 찾아 올바른 물리 주소로 변환한 다음, 그렇게 하여 오프셋을 계산할 수 있습니다.
Dopamine으로 탈옥 가능한 기기의 경우, arm64e에서 Trigon에 필요한 모든 오프셋을 찾아주는 사용하기 쉬운 명령줄 도구를 여기에 포함했습니다. 이를 사용하여 여러분의 기기 및 버전 조합에서 익스플로잇이 작동하도록 설정할 수 있습니다.