スポンサーリンク

【iPhone3GS_JB】部分訳ーCaching Apple’s Signature Server

Saurikが3GSの3.0へのダウングレード方法を確立した際に、作業方法をまとめた記事。
かなり時間をかけて書き上げたようで、大作である。
なんか前置きは長いが、後半にはJailbreak手法の理解に、役に立つ情報がたくさん含まれている。

一部翻訳したので、ご参考までにまとめておく。
なお、スターウォーズのような一大ストーリーになっており、全部はとても訳せないので、実用的なセクションだけ翻訳した。

The Next Hope、The True Enemy、The Point of Jailbreaking、An Exploit a Day…の章については省略。壮大なストーリーを楽しみたい方は、原文をドゾー


では、以下超訳(部分訳):

Caching Apple’s Signature Server

最初に言っておくが、友愛wの精神に基づいて、なにか問題があっても、私にメールを送らないでほしい。代わりに、この記事のために、ModMyi.comに3G[S] Downgradingという特別フォーラムを作ったので、そっちへ行ってほしい。


The Signature Server

AppleはiPhone 3G[S]で、jailbreakに対して、強力に打って出る決断をした。ローカルでの新しいプロテクトを行うだけでなく、デバイスの復元時に毎回、(ファームウェアが)正当なものであるかどうか、Apple自身で照合を行うことを決めた。

これを行うために、復元のプロセスを実行中に”Verifying restore with Apple…”がユーザに表示される。この間、iPhoneとAppleサーバの間で、チャレンジ・レスポンス・プロトコルが使用される: ファームウェアの” 部分的な要約”がサーバへの送信に利用され、照合結果によって署名の可否を決定する。

これにより、Appleはカスタム・ファームウェアが、機器に導入されることを防ぐことができる。また、現行のファームウェアに、将来ダウングレードすることを防ぐことも可能になる。そのためには、単に署名を拒否すればいい。たとえば、iPhone OS 3.0に戻すような場合だ。

でも、このモデルを強固なものにするためには、そのシステムを、単純な”replay attack”に晒されないようにする必要がある。: アップルの署名を保存しておいて、後でそれを送り返すようなやり方だ。これは”初歩的な攻撃”で、いくつかの方法によって、簡単に防ぐことができる。


For a Purple Ra1ny Day

Apple’s 3G[S]のセキュリティ・メカニズムは、そこへ到達できていない。シンプルな乱数を使うのでなく、デバイスごとに特定のチャレンジをハードコードしている。ここで使われる特定の数値は、デバイスの”ECID”、”ユニーク・チップ ID”になる。ECIDは、これまで発売されたすべてのデバイスが持つIDであったにもかかわらず、これまで使われたことがなかった。

つまり、現状Appleが”OK”と判断する(判定結果として、必須のSHSHを含むBLOB、署名ハッシュを返す)ファームウェアであれば、誰でも、割り当てられたECIDを使用して、Appleの署名サーバに署名を行わせ、結果を永久に保存することができてしまう。
実際に必須となる署名済みファイルは、たった1つだけ ;P これがiBSSであり、iBootの形式のひとつだ。ECID/iBSS署名が入手できれば、バグのあるコードを利用して、引き続きjailbreakすることができる。

これが実際にpurplera1n.comが行ってきたことだ: iBSSファイルのための、最低限必要な署名ハッシュだけを返す。それだけで、将来だれかがその署名ハッシュを利用したツールを書くには十分だ。


Personalized Firmware パーソナライズされたファームウェア

iTunesはこれらのBLOBを使用して、ECID、SHSH、SHSHおよびCERTをファームウェア・ファイルに統合し、”パーソナライズ”している。

多くのユーザが、この”パーソナライズ”の仕組みを利用して、慎重にiBSSとiBECファイルを拾得したことと思う。このプロセスで作られるiBSSファイルは、purplera1nydayファイルと比べて、別段多くの情報を含んでいない。

しかし、残念なことは、この情報は必要十分ではあるが、簡単にjailbreakできるというわけでもない。誰かが、これらのファイルを利用する、jailbreakのための特別なツールを書いてくれなければ、ここから先へは進めない。


Your iPhone 3G[S] has an ECID SHSH on file.

実際に必要になるのは、iTunesで復元に必要となる、パーソナライズされたファームウェアのすべてを保存することだ。(現実的には、フルセットのSHSH BLOB) 現時点で、iTunesを使えば通常のデバイス復元を行うことはできる。
この機能は、ギリギリの時点でCydiaで提供できた: CydiaがECIDとAppleサーバを利用して署名した、フルセットのSHSH BLOBを生成した。

これにより、50,000を超える3G[S]の、ECID SHSHを取得、保存できた。そしてこれらを利用した、iPhone OS 3.0への無期限ダウングレードの準備ができた。


A Narrow Window

