
iOS 14 커널 익스플로잇(CVE-2021-30807)으로, IOMobileFramebuffer를 대상으로 하며 A11+ 기기에서 탈옥 개발을 위한 조정 가능한 메모리 할당 기능을 제공합니다.
글 작성은 여기: https://jsherman212.github.io/2021/11/28/popping_ios14_with_iomfb.html
CVE-2021-30807 익스플로잇입니다. 이를 기반으로 탈옥을 실제로 구축하려면 기기와 iOS 버전에 맞게 조정이 필요합니다. 이를 위해 사용할 정보 유출(info leak)이 없기 때문입니다.
A11 이하에서 조정하려면 pongo를 사용하여 xnuspy를 로드하고 SAMPLING_MEMORY=1 make -B로 빌드하세요. 그러면 kernel_memory_allocate가 반환한 메모리를 수집하고, 해당 포인터들을 정렬한 다음, 범위를 출력하는 테스트가 활성화됩니다. 다음과 같은 결과가 표시됩니다:
sample_kernel_map: 0xffffffe8ebe9c000 [0x10000 bytes from behind]
sample_kernel_map: to add to alloc_averager:
[0xffffffe8ce934000, 0xffffffe8ebf98000],
(그냥 출력되는 경고는 무시하세요)
이 테스트는 기기가 부팅된 후 30초 후에 실행되도록 설계되었습니다.
alloc_averager.py 안에는 제 휴대폰에서 이미 실행한 몇 가지 샘플이 있습니다. 각 범위의 평균을 모두 구해 그 평균을 취합니다. 기기용 "샘플 목록(samples list)"을 만들고 범위를 추가하세요. 테스트를 여러 번 반복하여 목록에 5~10개의 항목이 생길 때까지 진행하세요. alloc_averager.py는 목록을 기반으로 생성된 추측에 대한 성공률을 보고합니다. 마음에 드는 성공률이 나오면 추측 값을 가져와 IOMobileFramebufferUserClient.c 상단의 GUESSED_OSDATA_BUFFER_PTR 값을 대체하세요.
이 목록에 이상치(outlier)를 포함하지 않는 것이 매우 중요합니다. 테스트를 몇 번 실행하고 나면 이미 가지고 있는 범위와 확연히 다른 범위가 나올 가능성이 높습니다.
이 테스트를 실행하려면 기기/버전에 맞는 오프셋을 찾아야 합니다.
먼저, kernel_memory_allocate를 찾으려면 kernel_memory_allocate: VM is not ready를 크로스 레퍼런스(xref)하세요. 오프셋을 찾았으면 install_kernel_memory_alloc_hook 내부의 kma 값을 해당 값으로 설정하세요.
둘째, 테스트를 XNU가 수행하는 다른 할당과 분리하기 위해 특정 반환 주소를 테스트합니다. 그 주소는 OSData::initWithCapacity 안에 있습니다. "OSData" 문자열을 크로스 레퍼런스하면 OSData의 vtable을 쉽게 찾을 수 있습니다. 해당 문자열의 첫 번째 크로스 레퍼런스는 OSData::MetaClass의 vtable을 참조하는 함수에 있을 것입니다. 그 vtable 바로 위에 OSData의 vtable이 있으며, OSData::initWithCapacity는 +0x78에 있습니다.
OSData::initWithCapacity를 찾으면 kernel_memory_allocate로의 유일한 BL을 찾고, 그 명령어 바로 아래의 오프셋을 취하세요. kernel_hooks.c에서 해당 파일의 유일한 함수에 있는 유일한 if 문에 그 오프셋을 사용하세요.
A12 이상은 Correlium과 같은 것을 사용해야 합니다.