1 ポイント 投稿者 GN⁺ 2025-11-28 | 1件のコメント | WhatsAppで共有
  • iPod touch 第3世代で公式にはサポートされていない iOS 6 を動作させるための技術的プロセスを詳細に解説したプロジェクト
  • DeviceTreeiBootKernelcacheRestore RamdiskRoot Filesystem などiOSの中核コンポーネントを修正・再構成し、旧型デバイスで新しいバージョンを実行
  • Pythonスクリプトを用いてiPhone 3GSとiPod touch 3のDeviceTreeの差分を自動で比較・適用し、iBootパッチでコード署名検証を回避
  • Kernelcacheの再生成ではmacOSの kcgen ツールを使ってarmv7向けカーネルとkextを統合し、不要なシンボルを削除して圧縮処理
  • 旧型ハードウェアの潜在能力を拡張し、iOS内部構造の解析とカスタムファームウェア作成技術を共有した点で高い技術的意義

iOSコンポーネント概要

  • iOSは iBootKernelcacheDeviceTreeユーザー空間ファイルシステム補助プロセッサ向けファームウェア などで構成
    • 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-datarandom-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のホーム画面構成を統合
  • MultitouchWi‑FiBluetooth ファームウェアを追加
    • Bluetoothは /usr/sbin/BlueTool のハードコードを /etc/bluetool でオーバーライド
  • FairPlayデーモンLimitLoadToHardware キーを削除することでiPod touch 3でも有効化可能
  • iOS 6.1以降ではLaunchDaemon署名キャッシュのため追加パッチが必要
  • Product IDマップ 修正: iPhone 3GSの 0x2714 をiPod touch 3の 0x2715 に置換
  • MobileGestaltgetDeviceVariant() を修正して常に "A" を返すようにする
  • DYLD共有キャッシュ 修正時はSHA-1ハッシュを再計算することでコード署名を復旧可能

iBootエクスプロイト

  • iOS 5の HFS+ドライバのバグ を利用したエクスプロイトを書き直し
  • 以前のバージョンより決定的(deterministic)に改善

結論と今後の計画

  • 全体作業は予想より難しくなく、ツール公開後は 脱獄(jailbreak) 関連の問い合わせが多数発生
  • カーネルパッチとCydia導入で簡単に脱獄できる可能性がある
  • 次の目標は iPad 1 でのiOS 6動作テスト
  • 本プロジェクトはiOS内部構造の分析と旧型デバイス活用に関する実践的な参考資料を提供

1件のコメント

 
GN⁺ 2025-11-28
Hacker Newsの意見
  • iDevicesにもこういうものが絶対に必要だと思う
    古いとはいえまだ十分使える iPad Air 第1世代が e-waste として捨てられるのはおかしい
    Apple がもうサポートせず、しかも 別のOSのインストールすら妨げる方針 が問題だ
    Mac には OpenCore Legacy Patcher があり、旧型 Mac でも最新の macOS を動かせる

    • 関連して、古い iOS デバイスで動作するアプリを絞り込んで見られる アプリ一覧 を作ってある
    • こういう議論は 電子廃棄物の現実否認 のように感じる
      「古いけれど使える」というより、単に「古いデバイス」でしかない
      技術の進歩はあまりに速く、2013年の iPad Air のような機器では今や Web ブラウジングすら厳しい
      OpenCore Legacy Patcher で 2012年の Mac mini を使ってみたが、性能低下とカーネルパニック のせいで結局 Linux に替えた
      結局こうした機器は一種の 一時的な消費財 と見なすべきだ
      修理する権利は重要だが、ほとんどの利用者は古い機器を使い続けない
      車でたとえるなら、1999年式 Corolla が完全にオープンソースになっても大半の人は新しい車を買うだろう
    • Apple Silicon と Tahoe の登場で、OCLP の将来は不透明になった
      Dortania チームも Apple Silicon 対応は事実上不可能だと言っており、T2 チップ搭載の Intel Mac もまもなくサポートが切られそうだ
      結局、旧型 Mac でも iPhone や iPad のように サポート終了 を議論する日が来そうだ
    • 最近 Mercari で iPad Air 1 を25ドルで買ったが、状態はとても良い
      EPUB と PDF は問題なく扱えるが、WebKit が古すぎて Web ブラウジングはほぼ不可能だ
      カーネルは2021年版のように見えるが、WebKit は2018年以降止まっているようだ
    • 「別の OS のインストールを妨げる」とは、具体的に どう実装されているのか 気になる
  • 少し話はそれるが、iPhone 5/5s/SE を何台も持っている
    オフライン専用で 心拍数の記録、アクションカメラの制御、音声録音 などに使っている
    今でも小さくて速く、2025年でも十分実用になる

    • さらに脱線すると、Samsung Galaxy IV の 無線モジュールを取り外した ことがある
      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 にダウングレード できたら本当に魔法みたいだと思う

    • 26(Tahoe)は全プラットフォームで バグが多く完成度が低い
      MacBook でも iPhone でも品質は以前ほど良くない
    • おそらく EU の訴訟 でもない限り、OS のダウングレードは可能にならないだろう
      自分も古い電話を 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 から アップグレード可能なのか 気になる

  • 企業がもうサポートしない機器は 強制的に開放させる よう法律化されるとよいのにと思う