残念ながら、リリースのタイミングが遅かったため(効率的に実行するための手法を見つけるのに時間がかかった)、Appleによる署名終了に間に合わず署名済ECIDを取得できなかったユーザも多かった。

これらのユーザは将来、3.0のままでいることも、ダウングレードもできないことを意味する。しかし、3.1のexploitが発見されたとのうわさがある。

つまり、まだいつかはわからないが、ユーザはiPhone OS 3.1上で、3G[S]のjailbreakができることになる。

この手法をサポートするために、今夜からCydiaで、3.1ファームウェアを利用したECIDの保存を開始する。将来、ユーザが再びAppleにLock outされた時の手段を準備するために。

それまでには、何十万ものユーザが、Appleの『情報浄化作戦に対抗できる準備ができていることだろう。


Bypassing the Overlord

私はAppleの署名サーバの機能を模倣したサーバを構築した。相違点は、ライブリクエストではなく、ファイルとして保存する点だけだ。

今必要なのは、iTunesがこいつを利用できるようにするだけだ。幸運なことに、多くのOSではhostsファイル経由で、特定のホストへのバイパスを設定できる。これを利用して、Appleの署名サーバへのリクエストを、Cydiaにリダイレクトする。


Windowsの場合:

C:\Windows\System32\drivers\etc\hosts (Windows)

Mac OS Xの場合:

/etc/hosts

の最後に、以下のエントリを追加する

74.208.105.171 gs.apple.com 74.208.10.249 gs.apple.com (変更になっているので注意)

これで、iTunesがAppleと通信していると思っているとき、実はCydiaにつながっていることになる。この方法により、すでにCydiaに”on file”機能で保存された署名にアクセスできるようになる。

このサーバは、Appleのサーバとの中間に位置して、どのSHSH BLOBに対しても、キャッシュとしても働く機能を持っている。この働きにより、あなたのデバイスを、”on file”の仕組みとともに、効果的に登録する。つまり、jailbreakしていない環境からでも、ファームウェアのダウングレード方法を確保することができたということだ。

強調しておく: もし、jailbreakそしていなくても、する気がなくても、新しい”on file”サービスを検討する価値がある。

たとえば、将来AppleがOSアップグレードをリリース、あなたがそれを導入し、なんらかの理由で重要なものが壊れてしまった場合。メールアカウントや、Todo listとか。ビジネスに支障がでる。

ダウングレードができれば、問題がないのだが、Appleはもうサポートしてくれない。そこで、あたらしい署名サーバの出番: このサーバで復元することにより、Appleからの不必要なアップグレードを、確実に回避することができる。


Performing the Restore

“3.0 IPSWを利用して復元” と同じぐらい、プロセスが簡単だったらいいと思うが、そこまでは甘くない。最初の問題は、3.1から3.0へのダウングレードは、必ずDFUモードで行う必要があることだ。

作業開始:
ロック(電源)とメニュー(Home)ボタンを同時に10秒間押し、次にロックボタンだけを離す。iTunesが” iTunesは復元モードのiPhoneを認識しました”のメッセージを出すまで、メニューボタンは押し続ける。iTunesで利用する前に、まずこのiPhoneを復元する必要がある。

この時点でiPhoneの画面は真っ暗になっているはずである。多くの人が、”DFU”を”リカバリー”と混同しているが、この2つは大きく異なるものだ。(実際のところ、iTunes自体がこの誤解に拍車をかけている) iTunesロゴと同期ケーブルや、Steve Jobsが文句を言っているイラストとかが表示されていたら、リカバリーモードなのでやり直し。

まず、最初に”通常”の3.0ソフトウェアへの復元を行う。最初に、Mac OSXならoptionキー、WindowsならShiftキーを押しながら、iTunesの復元ボタンを押す。ファームウェア(おそらく iPhone2,1_3.0_7A341_Restore.ipsw という名前) を選択すれば、復元作業が開始される。

“unknown error (3002)”が表示された場合、あなたの3.0 ECID SHSHがCydiaに ”on file” されていない可能性がある。残念ながら、Appleはもう3.0ファームウェアに対して署名をしてくれないので、あなたのデバイスをCydiaに登録する方法はない。

運良く、iPhone OS 3.1で別のexploitへの脆弱性が確認されたとの報告がある。これにより。3.1用のjailbreakがリリースされれば、OS 3.0で署名が保存できなかったユーザーも、将来のjailbreakに備えることができる。

1回でもこのサービスを利用しようと試みていれば(Cydia上で、”make your life easier”と答えていれば)、署名トラッカーに記録され、Cydia HQが復元のためにベストを行うはずだ。

もう一度お願いしておくが、このプロセスで何か問題があった場合、頼むから私にメールしないで欲しい。代わりに、ModMyi.comの、この記事の特設フォーラム、3G[S] Downgrading へどうぞ。


NAND Format Invalid

もし3.0を使っていた場合、このプロセスは、問題なく進められるはずだ。だが、すでに3.1にアップグレードしていた場合、妙なエラーに直面することになる。

