Cách DevTeam chinh phục iPhone
(fabiensanglard.net)- Chiếc iPhone đầu tiên năm 2007 không thể kích hoạt nếu không đăng ký AT&T tại Mỹ, và iPhone Dev Team đã công khai tìm cách dùng nó với các nhà mạng khác chỉ bằng phần mềm
- Công việc được gói gọn trong 6 cột mốc: giải mã firmware, vượt qua kích hoạt, giành quyền ghi, xây dựng toolchain ARM/Mach-O, chạy ứng dụng bên thứ ba và mở khóa khóa nhà mạng
- Bước đột phá ban đầu là phân tích ramdisk và DMG được mã hóa bên trong
.ipsw, cùng việc lợi dụng lỗ hổng phát lại trong cơ chế xác minh kích hoạt củalockdowndđể vào màn hình chính - Quyền ghi được giành bằng cách nạp ramdisk và kernelcache trong Recovery Mode rồi sửa
fstabvàServices.plist, đểafcdkhông còn bị nhốt trong/root/Mediamà có thể thao tác với hệ thống tập tin gốc - Việc unlock cuối cùng được tự động hóa bằng anySIM, công cụ dump, vá và nạp lại firmware baseband rồi chạy
AT+CLCK="PN",0,"00000000", còn Apple phản ứng bằng firmware v1.1.1 ngày 27/9/2007
iPhone năm 2007 và mục tiêu của DevTeam
- Apple phát hành iPhone vào ngày 29/6/2007, với giá khi đó là $499 cho bản 4GB và $599 cho bản 8GB
- iPhone vừa mở hộp ở trạng thái chưa kích hoạt, chỉ hiện màn hình
Connect to iTunes, và người dùng phải đăng ký thành viên AT&T trong iTunes - Ngay cả sau khi đăng ký, thiết bị vẫn bị khóa vào mạng AT&T
- Canada không có lịch phát hành iPhone đợt đầu, và Apple chỉ đạt thỏa thuận với Rogers khi iPhone 3G ra mắt ngày 11/7/2008
- iPhone Dev Team tập hợp với mục tiêu giúp thiết bị dùng được trên mọi nhà mạng chỉ bằng phần mềm, và thường xuyên công bố tiến độ trên blog iphone.fiveforty.net
- Riêng ngày 3/7/2007 đã có 8 bản cập nhật được đăng từ 0 giờ đến 21 giờ
6 cột mốc của DevTeam
- Để biến một thiết bị bị khóa thành smartphone dùng như bình thường, cần các bước sau
- Quyền đọc để hiểu hệ thống: Break DMG Password
- Thoát khỏi trạng thái chưa kích hoạt: Bypass Activation
- Quyền ghi để chỉnh sửa hệ thống: Get Write Access
- Working Toolchain để tạo tệp thực thi tùy chỉnh
- Unlock để baseband có thể kết nối với bất kỳ nhà mạng nào
- Ứng dụng tự động hóa toàn bộ quy trình: Enable Third-Party Applications
- Theo Wayback Machine, đến ngày 6/7/2007 thì 2 trong số 6 cột mốc đã hoàn thành, và hành trình kết thúc vào ngày 12/9/2007
- Trang trạng thái được crawl ngày 25/9/2007 hiển thị
Decrypt Firmware,Bypass Activation,Get Write Access,Get Working Toolchain,Enable Third-party Applications,Unlock Phoneđều đã hoàn tất
Phân tích .ipsw và quyền đọc hệ thống tập tin
- iTunes tải về kho lưu trữ iPhone Software với phần mở rộng
.ipswđể phục hồi thiết bị, và tệp này thực chất là định dạng zip - Bên trong
iPhone1,1_1.0_1A543a_Restore.ipswcó ảnh phục hồiimg2, thư mụcFirmwareliên quan đến baseband,kernelcachelà kernel iOS, cùng hai tệp DMG lớn- Toàn bộ kho lưu trữ phục hồi iOS có kích thước khoảng 105MiB
- DMG đầu tiên,
694-5259-38.dmg, là ramdisk dùng trong quá trình phục hồi và không được mã hóa nên có thể mount bằngdd - Ramdisk không phải toàn bộ hệ thống tập tin iOS, nhưng cho phép kiểm tra mật khẩu của người dùng chạy ứng dụng
mobilevàroot, tài khoản chạy các tiến trình còn lại, trong/private/etc/master.passwd - DMG thứ hai,
694-5262-39.dmg, là hệ thống tập tin iOS dùng khi máy chạy bình thường và đã được mã hóa- Khóa được tìm thấy trong
/usr/sbin/asrtrên ramdisk - Vì đó là khóa chứ không phải passphrase nên không thể dùng
hdiutil, và DevTeam đã viết công cụ giải mã riêngvfdecrypt.c - Sau khi giải mã, họ có được quyền đọc toàn bộ hệ thống tập tin thời gian chạy
- Khóa được tìm thấy trong
Vượt qua kích hoạt
- Quá trình kích hoạt chuẩn có sự tham gia của iTunes, máy chủ Apple
albert.apple.comvàlockdowndtrên iPhone- iTunes thu thập
DeviceID,IMEI,ICCIDcủa thiết bị - Gộp ba giá trị này thành token và gửi lên máy chủ Apple
- Máy chủ Apple ký token bằng khóa riêng rồi gửi trả lại
lockdowndđang chờ qua USB sẽ xác minh token bằng khóa công khai của Apple- Nếu token đúng là từ Apple và khớp thông tin thiết bị, trạng thái sẽ chuyển sang Activated
- iTunes thu thập
PhoneActivationServercủa dvdjon vá iTunes để truy cập máy chủ kích hoạt qua HTTP thay vì HTTPS, rồi chuyển yêu cầu sang máy chủ riêng- Điểm mấu chốt là không tạo token đã ký mới, mà dùng cách phát lại: trả về cùng một signed token đã bắt được từ một lần kích hoạt thành công, bất kể đầu vào là gì
- Theo công bố của George Hotz,
lockdowndkhông kiểm tra xemDeviceID,IMEI,ICCIDtrong phản hồi có khớp với giá trị thật hay không - DevTeam tạo một CLI
toolsđọc signed token được hard-code từ plist rồi gửi vào iPhone, sau đó cải tiến thànhiPhoneInterfacehoạt động không cần iTunes
Quyền ghi và jailbreak
- Một chiếc iPhone đã kích hoạt có thể nhận các tệp như nhạc và ảnh từ iTunes, nhưng tiến trình phụ trách upload là
afcdbị nhốt trong chroot jail tại/root/Media - Chỉ phân vùng người dùng được mount ở chế độ đọc/ghi (
rw), còn phân vùng hệ thống là chỉ đọc (r) - Mục tiêu là thoát khỏi chroot jail và ghi được cả phân vùng hệ thống, và từ đây xuất hiện thuật ngữ jailbreaking
- Quá trình khởi động iPhone được chia thành chế độ bình thường và Recovery Mode
- Chế độ bình thường đi theo chuỗi BootROM → LLB → iBoot → Kernel → Normal Mode, và mỗi bước đều xác minh chữ ký của bước kế tiếp
- Recovery Mode dừng ở giai đoạn iBoot, nơi iTunes nạp ramdisk, kernelcache và các thành phần khác vào RAM để vào chế độ khôi phục
- DevTeam khảo sát cách iTunes ghi vào hệ thống tập tin trong lúc phục hồi bên trong
iTunesMobile.dll, qua đó phát hiện các lệnh nhưmount,umount,ditto iPHUClà công cụ CLI dùng các phương thức không công khai trongiTunesMobile.dllđể giao tiếp với thiết bị đang ở Recovery Mode- Người dùng đưa thiết bị vào Recovery Mode
- Gửi ramdisk sang thiết bị và nạp nó vào RAM
- Gửi kernelcache và khởi động kernel để trỏ tới ramdisk
- Thiết bị vào Restore Mode
- Quy trình jailbreak thực tế được thực hiện bằng cách sửa
fstabvàServices.plist- Trong
fstab, phân vùng hệ thống được đổi từ mount chỉ đọc sang rw - Trong
Services.plist, tạo dịch vụafcdthứ hai dùng/làm gốc thay vì/root/Media - Sau khi khởi động lại, iTunes có thể nhìn thấy toàn bộ hệ thống tập tin qua
afcd2, và cả phân vùng hệ thống lẫn người dùng đều đọc/ghi được
- Trong
- Về sau, kích hoạt và quyền ghi được tự động hóa bằng ứng dụng desktop Mac OS X INdependence
Toolchain và ứng dụng bên thứ ba
- Có không nhiều thông tin công khai về quá trình xây dựng toolchain và chạy ứng dụng bên thứ ba, nhưng ít nhất 12 người đã tham gia
- Ngày 19/7/2007, binutils toolchain nhắm tới ARM đã hoàn tất, cho phép DevTeam chạy các chương trình do chính họ tạo trên iPhone
ARM/Mach-O Toolchaincủa Nightwatch đã biên dịch ứng dụng độc lậpHello Worldđầu tiên và chạy nó trên iPhone- GeoHotz cho biết trước đó chưa từng có tổ hợp Mach-O và ARM bên ngoài Apple, nên họ phải tự viết lấy
- Một mục tiêu khác của toolchain là tái dựng
MobileTerminal.h, thứ phơi bày các hàm không công khai củaiTunesMobile.so, để giao tiếp vớiafcmà không cần chạy iTunes - Một số bài thuyết trình nói rằng kernel kiểm tra chữ ký tệp thực thi trước
execl, nhưng tổng kết cho thấy iPhone đời đầu không làm vậy và cơ chế này có vẻ chỉ được thêm vào từ v1.1.1
Mở khóa baseband và anySIM
- iPhone được chia thành phần smartphone chạy iOS và phần baseband đảm nhiệm điện thoại/modem
- Hai hệ thống này có RAM, CPU, bộ nhớ lưu trữ, firmware và oscillator riêng
- Chúng giao tiếp bằng lệnh AT qua đường UART được mount tại
/dev/tty.baseband
- Lệnh AT cần cho việc unlock đã được biết đến từ rất sớm
AT+CLCK="PN",0,"xxxxxxxx"xxxxxxxxlà NCK hay Network Control Key, được cho là riêng cho từng thiết bị- Số lần thử bị giới hạn từ 3 đến 10, sau đó firmware có thể hard-lock vào AT&T
- Baseband cũng có BootROM và chuỗi tin cậy riêng, với cơ chế xác minh chữ ký
- MuscleNerd giải thích rằng baseband không có lưới an toàn như DFU/Recovery Mode, nên nếu đụng sai vào NOR hoặc image thì có thể làm hỏng thiết bị vĩnh viễn
- Tháng 7/2007, DevTeam đảo ngược baseband trong
.ipswvà cũng phân tích/usr/local/bin/bbupdatertrên ramdisk để hiểu các lệnh nạp baseband mới - CLI đầu tiên là
iUnlock, yêu cầu nhiều tệp như firmware đã dumpnorvàICE03.12.06_G.fls - Sau đó xuất hiện ứng dụng
anySIMđơn giản hơn, chỉ cần chép vào điện thoại rồi bấm một nút để chạy anySIMhoạt động theo trình tự sau- Mở
/dev/tty.basebandvà thiết lập tham số modem - Dump baseband kích thước 4MiB, tức NOR, vào
/tmp - Nạp baseband vào RAM
- Nạp secpack
ICE03.12.06_G.flslấy từ ramdisk - Vá các lệnh baseband trong RAM để cho phép unlock với bất kỳ NCK nào
- Nạp lại baseband đã vá
- Chạy
AT+CLCK="PN",0,"00000000"vàAT+CLCK="PN",2
- Mở
Mẹo -0x400
- Firmware baseband đã vá lẽ ra không thể vượt qua kiểm tra chữ ký, nên việc nạp lên đáng lẽ phải thất bại
- Cách vượt qua dùng offset minus 0x400
- GeoHotz giải thích rằng
0x400byte đầu tiên không được dùng trước khi xác minh chữ ký, nên có thể bắt đầu ghi từ vị trí sớm hơn0x400byte - Về sau, theo giải thích của độc giả Hacker News, baseband nhận firmware mới theo từng khối tối đa
0x800byte- Nó không lưu toàn bộ 4MiB vào RAM rồi mới kiểm tra checksum và ghi vào flash
- Các byte nhận được được ghi ngay vào flash, nhưng
0x400byte đầu tiên được buffer trong RAM - Khi upload xong, baseband mới kiểm tra checksum
- Nếu thất bại thì
0x400byte đầu đã được buffer sẽ không bị ghi vào flash mà bị loại bỏ
- Cách
-0x400hoạt động bằng việc trước tiên ghi dữ liệu rác vào vị trí sớm hơn firmware gốc0x400byte, rồi gửi tiếp firmware 4MiB- Checksum sẽ thất bại nên
0x400byte rác bị loại bỏ - Nhưng phần firmware mới còn lại đã được ghi đúng vị trí trên flash từ trước
- Checksum sẽ thất bại nên
Hoàn tất và trò mèo vờn chuột sau đó
- Hướng dẫn unlock hoàn toàn bằng phần mềm được công bố ngày 12/9/2007
- Cùng lúc đó, các trường hợp thành công theo từng châu lục cũng được công bố, bao gồm cả Canada
- Apple nhanh chóng phát hành iPhone firmware v1.1.1 vào ngày 27/9/2007
- Thanh trạng thái tiến độ của DevTeam được đặt lại thành
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 - Từ đây bắt đầu trò mèo vờn chuột giữa Apple và cộng đồng hack iPhone, và cuộc đối đầu đó tiếp tục về sau
1 bình luận
Ý kiến trên Hacker News
Vì không có header nên an toàn do không dẫn đến thực thi mã; cuối cùng, nếu kiểm tra toàn bộ chữ ký thành công thì mới ghi header để biến toàn bộ image thành hợp lệ
Mánh ở đây là trước tiên ghi 0x400 byte rác vào vị trí cách trước nơi muốn ghi 0x400 byte. Phần này bị xem là header nên chỉ được buffer chứ không thực sự ghi, còn phần dữ liệu truyền còn lại thì được ghi thật vào vị trí mong muốn. Sau đó việc xác minh chữ ký thất bại, và 0x400 byte đầu vốn không mong muốn cũng không được ghi, vậy là thành công
Việc dịch -0x400 áp dụng trước khi ghi dữ liệu có lẽ cũng sẽ được làm rõ hoàn toàn nếu ai đó giải thích thêm
Dùng
Seek(fd, 0xA0020000 - 0x400);để trỏ tới vị trí trước nơi cần ghi dữ liệu 0x400 byte, rồi dùngSendWrite(fd, foo, 0x400, false);để lấp 0x400 byte đầu muốn ghi bằng số 0Tiếp đó dùng
SendWrite(fd, fw, fwsize, true);để điền các byte còn lại bằng dữ liệu thật và gọiSendEndSecpack(fd);. iPhone sao chép dữ liệu sau 0x400 byte, tức toàn bộ dữ liệu muốn ghi, rồi thử xác minh chữ ký và thất bại. Nếu xác minh chữ ký thành công, có lẽ 0x400 byte đầu để nguyên là 0 cũng đã được sao chép vào lúc đóTôi nhớ hình như anh ấy cũng phụ trách exploit PDF hoặc TIFF đã unlock PSP. Có vẻ anh ấy sống ở đâu đó tại Nam Mỹ, có lẽ làm việc ở một trường đại học, nhưng tôi chỉ biết đến vậy
Đó là một giai đoạn rất vui và tôi đã học được rất nhiều. Tuy nhiên, George Hotz đã khiến sự an toàn của một số người giúp truy cập tài liệu tiếng Nhật bị đặt vào nguy hiểm, dù đã nhiều lần được yêu cầu đừng làm vậy; điều đó rất bực bội và cuối cùng là lý do dev team rời dự án
lockdowndxác minh bằng khóa công khai của Apple và chuyển sang trạng thái “Activated”, nghe giống như tiền thân của OAuth ngày nay/root/Mediamà iTunes có thể truy cập tới/Liên kết này vẫn được giữ trong quá trình nâng cấp, và sau khi cập nhật firmware thì có thể truy cập
rootfs. Khi đó nó chưa được gọi là iOS mà là iPhone OSCũng giống các hãng xe hơi. Tốt nhất là không nên mua vài đời năm đầu của một sản phẩm mới hoặc nền tảng mới
Thông thường “S” là ký hiệu cho nâng cấp nhỏ so với mẫu cơ bản