iOS 보안 기능들과 탈옥 미리보기

ref

용어 정리

0. 보안 기능

SSV

iOS15 에서 도입된 보안 기능이며 애플은 전체 시스템 볼륨에 대한 무결성을 빠르게 검증하기 위한 MerkleTree 를 가지고 있다.

MerkleTree는 트리형태로 하위노드들의 해시값을 다시 해싱해서 상위노드를 만드는 구조라서 파일이 변경된 경우 상위해쉬로 전파되어 루트까지 해시값이 변경되게 된다.
이때 루트 해시값이 변경됐다면 확인하면 파일시스템이 변경됨을 알 수 있다.

hash(B) 가 변경된 경우

                  root'    (변경)
                 /     \
    (변경)   hAB'       hCD    (변경 없음)
             /  \       / \
           hA   hB'   hC  hD
                 |
                 B'  파일또는 메타데이터 변경

공격자가 권한을 갖게되면 연결된 모든 해시값들을 재 계산 후 노드의 값들을 변경할 수 있을것이다.
SSV 기능으로 정상 root 해시값을 애플의 개인키로 서명하고 저장하기 때문에 공격자가 root 까지 재계산 하더라도 서명을 추가할 수 없게된다.

언제든 MerkleTree의 애플의 공개키 기반 해시 검사 루틴을 수행하면 무결성이 깨진것을 확인할 수 있게된다.
(서명된 값이 변조되지 않았으면서 검증 함수가 우회되지 않았다는 가정하에)

서명된 해시값(expectedSeal)은 애플이 펌웨어를 만들때 정상 시스템을 기준으로 만들어지고, 펌웨어를 기기에 설치할때, 부팅할때, 부팅 후 파일을 읽을때 검사한다.

  1. 애플의 공개키로 expectedSeal의 서명이 올바른지 확인. 공격자는 애플 개인키를 얻을 수 없기 때문에 expectedSeal을 변경할 수 없다.
  2. expectedSeal 값이 변경되지 않음을 확인하고, 부팅할 파일시스템에서 계산된 actualSeal 값과 다르지 않다면 애플의 공개키만 사용해서 검증이 가능하다.

애플의 공개키는 BootROM에 저장되어 있고, 물리적으로 readonly이기 때문에 expectedSeal은 절대 변경될 수 없음을 전제로 한다.

그래서 결국엔 함수를 우회해야하는데, 파일을 변경해도 해시값을 원본값을 리턴하도록 해시함수를 수정하거나 expectedSeal을 공개키로 검증하는 함수를 항상 참이 나오도록 우회하는 방법이 논리적으로 가능성있는 방향이다.

1. 파일시스템 구성에 따른 분류

rootful

탈옥용 파일 패키지, 트윅들이 직접 루트파일시스템에 설치되는 방식이다. 읽기 전용이였던 시스템 파티션을 읽기, 쓰기로 재마운트하고 탈옥파일과 트윅들을 설치하게 된다

이 방식은 기존 도구들과 호환성이 좋지만, 기존 시스템 파일들과 탈옥파일들이 섞여서 깔끔하게 제거하는 것이 어렵고 잘못된 파일이 패치되는 경우 부팅시 문제가 생길수도 있게된다.

iOS 15부터는 SSV(Signed System Volume) 때문에 시스템 볼륨을 변경하기 어려워서 원본 시스템 볼륨을 복사한 파일시스템으로 부팅하는 방식인 FakeFS를 사용하기도 했다.
이 방법은 원본 볼륨과 복사본을 동시에 유지해야하기 때문에 저장공간이 두배로 필요하고, 부팅체인에 개입이 가능한 취약점이 필요 (checkm8)하게 된다. (다른 방법이 있을수도있긴함)

rootless

탈옥용 파일들을 시스템 볼륨이 아닌 /var/jb 같은 경로에 설치하는 방식이기 때문에 SSV의 우회가 필요 없어졌다. 요즘 rootless들은 실제 데이터들을 /private/preboot 파티션에 저장하고, /var/jb 를 심볼릭 링크로 연결해둔다.

iPhone:/var root# ls -la /var/jb
lrwxr-xr-x 1 root wheel 140 Jun 10  2024 /var/jb -> /private/preboot/C896A982DC76C68E87BFF110585F94461F7F72CCE92F9D497C5695F10EA96257204ADFE8836F6389343D4350ADC339F2/dopamine-UP1ZyJ/procursus//

rootful은 시스템에 바로 설치하기 떄문에 프로그램들에서 경로 관련 코드가 실행될 때 시스템의 경로를 그대로 사용할 수 있지만, rootless는 /var/jb 를 붙여서 사용해야하기 때문에 트윅이나 바이너리가 호환되지 않는다.

정상 시스템 볼륨으로 부팅 후 유저랜드 취약점부터 커널 프리미티브 환경을 만들어서 사용하기 떄문에 SSV 우회도 필요 없으며, 탈옥 제거가 쉽다.

정리

  • rootful : 시스템 볼륨을 직접 수정해서 탈옥 파일을 설치하는 방식
  • fakefs : 시스템 볼륨을 복사해서 만든 FakeFS 에 탈옥파일 설치 후 부팅하는 방식
  • rootless : 시스템 볼륨 수정 없이 파일시스템의 다른 영역에 파일들을 설치하는 방식

2. 탈옥 유지에 따른 분류

탈옥 방법

checkm8

rootful (fakefs), 부트롬취약점이라서 정리

dopamine

이녀석은 지금쓰는것중 제일좋은녀석이라 정리 rootless

트윅

Ellekit tweakLoader? ? 훅?
frida
그누구야 트롤스토어

가능한것과 불가능한것

모든 권한을 가진 프로그램 직접실행

Comments

ESC
Type to search...