1 điểm bởi GN⁺ 2024-03-11 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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ủa lockdownd để 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 fstabServices.plist, để afcd không còn bị nhốt trong /root/Media mà 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.ipsw có ảnh phục hồi img2, thư mục Firmware liên quan đến baseband, kernelcache là 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ằng dd
  • 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 mobileroot, 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/asr trê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êng vfdecrypt.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

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.comlockdownd trên iPhone
    • iTunes thu thập DeviceID, IMEI, ICCID củ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
  • PhoneActivationServer củ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, lockdownd không kiểm tra xem DeviceID, IMEI, ICCID trong 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ành iPhoneInterface hoạ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à afcd bị 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
  • iPHUC là công cụ CLI dùng các phương thức không công khai trong iTunesMobile.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 fstabServices.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ụ afcd thứ 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
  • 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 Toolchain của Nightwatch đã biên dịch ứng dụng độc lập Hello 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ủa iTunesMobile.so, để giao tiếp với afc mà 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"
    • xxxxxxxxNCK 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 .ipsw và cũng phân tích /usr/local/bin/bbupdater trê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 đã dump norICE03.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
  • anySIM hoạt động theo trình tự sau
    • Mở /dev/tty.baseband và 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.fls lấ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"AT+CLCK="PN",2

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 0x400 byte đầ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ơn 0x400 byte
  • 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 0x800 byte
    • 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 0x400 byte đầu tiên được buffer trong RAM
    • Khi upload xong, baseband mới kiểm tra checksum
    • Nếu thất bại thì 0x400 byte đầu đã được buffer sẽ không bị ghi vào flash mà bị loại bỏ
  • Cách -0x400 hoạ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ốc 0x400 byte, rồi gửi tiếp firmware 4MiB
    • Checksum sẽ thất bại nên 0x400 byte 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

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

 
GN⁺ 2024-03-11
Ý kiến trên Hacker News
  • Đây là cách làm phổ biến trong các bản cập nhật firmware. 0x400 byte đầu tiên là header mà loader ở giai đoạn trước phải kiểm tra trước khi boot giai đoạn này, nên nó nhận dữ liệu và cho ghi tự do, nhưng không ghi phần header
    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
    • Phần được gọi là “chế độ khôi phục” hồi đó có lẽ được gọi là chế độ DFU. Nó là “Device firmware update”, và sau hơn 15 năm thì tôi không chắc lúc đó có gọi là “recovery” hay không
    • iZsh(https://x.com/izsh1911) cũng có thể biết, nhưng tôi đã mất liên lạc hơn 10 năm trước
  • Đúng phong cách của Fabien, bài viết rất hay và cực kỳ chi tiết. Tôi nhớ đã từng thấy việc phân tích cơ chế bảo vệ iPhone này hồi đó, và kể từ đó quả là một hành trình rất dài
    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ịch -0x400 có vẻ hoạt động đại khái như thế này
      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ùng SendWrite(fd, foo, 0x400, false); để lấp 0x400 byte đầu muốn ghi bằng số 0
      Tiế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ọi SendEndSecpack(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 đó
  • Để ghi lại lịch sử, tôi là người đã tạo iPHUC, và cái tên đó tôi đặt khi 19 tuổi. Người dùng nickname “nightwatch” là nhân vật chủ chốt trong jailbreak ban đầu và trong việc tạo ra thuật ngữ “jailbreak”, và làm việc cùng anh ấy thật sự rất tuyệt
    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
    • Tôi nhớ có một người dùng nickname “pineapple” đã giúp tôi hiểu kiến trúc ARM. Khi đó ARM còn khá mới, nên trong các UI ban đầu có rất nhiều dứa. Họ thật sự là những người rất tốt, và tôi tiếc là đã không giữ liên lạc
    • Trong phạm vi có thể nói mà không gặp rủi ro kiện phỉ báng, tôi muốn nghe thêm George Hotz đã khiến sự an toàn của mọi người bị đe dọa như thế nào
  • Cấu trúc nối DeviceID, IMEI và ICCID để tạo token, gửi nó tới máy chủ Apple là albert.apple.com để được ký bằng khóa riêng của Apple, rồi trên thiết bị lockdownd xá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
  • À, những ngày xưa tốt đẹp. Thời hack iPhone còn dễ… nói đúng hơn là dễ hơn bây giờ rất nhiều
  • Tôi tò mò không biết họ dùng công cụ nào để tạo sơ đồ luồng. Trông có vẻ dựa trên văn bản và có khi còn tốt hơn mermaid
    • Tôi dùng https://asciiflow.com
    • Trông giống Monodraw. Vài ngày trước nó cũng lại xuất hiện trên HN
  • Một chuyện tôi còn nhớ là tôi đã ở trong kênh IRC khi iPhone OS 1.1 được phát hành và chặn jailbreak. Một trong những cách được tìm ra lúc đó là downgrade về 1.0.2, jailbreak điện thoại, rồi tạo symlink thư mục /root/Media mà 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 OS
  • Có vẻ chữ “S” trong các iPhone đời đầu nghĩa là bảo mật. Có lẽ đó là hệ quả của việc cố ra mắt sản phẩm đầu tiên
    Cũ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
    • Không có đồng thuận nào về việc “S” nghĩa là gì, và Apple cũng chưa từng công bố chính thức. “Successor”, “Second”, “Speed” đều nghe có vẻ đúng ở mức nào đó, nhưng không có câu trả lời thật sự
      Thông thường “S” là ký hiệu cho nâng cấp nhỏ so với mẫu cơ bản