- iPod touch 第3世代で公式にはサポートされていない iOS 6 を動作させるための技術的プロセスを詳細に解説したプロジェクト
- DeviceTree、iBoot、Kernelcache、Restore Ramdisk、Root Filesystem などiOSの中核コンポーネントを修正・再構成し、旧型デバイスで新しいバージョンを実行
- Pythonスクリプトを用いてiPhone 3GSとiPod touch 3のDeviceTreeの差分を自動で比較・適用し、iBootパッチでコード署名検証を回避
- Kernelcacheの再生成ではmacOSの
kcgen ツールを使ってarmv7向けカーネルとkextを統合し、不要なシンボルを削除して圧縮処理
- 旧型ハードウェアの潜在能力を拡張し、iOS内部構造の解析とカスタムファームウェア作成技術を共有した点で高い技術的意義
iOSコンポーネント概要
- iOSは iBoot、Kernelcache、DeviceTree、ユーザー空間ファイルシステム、補助プロセッサ向けファームウェア などで構成
- iBootはブートローダーで、iBSS・iBEC・LLB・iBootの4つの形態が存在
- Kernelcacheはカーネルとカーネル拡張(kext)を1つのバイナリにまとめたファイル
- DeviceTreeはハードウェア構成とソフトウェア動作パラメータを定義し、iBootが実行中に修正
- ファイルシステムはインストール用の restore ramdisk と永続保存用の root filesystem に分かれる
iPhone 3GSテスト
- iPhone 3GSとiPod touch 3は類似した S5L8920X / S5L8922X SoC を使用
- iPhone 3GSはiOS 6を公式サポートしているため、iOS 6.0をiOS 5.1.1のiBootおよびDeviceTreeと組み合わせて起動テスト
- 主な問題はDeviceTreeの不一致で、iOS 6で新たに追加されたノードとプロパティ(
nvram-proxy-data)が必要
DeviceTree修正
- Pythonスクリプトを書いて2つのDeviceTree間の差分を計算して適用
- スクリプトは SundanceInH2A リポジトリで公開
nvram-proxy-data プロパティにはNVRAMダンプを含める必要があり、空のままだとカーネルが初期段階で停止
- iPod touch 3に適用する際はiPhone専用項目を削除したうえでdiffを適用
iBootパッチ
- 基本的に Image3署名検査の回避、boot-args注入、debug-enabledパッチ を実施
nvram-proxy-data を動的に埋める必要があり、静的な値を使うと実際のNVRAMを上書きする危険がある
UpdateDeviceTree() 呼び出しを置き換えて nvram-proxy-data と random-seed を挿入
amfi=0xff 引数を追加してコード署名を無効化
- 他のiBoot+カーネル組み合わせではDeviceTree差分と
boot_args 構造の確認が必要
Kernelcache生成
- iPod touch 3向けiOS 6カーネルとkextは内部ビルドに存在していたが、これらを同時に読み込むには 事前リンク済みカーネルキャッシュ(prelinked kernelcache) の生成が必要
- macOSの
kcgen ツールを使ってarmv7向けカーネルキャッシュを生成
- 主なオプション:
-arch armv7, -all-personalities, -strip-symbols, -uncompressed
- 不要なシンボルを削除した後、
lipo -thin armv7 で単一スライスに変換
- 生成したカーネルキャッシュは圧縮後にImage3コンテナへパッケージ化
- kext一覧はiPhone 3GSのiOS 5.1.1と6.0を比較して作成し、Wi‑Fi kextのInfo.plist修正が必要
Restore Ramdisk修正
asr パッチと options.n88.plist から options.n18.plist への変更でパーティション配置を調整
- iBootエクスプロイト導入のため
rc.boot バイナリを再実装
- ラムディスクの再マウントと
umask 設定
restored_external -server 呼び出しで復元後の再起動を防止
- 復元完了時に3つ目のパーティションを作成し、エクスプロイトを書き込み、
boot-partition を2に設定して再起動
Root Filesystem修正
/System/Library/CoreServices/SpringBoard.app/N18AP.plist を追加し、iOS 6機能を反映
- iOS 5.1.1とiPod touch 4のホーム画面構成を統合
- Multitouch、Wi‑Fi、Bluetooth ファームウェアを追加
- Bluetoothは
/usr/sbin/BlueTool のハードコードを /etc/bluetool でオーバーライド
- FairPlayデーモン の
LimitLoadToHardware キーを削除することでiPod touch 3でも有効化可能
- iOS 6.1以降ではLaunchDaemon署名キャッシュのため追加パッチが必要
- Product IDマップ 修正: iPhone 3GSの
0x2714 をiPod touch 3の 0x2715 に置換
- MobileGestalt の
getDeviceVariant() を修正して常に "A" を返すようにする
- DYLD共有キャッシュ 修正時はSHA-1ハッシュを再計算することでコード署名を復旧可能
iBootエクスプロイト
- iOS 5の HFS+ドライバのバグ を利用したエクスプロイトを書き直し
- 以前のバージョンより決定的(deterministic)に改善
結論と今後の計画
- 全体作業は予想より難しくなく、ツール公開後は 脱獄(jailbreak) 関連の問い合わせが多数発生
- カーネルパッチとCydia導入で簡単に脱獄できる可能性がある
- 次の目標は iPad 1 でのiOS 6動作テスト
- 本プロジェクトはiOS内部構造の分析と旧型デバイス活用に関する実践的な参考資料を提供
1件のコメント
Hacker Newsの意見
iDevicesにもこういうものが絶対に必要だと思う
古いとはいえまだ十分使える iPad Air 第1世代が e-waste として捨てられるのはおかしい
Apple がもうサポートせず、しかも 別のOSのインストールすら妨げる方針 が問題だ
Mac には OpenCore Legacy Patcher があり、旧型 Mac でも最新の macOS を動かせる
「古いけれど使える」というより、単に「古いデバイス」でしかない
技術の進歩はあまりに速く、2013年の iPad Air のような機器では今や Web ブラウジングすら厳しい
OpenCore Legacy Patcher で 2012年の Mac mini を使ってみたが、性能低下とカーネルパニック のせいで結局 Linux に替えた
結局こうした機器は一種の 一時的な消費財 と見なすべきだ
修理する権利は重要だが、ほとんどの利用者は古い機器を使い続けない
車でたとえるなら、1999年式 Corolla が完全にオープンソースになっても大半の人は新しい車を買うだろう
Dortania チームも Apple Silicon 対応は事実上不可能だと言っており、T2 チップ搭載の Intel Mac もまもなくサポートが切られそうだ
結局、旧型 Mac でも iPhone や iPad のように サポート終了 を議論する日が来そうだ
EPUB と PDF は問題なく扱えるが、WebKit が古すぎて Web ブラウジングはほぼ不可能だ
カーネルは2021年版のように見えるが、WebKit は2018年以降止まっているようだ
少し話はそれるが、iPhone 5/5s/SE を何台も持っている
オフライン専用で 心拍数の記録、アクションカメラの制御、音声録音 などに使っている
今でも小さくて速く、2025年でも十分実用になる
iPhone でも可能かは分からないが、面白い実験だった
Apple 入社初期に iOS 6 と Snow Leopard のプロジェクトを経験した
この記事を見て昔の クローズドな OS の構造や用語 を思い出し、懐かしかった
2014年製の iPad Air を今でも気に入っている
iOS 12.5 が最終版だが、ほとんどのアプリは問題なく動く
1日6〜7時間使っており、もう少し新しいブラウザ さえあれば十分だ
Apple は iOS で独自レンダリングエンジンを使うブラウザを禁止している
そのため iOS の更新が止まると、Safari だけでなく すべてのブラウザと WebView アプリ が同時に旧式になってしまう
面白いが、この方法で iOS 26 から iOS 18 にダウングレード できたら本当に魔法みたいだと思う
MacBook でも iPhone でも品質は以前ほど良くない
自分も古い電話を iOS 16 に戻して 脱獄 してみたい
Apple デバイスにも Lineage OS のような代替 OS があればいいのにと思う
Apple がそれを解除しない限り、自由な OS インストールは不可能だ
もしかしてこの方法で iPhone 2G に iPhone OS 1.0 を起動できるのだろうかと気になる
自分の端末では 1.1.4 までしか起動せず、1.1.1 は FTL 初期化失敗 で止まる
昔の 緊急通話ハックによるアクティベーション をもう一度試してみたいが、そのとき使っていた 2G はなくしてしまった
興味深い記事だった
ただ、コード例では
--bundle-idは各行の先頭に付くものなので、prepend が正しい古い iPad Air 1 を持っているが、iOS 12 から アップグレード可能なのか 気になる
企業がもうサポートしない機器は 強制的に開放させる よう法律化されるとよいのにと思う