DevTeam이 iPhone을 정복한 방법
(fabiensanglard.net)- 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 해킹 커뮤니티 사이의 고양이와 쥐 게임이 시작됐고 이후에도 계속됨
댓글과 토론
Hacker News 의견들
- 펌웨어 업데이트에서는 흔한 방식임. 처음 0x400바이트는 이전 단계 로더가 이 단계를 부팅하기 전에 확인해야 하는 헤더라서, 데이터를 받아 자유롭게 쓰되 헤더만 쓰지 않음
헤더가 없으니 코드 실행으로 이어지지 않아 안전하고, 마지막에 전체 서명을 확인해서 통과하면 헤더를 써서 전체 이미지를 유효하게 만듦
여기서 트릭은 원하는 쓰기 위치보다 0x400바이트 앞에 먼저 쓰레기 0x400바이트를 쓰는 것임. 이 부분은 헤더로 취급되어 버퍼링만 되고 실제로 쓰이지 않으며, 나머지 전송 데이터는 원하는 위치에 실제로 쓰임. 이후 서명 검증은 실패하고, 원래 원치 않았던 첫 0x400바이트는 쓰이지 않으니 성공임- “복구 모드”라고 한 부분은 당시에는 DFU 모드라고 불렀던 것 같음. “Device firmware update”였고, 그때 “recovery”라고 불렀는지는 15년도 더 지나 확실하진 않음
- iZsh(https://x.com/izsh1911)도 알 수 있을 것 같지만, 10년도 더 전에 연락이 끊겼음
- Fabien의 글답게 잘 쓰였고 매우 자세함. 당시 이 iPhone 보호 장치를 분석하던 걸 봤던 기억이 나는데, 그 이후로 정말 긴 여정이었음
데이터 쓰기 전에 적용한 -0x400 이동도 누군가 더 설명해 주면 완전히 풀릴 것 같음- -0x400 이동은 대략 이렇게 동작하는 것처럼 보임
Seek(fd, 0xA0020000 - 0x400);로 데이터를 써야 할 위치보다 0x400 앞을 찾고,SendWrite(fd, foo, 0x400, false);로 쓰고 싶은 첫 0x400바이트를 0으로 채움
이어서SendWrite(fd, fw, fwsize, true);로 나머지 바이트를 실제 데이터로 채우고SendEndSecpack(fd);를 호출함. iPhone은 0x400바이트 이후의 데이터, 즉 쓰고 싶었던 전체 데이터를 복사한 뒤 서명 검증을 시도하고 실패함. 서명 검증에 성공했다면 0으로 남겨둔 첫 0x400바이트도 그때 복사됐을 것임
- -0x400 이동은 대략 이렇게 동작하는 것처럼 보임
- 역사 기록 차원에서, 내가 iPHUC를 만들었고, 그 이름은 19살 때 지은 것임. “nightwatch”라는 닉을 쓰던 사람이 초기 탈옥과 “jailbreak”라는 용어를 만든 주역이었고 같이 일하기 정말 좋았음
아마 PSP를 언락한 PDF나 TIFF 익스플로잇도 그가 담당했던 걸로 기억함. 남미 어딘가, 아마 대학에서 일하며 살았던 것 같지만 아는 건 거기까지임
정말 재미있는 시기였고 많이 배웠음. 다만 George Hotz가 일본어 문서 접근을 도와준 몇몇 사람들의 안전을, 그러지 말라는 반복된 요청에도 위험하게 만들었고, 그게 매우 답답했으며 결국 dev team이 프로젝트를 떠나게 된 이유였음- ARM 아키텍처를 이해하는 데 도움을 준 사람 중 “pineapple”이라는 닉을 쓰던 사람이 있었던 게 떠오름. 당시 ARM은 비교적 새로웠고, 그래서 초기 UI들에 파인애플이 많이 들어갔음. 정말 좋은 사람들이었는데 계속 연락하지 못한 게 아쉬움
- 명예훼손 소송 위험 없이 말할 수 있는 범위에서, George Hotz가 사람들의 안전을 어떻게 위험하게 만들었는지 더 듣고 싶음
- DeviceID, IMEI, ICCID를 이어 붙여 토큰을 만들고, 이를 Apple 서버인 albert.apple.com에 보내 Apple의 개인키로 서명받은 뒤, 기기에서
lockdownd가 Apple 공개키로 검증해 “Activated” 상태로 바꾸는 구조는 요즘 OAuth의 전신처럼 들림 - 아, 좋았던 시절. iPhone 해킹이 쉬웠던 때… 쉽다기보다는 지금보다 훨씬 쉬웠던 때였음
- 흐름도를 어떤 도구로 만들었는지 궁금함. 텍스트 기반처럼 보이고 mermaid보다 나을 수도 있어 보임
- 나는 https://asciiflow.com을 씀
- Monodraw처럼 보임. 며칠 전에도 HN에 다시 올라왔음
- 기억나는 일화로, iPhone OS 1.1 출시가 탈옥을 막았을 때 IRC 채널에 있었음. 당시 발견된 방법 중 하나는 1.0.2로 다운그레이드하고, 폰을 탈옥한 다음, iTunes에서 접근 가능한
/root/Media디렉터리를/로 심볼릭 링크하는 것이었음
이 링크는 업그레이드 중에도 유지됐고, 이후 펌웨어 업데이트를 하면rootfs에 접근할 수 있었음. 당시 이름은 iOS가 아니라 iPhone OS였음 - 초기 iPhone에서 “S”는 보안을 뜻하는 것 같음. 첫 제품을 출시하려다 보니 그렇게 된 셈임
자동차 제조사와도 비슷함. 새 제품이나 새 플랫폼의 초기 몇 년식은 사지 않는 게 좋음- “S”가 무엇을 뜻했는지에 대한 합의는 없고, Apple도 공식적으로 밝힌 적이 없음. “Successor”, “Second”, “Speed” 모두 어느 정도 맞아 보이지만 실제 답은 없음
보통 “S”는 기본 모델 대비 소폭 업그레이드를 나타내는 표시였음
- “S”가 무엇을 뜻했는지에 대한 합의는 없고, Apple도 공식적으로 밝힌 적이 없음. “Successor”, “Second”, “Speed” 모두 어느 정도 맞아 보이지만 실제 답은 없음