GeohotがiOS 7のEvasi0n脱獄を成功させ、記事を公開 [読む]

GeohotがiOS 7のEvasi0n脱獄を成功させ、記事を公開 [読む]

  • Lamiyi
  • 0
  • rhahw
GeohotがiOS 7のEvasi0n脱獄を成功させ、記事を公開 [読む]

Geohot は iOS 7 の Evasi0n 脱獄を元に戻し、その結果を記事にして投稿しました。

この記事はevasi0n7の視点から書かれています。秘密なんてクソ食らえ。この記事はAppleの助けにはならないことをお断りしておきます。私は公開されているevasi0nバイナリをリバースエンジニアリングすることでこれを入手しました。Appleはリバースエンジニアリングが可能ですし、実際に行っています。また、私のリバースエンジニアリングでは怪しいところは見つからなかったため、皆さんの携帯電話が中国人によってバックドアを仕掛けられている可能性は低いでしょう。もし私が再び脱獄に手を出すことがあったとしても(ARM128が出るまでは、ARM64への愛ゆえに再びゲームに触れただけです)、これ以上の秘密は明かしません。完全な開示を申し上げますと、私は数人の開発者と共に、公開され、無料で、中国が関与していない、昔ながらの脱獄に取り組んでいました。evad3rsが最初にリリースされました。その脱獄は今回の脱獄と80%重複していました。これは一部にはリークによるものですが、主な理由はエクスプロイトと手法が明白な選択だったためです(優秀な人材は当然のことです)。つまり、エクスプロイトは次回使用できなくなります。もう脱獄はできないのでしょうか?

この記事では、evasi0n 脱獄ユーティリティが実行する各ステップを詳しく説明します。

脱獄チュートリアルで説明したように、手順は次のとおりです。
●クリックしました。
●リモートパッケージを取得しています。●
脱獄データをアップロードしています。 ●
evasi0nアプリを注入しています(1/2)
●evasi0nアプリを注入しています(2/2)
●システムを構成しています(1/2)●
システムを構成しています(2/2)
●再起動しています。●続行するには、デバイスのロックを解除し、新しい「evasi0n 7」アイコンをタップしてください。 ●再起動
しています。 ● rootfsを変更しています... ●再起動しています。●デバイスでrootとして/evasi0n7を実行しています。



手順の詳細はリンク先でご覧いただけます。万が一、消えてしまった場合に備えて、以下にも記載しています。Geohotは独自の脱獄エクスプロイトを持っていましたが、evad3rsに先を越されてしまいました。Geohotが脱獄ツールを35万ドルで売却する交渉をしている流出した音声録音をこちらで聞くことができます。しかし、弁護士の勧めにより、彼は脱獄を断念しました。

多くの人がご存知の通り、脱獄はますます困難になっています。geohotでさえ「もう脱獄はできないのか?」と疑問を呈しています。脱獄初心者の方は、TwitterFacebook、またはRSSでiClarifiedをフォローして、最新ニュースやチュートリアルを入手してください。

続きを読む

GeohotがiOS 7のEvasi0n脱獄を成功させ、記事を公開 [読む]

GEOHOTによるiOS 7脱獄EVASI0N解除
-----
こんにちは。サンフランシスコからニューヨーク行きの飛行機に乗っていて、皆さんのために何か作りました。ラップソングではありませんが。

******* geohot(@tomcr00se) が evasi0n7 のレポートを発表 *******

== はじめに ==

退屈で、ひっくり返って、この記事を書いて、何かしたいと思ったんです。中国人に7ドルとピザハットのサラダバーのチケットで売ろうとしたんですが、中国のピザハットはもうサラダバーをやっていないみたいで、取引は中止になりました。

