1P by GN⁺ 3일전 | ★ favorite | 댓글 1개
  • 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-datarandom-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.plistoptions.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로 오버라이드
  • FairPlay 데몬LimitLoadToHardware 키 제거로 iPod touch 3에서도 활성화 가능
  • iOS 6.1 이상에서는 LaunchDaemon 서명 캐시로 인해 추가 패치 필요
  • Product ID 맵 수정: iPhone 3GS의 0x2714를 iPod touch 3의 0x2715로 교체
  • MobileGestaltgetDeviceVariant()를 수정해 항상 "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에서도 가능한지는 모르겠지만 흥미로운 실험이었음
  • 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으로 돌려서 탈옥해보고 싶음
    • 아쉽게도, 해당 기기에는 익스플로잇이 없음
  • 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에서 업그레이드 가능한지 궁금함

  • 기업들이 더 이상 지원하지 않는 기기는 강제로 개방하도록 법제화되면 좋겠음