iPhone Boot Chain
Boot chain

SecureROM
SecureROM là đoạn code đầu tiên CPU (Application Processor - chip A-series chạy) ngay khi có điện ở EL3 (đặc quyền cao nhất), PC nhảy đến địa chỉ trong reset vector.
Code được ghi trực tiếp vào silicon lúc sản xuất, không thể vá bằng cập nhật software. Các chip A5-A11 vĩnh viễn vulnerable với checkm8.
Có 3 đường boot:
- SecureROM nạp LLB rồi đến iBoot (A10 trở lên thì nạp thẳng iBoot), nếu env var auto-boot=true thì iBoot thực thi boot-command=fsboot nạp kernelcache với root=fsys. Nếu auto-boot=false, không tự boot mà chuyển sang iBEC (recovery mode).
- Cập nhật OTA: update qua internet đổi boot-command=upgrade, iBoot chuyển sang iBEC, iBEC nạp kernelcache với root=upgrade DMG để cài bản update.
- DFU, recovery: Hoặc user giữ GPIO keys side + home/volumn khi bật máy, hoặc SecureROM không nạp được bước tiếp theo (failure). Máy vào DFU đợi USB host gửi iBSS image, rồi sang iBEC, rồi kernelcache với root=recovery DMG để restore máy.
Version của SecureROM giống với iBoot lúc chip được sản xuất. Version này xem được từ host trng serial number khi device trong DFU mode.
Common code

Các boot component chia sẻ lượng lớn codebase, và thực hiện chung 1 số việc như sau:
- Rebase loop: check nếu code được load ở VA đã chỉ định trước, nếu chưa thì di chuyển code ra đó bằng cách copy.
- Platform bootstrapping: khởi tạo CPU, vector base address register (VBAR), MMU, ARM MSRs.
- Task management, multithreading: phục vụ chính cho iBoot.
- IMG3/IMG4 decoding.
- Certificate handling: chứa hardcoded certificate, DER-code để verify images với public key.
Trên thiết bị mới vẫn coi như có 4 images LLB, iBoot, iBEC, iBSS nhưng thật ra là một image iBoot handle mọi phases.
Chain of Trust
Vì hardcoded root certificate đã ghi trong ROM, không thể bị thay đổi -> trở thành root of trust -> SecureROM verify iBoot -> iBoot verify kernelcache.
Có thể dump được certificate ở ROM.
Boot partition
Trên máy đời mới, các boot component có thể update được (iBoot, device tree - cấu trúc mô tả cây phần cứng, logo,…), và được chép từ IPSW vào boot partition (NVMe namespace thứ 2, thứ 1 là filesystem gốc và user data).
IPSW — các file riêng Boot partition
┌─ Container IMG4 ────────────┐
iBoot / LLB ─────────────────────►│ illb: bootloader │
DeviceTree ──────────────────────►│ dtre: thông tin phần cứng │
Logo ────────────────────────────►│ logo: hình quả táo │
Các hình pin, recovery… ─────────►│ bat0, batF, recm… │
APTicket ────────────────────────►│ thông tin xác thực đã ký │
└────────────────────────────┘Với bootloader còn mã hóa, SecureROM phải giải mã với GID khi load để chạy.
DFU mode
DFU = Device Firmware Update, vào khi SecureROM không boot được tiếp. DFU là chuẩn USB có tài liệu public.
Mỗi device đều có device descriptor (số), mô tả chung về thiết bị gồm vendor ID, product ID và các chỉ số index trỏ tới các string descriptor:
- iManufacturer.
- iProduct: ở DFU, nó là “Apple Mobile Device (DFU Mode)”.
- iSerialNumber:

- CPID: mã chip, đang là SoC nào.
- CPRV: bản sửa đổi của chip.
- CPFM: fuse - có 3 mức.
- ECID: mã định danh của từng chip, dùng khi xin APTicket từ Apple.
Demotion
Hạ fuse từ production -> development tạm thời cho đến khi reboot. Giúp mở debug interface JTAG/SWD, debug trực tiếp AP và SEP.
Máy retail có CPFM = 03, máy development có CPFM = 01 hoặc 00. Fuse được ghi bằng phần cứng -> không thay đổi được. Nhưng giá trị được load vào 1 MMR (giá trị có thể được thay đổi)
Checkm8 & usbliter8 có thể ghi đè MMR đó -> demotion.
Debug cần có thêm cable chuyên dụng: Kong, Kanzi, Bonobo.
iBoot
Là second stage boot loader (iBootStage2). Nhiệm vụ chính là tìm và load kernelcache.
Chạy nhiều tasks (or threads) song song. Nhiều task xử lý các async event như các USB event. Ví dụ:
![[images/image-4.png]]
Task structure được preinitialized với magic “stak”.
Env var
Bản RELEASE của iBoot chỉ cho setenv hoặc getenv 1 set rất nhỏ trong NVRAM, giới hạn bởi whitelist. Ví dụ:
- auto-boot: tự boot theo boot-command hay recovery.
- boot-command: fsboot, upgrade, recover.
Khi chạy fsboot, iBoot đọc boot-path, boot-device, boot-partition để biết mount root fs ở đâu. Cần driver filesystem: HFS+ (đến iOS 10.3) hoặc APFS (sau đó).
Default boot-path = /System/Library/Caches/com.apple.kernelcaches/kernelcache, though the default boot-device varies by device type (nand0, asp_nand0 or nvme_nand0). Because neither of these values is in the environment variable white list, the defaults are also the only options for RELEASE builds.