この記事はevasi0n7の視点から書かれています。秘密なんてクソ食らえ。この記事はAppleの助けにはならないことをお断りしておきます。私は公開されているevasi0nバイナリをリバースエンジニアリングすることでこれを入手しました。Appleはリバースエンジニアリングが可能ですし、実際に行っています。また、私のリバースエンジニアリングでは怪しいところは見つからなかったため、皆さんの携帯電話が中国人によってバックドアを仕掛けられている可能性は低いでしょう。もし私が再び脱獄に手を出すことがあったとしても(ARM128が出るまでは、ARM64への愛ゆえに再びゲームに触れただけです)、これ以上の秘密は明かしません。完全な開示を申し上げますと、私は数人の開発者と共に、公開され、無料で、中国が関与していない、昔ながらの脱獄に取り組んでいました。evad3rsが最初にリリースされました。その脱獄は今回の脱獄と80%重複していました。これは一部にはリークによるものですが、主な理由はエクスプロイトと手法が明白な選択だったためです(優秀な人材は当然のことです)。つまり、エクスプロイトは次回使用できなくなります。もう脱獄はできないのでしょうか?

ついでに「http://geohot.com/mt.jpg」と@tomcr00seのshaハッシュもチェックしてみてください。さあ、始めましょう。./evasi0n7に声を変えて。

== やったー、クリックしてくれてありがとう ==

こんにちは。まず、お使いのデバイスが既にジェイルブレイクされているかどうかを確認させていただきます。afcを使って「.evasi0n7_installed」ファイルを探しています。afcは「/var/mobile/Media」ディレクトリで実行されるので、フルパスは「/var/mobile/Media/.evasi0n7_installed」となります。

では、「Jailbreak」をクリックしてルート化への旅を始めましょう。/evasi0n7バイナリは難読化がかなりしっかりしているので、この旅は今のところルート化で終わります。

== リモートパッケージを取得しています ==

後で説明する理由で、ちゃんとコード署名されたアプリが必要なんです。入手先を調べるために、「http://evasi0n.com/apple-ipa-info.plist」を入手します。ああ、いいですね。URLとクッキーもいくつかあります。自宅でプレイするには、以下を実行してください。

curl -b "downloadKey=expires=1387947603~access=/us/r1000/098/Purple/v4/c3/4e/98/c34e989a-8522-fde0-db2d-884dd3b1302d/mzps6036043982514941651.D2.pd.ipa*~md5=dc91b9d5599eb2e135bddbec3ad5dbc2" http://a396.phobos.apple.com/us/r1000/098/Purple/v4/c3/4e/98/c34e989a-8522-fde0-db2d-884dd3b1302d/mzps6036043982514941651.D2.pd.ipa -o wwdc.ipa

これはWWDCの参加者向けのアプリだと思いますが、plistに書いてある通りにやっただけなのでよく分かりません。重要なのは署名されているかどうかです。

== 脱獄データをアップロード中 ==

えっと、何かインストールする必要があるんです。具体的にはCydiaか、あのアプリストアですね。後で解凍できるように、いくつかファイルをAFCにプッシュしておきます。「/var/mobile/Media」
「evasi0n-install/packagelist.tar」
「evasi0n-install/Cydia.tar」
「evasi0n-install/extras.tar」がまだあるのを覚えていますか?

== evasi0nアプリの注入 (1/2) ==

さて、まだアプリを実際にインストールするつもりはありませんが、解凍したコピーをafcを使って「/var/mobile/Media/Downloads/WWDC.app」にアップロードします。メインアプリ(「/var/mobile/Media/Downloads/WWDC.app/WWDC」)はchmod +xで変更されていないことに注意してください。afcは新しいファイル644を作成するためです。

== evasi0nアプリの挿入 (2/2) ==

実際のアプリホスト側を少し修正してみましょう。Info.plistに新しい実行ファイル「../../../../../../var/mobile/Media/Downloads/WWDC.app/WWDC」を追加します。わかりますか?コード署名のチェックは成功します。これはアプリの実際のコピーだからです。pkg.ipaをアップロードし、ipa上でcom.apple.mobile.installation_proxyを実行し、画像を公式のevad3rsロゴに変更します。そして、installdがアプリをchmods +xで変更し、きれいなアイコンを表示します。

いよいよお楽しみの始まりです。afc経由でさらに2つのファイルをプッシュします。
「Downloads/WWDC.app/WWDC」に「#!/usr/libexec/afcd -S -d / -p 8888」(chmod +xはそのまま)という内容の
「Downloads/WWDC.app/gameover.dylib」

わかりました。このアプリは afcd を実行するための単なるコマンドです。「-S」で特別なファイルにアクセスでき、「-d /」で afcd がルートで実行され、「-p 8888」でポート 8888 で実行されます。

