geohotによるevasi0n7の脱獄動作解析は以下の通り。
元ネタはGeohot本人による記述。
evasi0n7のアプリを起動すると、
afcによって” .evasi0n7_installed”のファイルを調査し、
デバイスが既に脱獄されている否かを検査する。
Afcは”/var/mobile/Media”上で動作するので、
全アドレスを書くと”/var/mobile/Media/.evasi0n7_installed”となる。
アプリ上でJailbreakボタンを押すと、evasi0nが動作し、
脱獄への旅が始まる。
1. まずクラウドパッケージを取りに行く。
現在必要なのは署名されたソフトだ。
” http://evasi0n.com/apple-ipa-info.plist”を使えば、
そのルートがわかる。
自分で試したければ、以下を手動で実行すれば良い。
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
plistによってわかるのは、
これはWWDC上で使われていたソフトで、
署名がされているということが鍵のようだ。
2. 脱獄のためのデータやツールをデバイスにアップロードし書き込む。
以下の3つのファイルを”/var/mobile/Media”に書き込めば良い。
・evasi0n-install/packagelist.tar
・evasi0n-install/Cydia.tar
・evasi0n-install/extras.tar
これは後ほどの脱獄に用いる。
ここにはCydiaやあの伝説のツール(笑)TaiG(太極助手)も含まれる。
3. evasi0nプログラムを注入する(1/2)。
すぐにプログラムをインストールするのではなく、
まずzipファイルを解凍したファイルをafcを使ってデバイスに書き込む。
“/var/mobile/Media/Downloads/WWDC.app”だ。
メインプログラムの”/var/mobile/Media/Downloads/WWDC.app/WWDC”はchmod +xでアクセス権限を与えられていないことに注意。
というのもafcが新しいファイルを作るとき、アクセス権限は644に変えられているからだ。
4. evasi0nプログラムを注入する(2/2)。
pkg.ipaの中のinfo.plistを編集し、新たに実行ファイルである
” ../../../../../../var/mobile/Media/Downloads/WWDC.app/WWDC”を追加する。
なぜこのappをそのまま使うかというと、
このappは署名されており、認証をパスする。
というのはこのプログラムは本物のコピーだからだ。
pkg.ipaをアップロードし、
ipa内のcom.apple.mobile.installation_proxyを実行する。
そしてアプリのアイコンをevasi0nのアイコンに変えてやれば大成功!
そしてここから楽しい時間の開始だ。
再度afcを使って以下の2つのファイルをデバイスにアップする。
・”#!/usr/libexec/afcd -S -d / -p 8888″ (the chmod +x stays)を含んだ”Downloads/WWDC.app/WWDC”
・”Downloads/WWDC.app/gameover.dylib”
このアプリはafcdを動作させるためにある。
-Sオプションは特殊ファイルにアクセスするため、
-dはafcdをroot下で実行するためであり、
-p 8888はポート8888を使用するためだ。
しかしafcdはSadboxによって制限されている。どうしたらいい?
ということで先ほどアップロードしたgameover.dylibを注入する。
geohot@comet:~/iphone/evasi0n2/extract$ dyldinfo -export gameover.dylib
for archarmv7:
exportinformation (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)
しかし誰がこのgameover.dylibに署名をつけたのだろうか?
実は誰でもない、本当に誰でもない。
exploitの開始だ。
もしS_ATTR_LOC_RELOCが実行可能セクションとなっているのであれば、
ヘッダが+xチェックをされた後+xがセクションから除去されるが、
+x pagesがマッピングされる以前に、署名されているとトリガーされる(ここは意味がよくわからない)
afcdはSandboxをbinary(バイナリ)内で初期化し、
dylib(gameoverのLC_ID_DYLIBは”/usr/lib/system/libsystem_sandbox.dylib”であることに注意)を乗っ取り、Sandboxは二度と初期化されなくなり、
afcdは何処にでも書き込めるようになる。
しかしdylibをどうやって足すのか?
これについてはシステムの調整が必要だ。
5. システムの調整(1/2)
まずは役に立たないが、可愛いものを1つ。
afcから(まだsandbox内のafc)”/tmp”にアクセスして、symlinkを作成したい。
しかしafcはまだ賢くそのディレクトリ以外にsymlinkを作成させてくれない。
しかし恐れてはいけない。
symlink(“../../../../../tmp”, “Downloads/a/a/a/a/a/link”)
はまだSandboxの中だ、そうだね?
../を数えてみよう。
rename(“Downloads/a/a/a/a/a/link”, “tmp”)
ダメだ、これはまだ相対アドレスだ。
“/var/mobile/Media/tmp”を飛び越えて、
“../(Media)../(mobile)../(var)../(private)../tmp”
とすると、”/tmp”にアクセスすることができるようになった。
6. システムの調整(2/2)
全てのキャッシュファイルを取り出す必要がある。
”com.apple.mobile.file_relay”を使って”Caches”をリクエストする。
かなり大きなファイル
“/var/mobile/Library/Caches/com.apple.mobile.installation.plist”から、
developer.apple.wwdc-Releaseappに”EnvironmentVariables”を追加する。
“DYLD_INSERT_LIBRARIES -> /private/var/mobile/Media/Downloads/WWDC.app/gameover.dylib”
そしてafcdを実行すると、
gameover.dylibが注入される。
そしてmobilebackupを使って2個目のexploitを利用する。
現在の目的はどんなファイルも好きに”/var”に書き込めるようにすることだが、
afcがSandbox内で実行されている限り、それは不可能だ。
しかし上に書いたように”/tmp”が編集できるようになっているので問題ない。
全ての”/var/mobile/Library/Caches/com.apple.mobile.installation.plist”及び”/var/mobile/Library/Caches/com.apple.LaunchServices-054.csstore”内のファイルに対して、
強制再作成を行う。
そして”BKNoWatchdogs”=”Yes”を追加した
“/var/mobile/Library/Preferences/com.apple.backboardd.plist”を起動して30秒のタイムアウトを除去し、
“pkg.zip”を新規作成し、afcで”/var/mobile/Media”にアップロードする。
そしてそれをinstalldでインストールさせる。
zipを解凍したところに”/tmp/install_staging.XXXXXX/foo_extracted”を作成する。
symlink(“../../..//var/mobile/Library/Caches/”, “tmp/install_staging.XXXXXX/foo_extracted.new”)
move(“tmp/install_staging.XXXXXX/foo_extracted”, “tmp/install_staging.XXXXXX/foo_extracted.old”)
move(“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/”に移動すれば、
Sandboxの外となる。
7. デバイスを再起動する。これが最初の再起動となる。com.apple.mobile.installation.plistをリロードするためだ。
8. 続けるには、evasi0nのiconをタップする必要がある。
このアイコンをタップしたら、コマンド
“#!/usr/libexec/afcd -S -d / -p 8888”
が実行され、gameover.dylibがafcのSandboxをkillする(閉じる)。
しかしまだmobileユーザ権限のままだ。
sandboxの外で以下の2件を実行する。
symlink(“../../../../../dev/rdisk0s1s1″,”/var/mobile/Library/Logs/AppleSupport”)
“/var/mobile/Library/Logs/AppleSupport”から”../../../../../dev/rdisk0s1s1″に移動し、
exploitを利用する。
このファイルは毎回再起動をするたびにCrashHousekeepingにchown mobileを実行される。
なぜならchownはsymlinksを通るようにする。
その後、”/var/mobile/Library/BackBoard/applicationState.plist”が次回再起動時にevasi0nのアプリを通過するように設定する。
9. 2回目の再起動を行い、上述の通り、”/dev/rdisk0s1s1″が mobile:mobile chownされる。
10. rootfsを編集する。
現在afcはsandboxの外で実行されており、
“/dev/rdisk0s1s1” は mobile:mobileとなっている。
block deviceを書き込む時が来た。
現在kernelはrootfsにrwを再マウントを許可しないようになっている。
そこで直接afcの-Sオプションでblock deviceを書き込む。
書き込まれるファイル
“/evasi0n7”– kernel exploitを実行するメインバイナリ。
“/evasi0n7-installed”– ただのブランクファイル
“/System/Library/LaunchDaemons/com.evad3rs.evasi0n7.untether.plist”– lanchdにロードさせるために作られる
“/System/Library/Caches/com.apple.xpcd/xpcd_cache.dylib”– LaunchDaemonsの新しいホーム。 haxxにより署名されている
“/System/Library/Caches/com.apple.dyld/enable-dylibs-to-override-cache”– dyld_cacheより前にシステムからチェックされる
“/usr/lib/libmis.dylib”– amfidのシンボルを乗っ取り、認証チェックに0を返すため。認証トリックのため。
[re-export] _MISValidateSignature (_CFEqual from CoreFoundation)
“xpcd_cache.dylib”は2つだけのlaunchdaemonsと一緒のplistを内包する。
com.apple.MobileFileIntegrityはlibmis.dylibを解放する署名を開始し、
com.evad3rs.evasi0n7.untetherは署名されていない紐なしだ(ここもよくわからない)。
DYLD_INSERT_LIBRARIESはamfid下ではうまく使用できないことに注意。
なぜなら”__RESTRICT”のセグメントがあるからだ。
先ほどの認証トリックを使ったため、これが本当のlibraryに切り替わっている。
11. 3回目の再起動を行う。今回でblock deviceでファイルシステムの改変が行われる。
12. rootによってデバイス上で/evasi0n7が実行できるようになる。
これによってスプラッシュスクリーンが見られるようになり、
あとは。。kernel landがごにょごにょされる。
取り急ぎの翻訳で、、相当酷いがわからないことが多すぎる。
記事は以上。