지원 중단된 기기에서 비공식 iOS 실행하기
(nyansatan.github.io)- iPod touch 3세대에서 공식적으로 지원되지 않는 iOS 6을 구동하기 위한 기술적 과정을 상세히 설명한 프로젝트
- DeviceTree, iBoot, Kernelcache, Restore Ramdisk, Root Filesystem 등 iOS의 핵심 구성요소를 수정·재구성해 구형 기기에서 최신 버전을 실행
- Python 스크립트를 이용해 iPhone 3GS와 iPod touch 3의 DeviceTree 차이를 자동으로 비교·적용하고, iBoot 패치로 코드 서명 검증을 우회
-
Kernelcache 재생성에는 macOS의
kcgen도구를 활용해 armv7용 커널과 kext를 통합, 불필요한 심볼 제거 및 압축 처리 - 구형 하드웨어의 잠재력을 확장하고, iOS 내부 구조 분석 및 커스텀 펌웨어 제작 기술을 공유한 점에서 높은 기술적 의의
iOS 구성요소 개요
- iOS는 iBoot, Kernelcache, DeviceTree, 사용자 공간 파일시스템, 보조 프로세서용 펌웨어 등으로 구성
- iBoot은 부트로더로, iBSS·iBEC·LLB·iBoot 네 가지 형태 존재
- Kernelcache는 커널과 커널 확장(kext)을 하나의 바이너리로 묶은 파일
- DeviceTree는 하드웨어 구성과 소프트웨어 동작 파라미터를 정의하며, iBoot이 실행 중 수정
- 파일시스템은 설치용 restore ramdisk와 영구 저장용 root filesystem으로 구분
iPhone 3GS 테스트
- iPhone 3GS와 iPod touch 3는 유사한 S5L8920X / S5L8922X SoC를 사용
- iPhone 3GS는 iOS 6을 공식 지원하므로, iOS 6.0을 iOS 5.1.1의 iBoot 및 DeviceTree와 함께 부팅 테스트
- 주요 문제는 DeviceTree 불일치로, iOS 6에서 새로 추가된 노드와 속성(
nvram-proxy-data)이 필요
DeviceTree 수정
- Python 스크립트를 작성해 두 DeviceTree 간의 차이를 계산하고 적용
- 스크립트는 SundanceInH2A 저장소에 공개
-
nvram-proxy-data속성은 NVRAM 덤프를 포함해야 하며, 비워둘 경우 커널이 초기 단계에서 멈춤 - iPod touch 3에 적용 시 iPhone 전용 항목을 제거한 후 diff 적용
iBoot 패치
- 기본적으로 Image3 서명 검사 우회, boot-args 주입, debug-enabled 패치 수행
-
nvram-proxy-data를 동적으로 채워야 하며, 정적 값 사용 시 실제 NVRAM이 덮어써질 위험 존재 -
UpdateDeviceTree()호출을 대체해nvram-proxy-data와random-seed를 삽입 -
amfi=0xff인자를 추가해 코드 서명 비활성화 - 다른 iBoot+커널 조합에서는 DeviceTree 차이와
boot_args구조 확인 필요
Kernelcache 생성
- iPod touch 3용 iOS 6 커널과 kext가 내부 빌드에 존재했으나, 이를 동시에 로드하려면 사전 링크된 커널캐시(prelinked kernelcache) 생성 필요
- macOS의
kcgen도구를 이용해 armv7용 커널캐시 생성- 주요 옵션:
-arch armv7,-all-personalities,-strip-symbols,-uncompressed - 불필요한 심볼 제거 후
lipo -thin armv7으로 단일 슬라이스로 변환
- 주요 옵션:
- 생성된 커널캐시는 압축 후 Image3 컨테이너에 패키징
- kext 목록은 iPhone 3GS의 iOS 5.1.1과 6.0을 비교해 작성, Wi-Fi kext의 Info.plist 수정 필요
Restore Ramdisk 수정
-
asr패치 및options.n88.plist를options.n18.plist로 변경해 파티션 배치 조정 - iBoot 익스플로잇 설치를 위해
rc.boot바이너리를 재구현- 램디스크 재마운트 및
umask설정 -
restored_external -server호출로 복원 후 재부팅 방지 - 복원 완료 시 세 번째 파티션 생성, 익스플로잇 기록,
boot-partition을 2로 설정 후 재부팅
- 램디스크 재마운트 및
Root Filesystem 수정
-
/System/Library/CoreServices/SpringBoard.app/N18AP.plist추가 및 iOS 6 기능 반영 - iOS 5.1.1과 iPod touch 4의 홈 화면 구성을 병합
-
Multitouch, Wi-Fi, Bluetooth 펌웨어 추가
- Bluetooth는
/usr/sbin/BlueTool의 하드코딩을/etc/bluetool로 오버라이드
- Bluetooth는
-
FairPlay 데몬의
LimitLoadToHardware키 제거로 iPod touch 3에서도 활성화 가능 - iOS 6.1 이상에서는 LaunchDaemon 서명 캐시로 인해 추가 패치 필요
-
Product ID 맵 수정: iPhone 3GS의
0x2714를 iPod touch 3의0x2715로 교체 -
MobileGestalt의
getDeviceVariant()를 수정해 항상"A"반환 - DYLD 공유 캐시 수정 시 SHA-1 해시 재계산으로 코드 서명 복구 가능
iBoot 익스플로잇
- iOS 5의 HFS+ 드라이버 버그를 이용한 익스플로잇 재작성
- 이전 버전보다 결정적(deterministic)으로 개선
결론 및 향후 계획
- 전체 작업은 예상보다 어렵지 않았으며, 도구 공개 후 탈옥(jailbreak) 관련 문의 다수 발생
- 커널 패치와 Cydia 설치로 간단히 탈옥 가능성 존재
- 다음 목표는 iPad 1에서의 iOS 6 실행 테스트
- 본 프로젝트는 iOS 내부 구조 분석과 구형 기기 활용에 대한 실질적 참고 자료 제공
Hacker News 의견
-
iDevices에도 이런 게 꼭 필요하다고 생각함
오래됐지만 여전히 쓸 만한 iPad Air 1세대가 e-waste로 버려지는 건 말이 안 됨
Apple이 더 이상 지원하지 않고, 다른 운영체제 설치조차 막는 정책이 문제임
Mac에는 OpenCore Legacy Patcher가 있어서 구형 Mac에서도 최신 macOS를 돌릴 수 있음- 관련해서, 오래된 iOS 기기에서 동작하는 앱들을 필터링해 볼 수 있는 앱 리스트를 만들어둠
- 이런 논의는 전자폐기물 현실 부정처럼 느껴짐
“오래됐지만 쓸만하다”기보다는 그냥 “오래된 기기”일 뿐임
기술 발전 속도가 너무 빠르기 때문에, 2013년 iPad Air 같은 기기는 이제 웹 브라우징조차 버거움
OpenCore Legacy Patcher로 2012년 Mac mini를 써봤지만, 성능 저하와 커널 패닉 때문에 결국 Linux로 바꿨음
결국 이런 기기들은 일종의 임시 소비재로 봐야 함
수리권은 중요하지만, 대부분의 사용자는 오래된 기기를 계속 쓰지 않음
자동차 비유로 말하자면, 1999년식 Corolla가 완전히 오픈소스가 되어도 대부분은 새 차를 살 것임 - Apple Silicon과 Tahoe의 등장으로 OCLP의 미래가 불투명해졌음
Dortania 팀도 Apple Silicon 지원은 사실상 불가능하다고 했고, T2 칩이 들어간 Intel Mac들도 곧 지원이 끊길 듯함
결국 구형 Mac도 iPhone, iPad처럼 지원 종료 논의를 하게 될 날이 올 것 같음 - 최근 Mercari에서 iPad Air 1을 25달러에 구입했는데 상태가 아주 좋음
EPUB과 PDF는 잘 처리하지만, WebKit이 너무 오래되어 웹 브라우징은 거의 불가능함
커널은 2021년 버전으로 보이지만 WebKit은 2018년 이후 멈춘 듯함 - “다른 OS 설치를 막는다”는 게 구체적으로 어떻게 구현되는지 궁금함
-
약간 주제에서 벗어나지만, iPhone 5/5s/SE를 여러 대 가지고 있음
오프라인 전용으로 심박수 기록, 액션캠 제어, 음성 녹음 등에 사용 중임
여전히 작고 빠르고, 2025년에도 충분히 쓸 만함- 나도 더 벗어나서, Samsung Galaxy IV의 라디오 모듈을 제거해봤음
iPhone에서도 가능한지는 모르겠지만 흥미로운 실험이었음
- 나도 더 벗어나서, Samsung Galaxy IV의 라디오 모듈을 제거해봤음
-
Apple 입사 초기에 iOS 6과 Snow Leopard 프로젝트를 경험했음
이 글을 보니 예전 폐쇄형 OS 구조와 용어들이 떠올라서 반가웠음 -
2014년산 iPad Air를 여전히 사랑함
iOS 12.5가 마지막 버전이지만, 대부분의 앱은 잘 작동함
하루 6~7시간씩 쓰는데, 조금 더 최신 브라우저만 있으면 충분함- 이게 바로 계획적 진부화의 사례라고 생각함
Apple은 iOS에서 자체 렌더링 엔진을 쓰는 브라우저를 금지함
그래서 iOS 업데이트가 멈추면 Safari뿐 아니라 모든 브라우저와 WebView 앱이 동시에 구형이 되어버림
- 이게 바로 계획적 진부화의 사례라고 생각함
-
흥미롭긴 한데, 이 방법으로 iOS 26에서 iOS 18로 다운그레이드할 수 있으면 정말 마법 같을 것 같음
- 26(Tahoe)은 모든 플랫폼에서 버그가 많고 완성도가 낮음
MacBook과 iPhone 모두에서 품질이 예전만 못함 - 아마 EU 소송이라도 있어야 OS 다운그레이드가 가능해질 듯함
나도 옛날 폰을 iOS 16으로 돌려서 탈옥해보고 싶음 - 아쉽게도, 해당 기기에는 익스플로잇이 없음
- 26(Tahoe)은 모든 플랫폼에서 버그가 많고 완성도가 낮음
-
Apple 기기에도 Lineage OS 같은 대안 OS가 있었으면 좋겠음
- 문제의 근원은 부트로더 잠금 정책임
Apple이 이를 풀지 않는 한, 자유로운 OS 설치는 불가능함
- 문제의 근원은 부트로더 잠금 정책임
-
혹시 이 방법으로 iPhone 2G에 iPhone OS 1.0을 부팅할 수 있을까 궁금함
내 기기에서는 1.1.4까지만 부팅되고, 1.1.1은 FTL 초기화 실패로 멈춤
예전 긴급전화 해킹 활성화를 다시 해보고 싶지만, 그때 쓰던 2G는 잃어버렸음 -
흥미로운 글이었음
다만 코드 예시에서--bundle-id는 각 줄 앞에 붙는 것이므로, prepend가 맞음 -
오래된 iPad Air 1을 가지고 있는데, iOS 12에서 업그레이드 가능한지 궁금함
-
기업들이 더 이상 지원하지 않는 기기는 강제로 개방하도록 법제화되면 좋겠음