ああ、でもafcdにはサンドボックスプロファイルがあるのに、どうやってクールな機能にアクセスすればいいんだろう?もちろんgameover.dylibを挿入すればいいんだけど

geohot@comet:~/iphone/evasi0n2/extract$ dyldinfo -export gameover.dylib
for arch armv7:
export information (from trie):
[re-export] _SANDBOX_CHECK_NO_REPORT (_kCFBooleanTrue from CoreFoundation)
[re-export] _sandbox_check (_sync from libSystem)
[re-export] _sandbox_extension_consume (_sync from libSystem)
[re-export] _sandbox_extension_issue_file (_sync from libSystem)
[re-export] _sandbox_free_error (_sync from libSystem)
[re-export] _sandbox_init (_sync from libSystem)
[re-export] _sandbox_init_with_parameters (_sync from libSystem)

うーん、でもそのdylibに署名したのは誰?誰も、本当に誰も。エクスプロイト、S_ATTR_LOC_RELOCがすべての実行可能セクションに設定されている場合、ヘッダーが+xチェックされた後、+xページがマッピングされる前にセクションから+xが削除され、コード署名がトリガーされます。

afcd はバイナリ内部からサンドボックスを初期化するため、dylib をオーバーライドすると (gameover の LC_ID_DYLIB は "/usr/lib/system/libsystem_sandbox.dylib" であることに注意してください)、サンドボックスは初期化されず、afcd はどこにでも自由に書き込みできるようになります。

しかし、dylib をロードするにはどうすればいいのでしょうか? 一緒にシステムを少し設定してみましょう。

== システムの設定 (1/2) ==

ああ、無駄に燃え尽きたエクスプロイトの最初の一つ。でも、とにかく可愛い。afcから。これはまだサンドボックス化されたafcなので、"/tmp"にアクセスしたいのでシンボリックリンクを作成しましょう。でも、afcは賢いので、自分のディレクトリ外へのシンボリックリンクを作成しないようにしてくれます。心配無用です。

シンボリックリンク("../../../../../tmp", "ダウンロード/a/a/a/a/a/link")

すごいでしょう?まだサンドボックスの中にいるので、数えてみましょう。

名前を変更("ダウンロード/a/a/a/a/a/link", "tmp")

ああ、これは相対シンボリックリンクなので、「/var/mobile/Media/tmp. "../(Media)../(mobile)../(var)../(private)../tmp」から移動します。

これで、「/tmp」にアクセスできるようになります。

== システムの設定 (2/2) ==

ちょっと待って、キャッシュファイルを全部取得するよ。「com.apple.mobile.file_relay」を使って「Caches」をリクエストするんだ。すごく大きなcpioファイルなんだ。

「/var/mobile/Library/Caches/com.apple.mobile.installation.plist」に、developer.apple.wwdc-Releaseアプリの「EnvironmentVariables」を追加します。ご存知の通り、最高に素晴らしい「DYLD_INSERT_LIBRARIES -> /private/var/mobile/Media/Downloads/WWDC.app/gameover.dylib」です。これで、afcdアプリのシェバンが実行されると、gameover.dylibが挿入されます。

さて、モバイルバックアップを使えたはずの2つ目の脆弱性について。Appleはパッチではなく、しっかり対策を講じたいとお考えですか?それが公平だと思いませんか?

/var 内の別の場所にファイルをプッシュする必要があるのですが、afc がまだサンドボックス内にあるためできません。installd に競合状態があり、前述のように "/tmp" を変更できるため、これを悪用できるのは幸いでした。

「/var/mobile/Library/Caches/com.apple.mobile.installation.plist」、再構築を強制するためにゼロにした「/var/mobile/Library/Caches/com.apple.LaunchServices-054.csstore」、および 30 秒のアプリ起動タイムアウトを削除するために「BKNoWatchdogs」="Yes" を追加した「/var/mobile/Library/Preferences/com.apple.backboardd.plist」内の各ファイルに対して、「pkg.zip」を作成し、afc を使用して「/var/mobile/Media」にアップロードします。

次にinstalldコマンドでインストールすると、「/tmp/install_staging.XXXXXX/foo_extracted」が作成され、そこにzipファイルが解凍されます。しかし、今度は高速な競合状態が発生しました。

