- 2007년 첫 iPhone은 미국 AT&T 가입 없이는 활성화되지 않았고, iPhone Dev Team은 소프트웨어만으로 다른 통신사에서 쓰는 길을 공개적으로 찾아감
- 작업은 펌웨어 해독, 활성화 우회, 쓰기 권한 확보, ARM/Mach-O 툴체인 구축, 서드파티 앱 실행, 통신사 잠금 해제로 이어지는 6개 마일스톤으로 정리됨
- 초기 돌파구는
.ipsw안의 ramdisk와 암호화된 DMG 분석, 그리고lockdownd활성화 검증의 재전송 허점을 이용한 홈 화면 접근이었음 - 쓰기 권한은 Recovery Mode에서 ramdisk와 kernelcache를 올린 뒤
fstab과Services.plist를 바꿔,/root/Media에 갇힌afcd대신 루트 파일시스템을 다루게 하며 확보됨 - 최종 언락은 baseband 펌웨어를 덤프·패치·재업로드하고
AT+CLCK="PN",0,"00000000"을 실행하는 anySIM으로 자동화됐으며, Apple은 2007년 9월 27일 firmware v1.1.1로 대응함
2007년 iPhone과 DevTeam의 목표
- Apple은 2007년 6월 29일 iPhone을 출시했고, 당시 가격은 4GB 모델 $499, 8GB 모델 $599였음
- 박스에서 꺼낸 iPhone은
Connect to iTunes화면만 보이는 비활성 상태였고, 사용자는 iTunes에서 AT&T 멤버십에 가입해야 했음 - 가입 뒤에도 기기는 AT&T에 잠긴 상태로 남아 있었음
- 캐나다에는 초기 iPhone 출시 일정이 없었고, Apple은 2008년 7월 11일 iPhone 3G와 함께 Rogers와 합의함
- iPhone Dev Team은 소프트웨어만으로 어떤 통신사에서도 기기를 쓰게 하는 것을 목표로 모였고, iphone.fiveforty.net 블로그에서 진행 상황을 자주 공개함
- 2007년 7월 3일에는 0시부터 21시까지 8개의 업데이트가 올라감
DevTeam의 6개 마일스톤
- 잠긴 기기를 일반 스마트폰처럼 쓰기 위해 다음 단계가 필요했음
- 시스템 이해를 위한 읽기 접근: Break DMG Password
- 비활성 상태 탈출: Bypass Activation
- 시스템 수정을 위한 쓰기 접근: Get Write Access
- 커스텀 실행 파일 생성을 위한 Working Toolchain
- baseband가 어떤 통신사에도 연결되도록 하는 Unlock
- 전체 과정을 자동화할 앱: Enable Third-Party Applications
- Wayback Machine 기준 2007년 7월 6일에는 6개 중 2개 마일스톤이 완료되어 있었고, 여정은 2007년 9월 12일 끝남
- 2007년 9월 25일 크롤링된 상태 페이지에는
Decrypt Firmware,Bypass Activation,Get Write Access,Get Working Toolchain,Enable Third-party Applications,Unlock Phone이 완료 상태로 표시됨
.ipsw 분석과 파일시스템 읽기
- iTunes는 기기 복원용으로
.ipsw확장자의 iPhone Software 아카이브를 내려받았고, 이 파일은 zip 형식이었음 iPhone1,1_1.0_1A543a_Restore.ipsw안에는img2복구 이미지, baseband 관련Firmware폴더, iOS 커널인kernelcache, 두 개의 큰 DMG 파일이 들어 있었음- 전체 iOS 복원 아카이브 크기는 약 105MiB였음
- 첫 번째 DMG인
694-5259-38.dmg는 복원 때 쓰는 ramdisk였고 암호화되어 있지 않아dd로 마운트할 수 있었음 - ramdisk는 iOS 전체 파일시스템은 아니었지만,
/private/etc/master.passwd에서 앱 실행 사용자mobile과 나머지 프로세스를 실행하는root의 암호를 확인할 수 있게 했음 - 두 번째 DMG인
694-5262-39.dmg는 정상 실행 때 쓰는 iOS 파일시스템이었고 암호화되어 있었음- ramdisk의
/usr/sbin/asr안에서 키가 발견됨 - passphrase가 아니라 키였기 때문에
hdiutil을 쓸 수 없었고, DevTeam은 자체 복호화 도구vfdecrypt.c를 작성함 - 복호화 뒤 런타임 파일시스템 전체에 대한 읽기 접근을 얻음
- ramdisk의
활성화 우회
- 정상 활성화에는 iTunes, Apple 서버
albert.apple.com, iPhone의lockdownd가 관여함- iTunes가 기기의
DeviceID,IMEI,ICCID를 수집함 - 세 값을 토큰으로 묶어 Apple 서버로 보냄
- Apple 서버가 개인키로 토큰에 서명해 돌려줌
- USB로 대기 중인
lockdownd가 Apple 공개키로 토큰을 검증함 - 토큰이 Apple에서 왔고 기기 정보와 맞으면 상태가 Activated로 바뀜
- iTunes가 기기의
- dvdjon의
PhoneActivationServer는 iTunes를 패치해 HTTPS 대신 HTTP로 활성화 서버에 접근하게 하고, 요청을 자체 서버로 돌렸음 - 핵심은 서명된 토큰을 새로 만들지 않고, 성공한 활성화에서 캡처한 같은 signed token을 입력과 무관하게 되돌려주는 재전송 방식이었음
- George Hotz의 발표에 따르면
lockdownd는 응답 안의DeviceID,IMEI,ICCID가 실제 값과 맞는지 확인하지 않았음 - DevTeam은 하드코딩된 signed token을 plist에서 읽어 iPhone으로 보내는 CLI
tools를 만들었고, 이후 iTunes 없이 동작하는iPhoneInterface로 개선함
쓰기 권한과 탈옥
- 활성화된 iPhone은 iTunes에서 음악과 사진 같은 파일을 올릴 수 있었지만, 업로드 담당 프로세스
afcd는/root/Media에 chroot jail로 갇혀 있었음 - 사용자 파티션만 읽기/쓰기(
rw)로 마운트됐고, 시스템 파티션은 읽기 전용(r)이었음 - 목표는 chroot jail을 벗어나 시스템 파티션까지 쓸 수 있게 만드는 것이었고, 여기서 jailbreaking이라는 말이 나옴
- iPhone 부팅은 일반 모드와 Recovery Mode로 나뉨
- 일반 모드는 BootROM → LLB → iBoot → Kernel → Normal Mode로 이어지고, 각 단계는 다음 단계의 서명을 확인함
- Recovery Mode는 iBoot 단계에서 멈추며, iTunes가 ramdisk와 kernelcache 등을 RAM으로 올려 복원 모드로 진입함
- DevTeam은
iTunesMobile.dll안에서 iTunes가 복원 중 파일시스템에 쓰는 방식을 조사해mount,umount,ditto같은 명령을 확인함 iPHUC는iTunesMobile.dll의 비공개 메서드로 Recovery Mode 기기와 통신하는 CLI 도구였음- 사용자가 기기를 Recovery Mode로 넣음
- ramdisk를 기기로 전송하고 RAM에 로드함
- kernelcache를 보내고 ramdisk를 가리키도록 커널을 부팅함
- 기기가 Restore Mode에 들어감
- 실제 탈옥 절차는
fstab과Services.plist수정으로 이뤄짐fstab에서 시스템 파티션을 읽기 전용이 아니라 rw로 마운트하게 바꿈Services.plist에/root/Media가 아니라/를 기준으로 하는 두 번째afcd서비스를 만듦- 재부팅 뒤 iTunes는
afcd2를 통해 전체 파일시스템을 볼 수 있었고, 시스템과 사용자 파티션 모두 읽기/쓰기가 가능해짐
- 이후 활성화와 쓰기 접근은 Mac OS X 데스크톱 앱 INdependence로 자동화됨
툴체인과 서드파티 앱
- 툴체인과 서드파티 앱 실행 과정은 공개된 정보가 많지 않지만, 최소 12명이 작업에 참여함
- 2007년 7월 19일에는 ARM을 타깃으로 하는 binutils toolchain이 완성되어 DevTeam이 직접 만든 프로그램을 iPhone에서 실행할 수 있게 됨
- Nightwatch의
ARM/Mach-O Toolchain으로 첫 독립Hello World애플리케이션이 컴파일되고 iPhone에서 실행됨 - GeoHotz는 Apple 밖에서 Mach-O와 ARM 조합은 이전에 없었고 직접 작성해야 했다고 설명함
- 툴체인의 또 다른 목표는
iTunesMobile.so의 비공개 함수를 노출하는MobileTerminal.h를 재구성해 iTunes 실행 없이afc와 통신하는 것이었음 - 몇몇 발표는 커널이
execl전에 실행 파일 서명을 확인한다고 말하지만, 첫 iPhone은 그렇게 하지 않았고 v1.1.1에서 도입된 것으로 보인다고 정리됨
baseband 언락과 anySIM
- iPhone은 iOS가 실행되는 스마트폰 부분과 전화·모뎀 역할을 하는 baseband 부분으로 나뉨
- 두 시스템은 각각 RAM, CPU, 저장소, 펌웨어, 오실레이터를 가짐
- 둘은
/dev/tty.baseband에 마운트된 UART 라인으로 AT 명령을 주고받음
- 언락에 필요한 AT 명령은 초반부터 알려져 있었음
AT+CLCK="PN",0,"xxxxxxxx"xxxxxxxx는 Network Control Key인 NCK이며, 기기마다 고유하다고 여겨졌음- 시도 횟수는 3~10회로 제한되고, 이후 펌웨어가 AT&T에 하드락될 수 있었음
- baseband에도 BootROM과 신뢰 체인이 있었고, 서명 검증이 적용됨
- MuscleNerd는 baseband에는 DFU/Recovery Mode 같은 안전망이 없어 NOR나 이미지를 잘못 건드리면 기기를 영구적으로 망가뜨릴 수 있다고 설명함
- 2007년 7월 DevTeam은
.ipsw안의 baseband를 리버스 엔지니어링했고, ramdisk 안의/usr/local/bin/bbupdater도 분석해 새 baseband를 업로드하는 명령을 파악함 - 첫 CLI
iUnlock은 덤프된 펌웨어nor와ICE03.12.06_G.fls같은 여러 파일이 필요했음 - 이후 더 간단한
anySIM앱이 나와, 휴대폰에 올린 뒤 버튼 하나로 실행할 수 있게 됨 anySIM은 다음 순서로 동작함/dev/tty.baseband를 열고 모뎀 파라미터를 설정함- 4MiB 크기의 baseband, 즉 NOR를
/tmp로 덤프함 - baseband를 RAM에 로드함
- ramdisk에서 나온
ICE03.12.06_G.flssecpack을 로드함 - RAM 안의 baseband 명령을 패치해 어떤 NCK도 언락을 허용하게 만듦
- 패치된 baseband를 다시 업로드함
AT+CLCK="PN",0,"00000000"와AT+CLCK="PN",2를 실행함
-0x400 트릭
- 패치된 baseband 펌웨어는 원래라면 서명 검사를 통과하지 못해 업로드가 실패해야 정상임
- 우회는 minus 0x400 오프셋을 이용했음
- GeoHotz는 처음
0x400바이트는 서명이 검증되기 전까지 쓰이지 않으므로0x400바이트 앞에서 쓰기 시작하면 된다고 설명함 - 이후 Hacker News 독자들의 설명에 따르면 baseband는 새 펌웨어를 최대
0x800바이트 청크로 받음- 전체 4MiB를 RAM에 저장한 뒤 체크섬을 확인하고 플래시에 쓰는 구조가 아님
- 수신한 바이트는 즉시 플래시에 기록되지만, 처음
0x400바이트만 RAM에 버퍼링됨 - 업로드가 끝나면 baseband가 체크섬을 검사함
- 실패하면 버퍼링된 첫
0x400바이트는 플래시에 기록되지 않고 버려짐
-0x400방식은 먼저 원래 펌웨어 위치보다0x400바이트 앞에 쓰레기 데이터를 쓰고, 이어서 4MiB 펌웨어를 보내는 방식임- 체크섬은 실패해 쓰레기
0x400바이트가 버려짐 - 하지만 나머지 새 펌웨어는 올바른 위치에 이미 플래시됨
- 체크섬은 실패해 쓰레기
완료와 이후의 고양이와 쥐 게임
- 전체 소프트웨어 언락 지침은 2007년 9월 12일 공개됨
- 함께 대륙별 성공 사례가 공개됐고, 캐나다 사례도 포함됨
- Apple은 2007년 9월 27일 iPhone firmware v1.1.1을 빠르게 출시함
- DevTeam의 진행 상태 막대는
Decrypt 1.1.1,Get Write Access 1.1.1,Activate 1.1.1,Unlock 1.1.1,Enable Third-party Applications 1.1.1로 초기화됨 - 이때부터 Apple과 iPhone 해킹 커뮤니티 사이의 고양이와 쥐 게임이 시작됐고 이후에도 계속됨