“The iPhone “iPhone” could not be restored. An unknown error occured (1015).”

これは想定されている振る舞いだ。

ご興味のある方向けだが、このエラーは、3.1によりNANDストレージのある区画が整理され、3.0 iBootでは解釈できなくなっている事による。USBでつないで、iRecoveryを実行して確認したところ、下記のメッセージを見ることができた。(誤字はAppleによる)

[WMR:ERR] NAND format invalid (mismatch, corrupt, read error or blank NAND device) [WMR:ERR] boolSignatureFound false boolProductionFormatVerified true nSig 0x0 ****************************************************************************** ****************************************************************************** AND: NAND initialisaton failed due to format mismatch or uninitialised NAND. AND: Please reboot with reformatting enabled. ****************************************************************************** ****************************************************************************** NAND FTL failed initialisation

最初にこの問題がおきたとき、“reboot with reformatting enabled”に、どう対処するべきか、MuscleNerdと時間をかけて考えた: この問題への対処で、非常に重要な時間を失った。修正後もブートできず、2回目の復元を実行しなければ、プロセスを終了できなかった。

しかし、結果として2回目の復元をしたら、NANDが正常にフォーマットされることがわかった。そこで、他に色んなことを試みてみずに、普通に3.0ファームウェアを指定して、2回目の復元を開始してほしい。(今度はリカバリーモードでかまわない: DFUは必要ない)


Stuck in Restore

残念ながら、この2度目の復元も失敗する。(*ため息*) ムカツクことに、まったく同じエラーメッセージが表示される。

“The iPhone “iPhone” could not be restored. An unknown error occured (1015).”.

これもまた、想定される振る舞いだ。

また、興味のある方向けの話だが、何が起きているかというと、デバイスがオンになったとき、次に何を実行するか決定する必要がある: ブートプロセスを継続するか、USB経由で指示を待つか。これは、NVRAMの変数、auto-bootによって判断されるが、この時点で”false”に設定されている。

通常、復元プロセスの最後でこの変数はセットされるのだが、技術的には我々は復元を終了できない: 私見だが、3.1のインストールにより、3.1ベースバンド(現在はまだアンロックできない) にアップグレードされる。3.0とマッチしないベースバンドのために復元に失敗していると思う。

ともかく、これが復元の最後の手順になる。技術的には我々の勝利だが、3.0へのダウングレードには、この1015エラーが付き物となる。


Jailbreak with redsn0w or purplera1n

この時点で、あなたには3つのオプションがある。1つめはiRecoveryを利用して、手作業でfsbootを実行する方法。2つめは、iRecoveryでauto-bootを”true”に設定する方法。3番目は、デバイスをすぐにjailbreakする方法だ。

まっすぐ3番目のオプションに向かってくれ。(jailbreak)。iRecoveryをコンピュータ上で動作させる方法を、ここで紹介する気はない。;P (実際のところ、まだ私のWindowsマシンでは動いてない)

この時点で、好きなjailbreakツールを使って、デバイスをjailbreakして構わない。

おめでとう。あなたはオーウェルの支配者を打ち倒し、自分のデバイスへのコントロールを取り戻した。

今日はここまでだ。我々は勝利する!

タイトルとURLをコピーしました

Fatal error: Uncaught Error: Call to a member function listFiles() on null in /home/peer2/www/sjdojo/wp-content/plugins/w3-total-cache/CdnEngine_GoogleDrive.php:595 Stack trace: #0 /home/peer2/www/sjdojo/wp-content/plugins/w3-total-cache/CdnEngine_GoogleDrive.php(615): W3TC\CdnEngine_GoogleDrive->path_get_id('sjdojo/wp-conte...') #1 /home/peer2/www/sjdojo/wp-content/plugins/w3-total-cache/Cdn_Core.php(738): W3TC\CdnEngine_GoogleDrive->format_url('sjdojo/wp-conte...') #2 /home/peer2/www/sjdojo/wp-content/plugins/w3-total-cache/Cdn_Plugin.php(1226): W3TC\Cdn_Core->url_to_cdn_url('https://peer2.n...', 'sjdojo/wp-conte...') #3 /home/peer2/www/sjdojo/wp-content/plugins/w3-total-cache/Cdn_Plugin.php(911): W3TC\_Cdn_Plugin_ContentFilter->_link_replace_callback_ask_cdn('"https://peer2....', '"', 'https://peer2.n...', 'sjdojo/wp-conte...') #4 [internal function]: W3TC\_Cdn_Plugin_ContentFilter->_link_replace_callback(Array) #5 /home/peer2/www/sjdojo/wp-content/plugins/w3-total-cache/Cdn_Plugin.php(935): preg_replace_callback('~([" in /home/peer2/www/sjdojo/wp-content/plugins/w3-total-cache/CdnEngine_GoogleDrive.php on line 595