シンボリックリンク("../../..//var/mobile/Library/Caches/", "tmp/install_staging.XXXXXX/foo_extracted.new")
移動("tmp/install_staging.XXXXXX/foo_extracted", "tmp/install_staging.XXXXXX/foo_extracted.old")
移動("tmp/install_staging.XXXXXX/foo_extracted.new", "tmp/install_staging.XXXXXX/foo_extracted")
installd_extract("/var/mobile/Media/pkg.zip", "tmp/install_staging.XXXXXX/foo_extracted")

分かりましたか?これで、「tmp/install_staging.XXXXXX/foo_extracted」への抽出が実行されると、ファイルは「/var/mobile/Library/Caches/」に保存されます。installdはサンドボックス化されていないので、これは便利ですね。

== 再起動中 ==

再起動回数をカウントします。これは 1 です。com.apple.mobile.installation.plist を再読み込みするために使用されます。

== 続行するには、デバイスのロックを解除して、新しい「evasi0n 7」アイコンをタップしてください。 ==

最後に、アプリをクリックすると、gameover.dylib を使って「#!/usr/libexec/afcd -S -d / -p 8888」を実行します。このとき、afc サンドボックスは終了しますが、モバイルとして動作します。サンドボックス外で、var にモバイルとして 2 つの簡単な処理を実行しておきます。

シンボリックリンク("../../../../../dev/rdisk0s1s1", "/var/mobile/Library/Logs/AppleSupport")

「/var/mobile/Library/Logs/AppleSupport」を「../../../../../dev/rdisk0s1s1」に残します。このファイルはCrashHousekeepingによって再起動時にmobile:mobileにchownされますが、chownはシンボリックリンクを経由するため…

そして、「/var/mobile/Library/BackBoard/applicationState.plist」に、次回の再起動時に evasi0n アプリを自動的に再起動するように指示します。今からこれを実行します。

== 再起動中 ==

これは 2 です。現在、「/dev/rdisk0s1s1」は mobile:mobile に chown されています。

== rootfs を変更しています... ==

afc はサンドボックス外で実行されています。「/dev/rdisk0s1s1」は mobile:mobile で、ブロックデバイスを書き込む時間です。

カーネルはルートファイルシステムをrwで再マウントできなくなったことに注意してください。そのため、基盤となるブロックデバイスに直接書き込むだけです。haxx。afcdには「-S」オプションがあるので、これは便利です。

書き込まれたファイル:
"/evasi0n7" -- カーネルエクスプロイトを実行するメインバイナリ。
"/evasi0n7-installed" -- 空のファイル。
"/System/Library/LaunchDaemons/com.evad3rs.evasi0n7.untether.plist" -- launchd にこれをロードさせるために変更。
"/System/Library/Caches/com.apple.xpcd/xpcd_cache.dylib" -- LaunchDaemons の新しいホーム。コード署名による変更。
"/System/Library/Caches/com.apple.dyld/enable-dylibs-to-override-cache" -- システムが dyld_cache の前にファイルシステムを参照するようにする。
"/usr/lib/libmis.dylib" -- 上記のコード署名による変更で、amfid 内のシンボルを上書きし、署名チェックで 0 を返すようにする。
[再エクスポート] _MISValidateSignature (CoreFoundation の _CFEqual)

「xpcd_cache.dylib」には、署名のない libmis.dylib で始まる com.apple.MobileFileIntegrity と、署名のない untether である com.evad3rs.evasi0n7.untether の 2 つの起動デーモンのみを含む plist が含まれています。

DYLD_INSERT_LIBRARIES は amfid では動作しないことに注意してください。これは "__RESTRICT" セグメントが含まれているためです。そのため、上記のトリックが役立ちます。つまり、実際のライブラリを置き換えるのです。

== 再起動中 ==

これは 3 です。ブロック デバイスで行った変更をファイルシステムにフラッシュする必要があります。

== デバイス上で root として /evasi0n7 を実行する ==

スプラッシュ画面が表示されましたね。ここからはカーネルと解凍による難読化の世界です。この部分を誰が書きたいでしょうか?

***************


透明性、愛、そして〜geohotからのラップソングとともに
-----