diosra2’s blog

iOSのJailbreak、ダウングレード

iBoot exploitを使用したiOS 10のUntethered Jailbreakの仕組み


以前私が投稿したiOS 10のUntethered Jailbreakの仕組みを記しておこうと思います。

 

(過去の投稿)

 

最初 (exploit)

多くの場合、userlandで動くkernel exploitを使用して脱獄するかと思います。(完全脱獄だともう少しありますが...。)

今回の場合はiBoot exploitです。iBoot exploitを正常に維持できるようにいくつかトリックを使用していますが、ここでは省略します。

iBoot exploitにより、iBootのboot-argsには"cs_enforcement_disable=1 amfi_get_out_of_my_way=1 -v"が注入され、verbose bootでコード署名を無効化して起動されます。また、未署名カーネルをロードできるので、コード署名を無効化したり、既に脱獄された状態で起動できます。

カーネルパッチに関してはこちら

これでカーネル領域の脱獄は完了です。

ただし、後述の理由からsandboxのパッチだけは適用していません。

(混乱を招くかもしれませんが、配布ツールはsandboxのパッチも適用されてます。)

 

起動

カーネルは既にほぼ脱獄状態です。

ですが、少し作業が残っています。起動時にはまずsandboxをパッチしなければなりません。なぜならsandboxのパッチだけはまだ適用していないからです。

 

Sandbox

sandbox patchではsandbox mac policiesを0にします。

しかしmac_policy_opsにあらかじめパッチを適用して起動した場合、これは__DATAにあるのでkaslrによりカーネルパニックを起こします。

そのため、以下の方法をとる必要があります。

1, iBootにパッチしてkaslrを無効にする (配布ツール)

2, 起動時にカーネルパッチする

 

1の場合はkernel base addressは0x80001000に固定されるので問題なく起動できます。

2の場合は起動時にカーネルパッチをします。(既にtfp0が有効なのでそこから)

*mac policies

mpo_file_check_mmap

mpo_vnode_check_rename

mpo_vnode_check_rename

mpo_vnode_check_access

mpo_vnode_check_chroot

mpo_vnode_check_create

mpo_vnode_check_deleteextattr

mpo_vnode_check_exchangedata

mpo_vnode_check_exec

mpo_vnode_check_getattrlist

mpo_vnode_check_getextattr

mpo_vnode_check_ioctl

mpo_vnode_check_link

mpo_vnode_check_listextattr

mpo_vnode_check_open

mpo_vnode_check_readlink

mpo_vnode_check_setattrlist

mpo_vnode_check_setextattr

mpo_vnode_check_setflags

mpo_vnode_check_setmode

mpo_vnode_check_setowner

mpo_vnode_check_setutimes

mpo_vnode_check_setutimes

mpo_vnode_check_stat

mpo_vnode_check_truncate

mpo_vnode_check_unlink

mpo_vnode_notify_create

mpo_vnode_check_fsgetpath

mpo_vnode_check_getattr

mpo_mount_check_stat

mpo_proc_check_setauid

mpo_proc_check_getauid

mpo_proc_check_fork

 

この場合、バイナリを"/usr/libexec/rtbuddyd"に配置することで、他デーモンが起動するよりも前に実行できます。iOS 10からはデーモンのidentを検証するようなので、バイナリのidentは"com.apple.rtbuddyd"に設定しておく必要があります。

**前提条件として、今回の脱獄ではカーネル起動時には既にコード署名が無効化されているので、バイナリを改変したり任意のバイナリが実行可能な状態です。

 

無事に起動できたら、次はデーモンの読み込みについて考えます。

iOS 10では"/System/Library/Caches/com.apple.xpcd/xpcd_cache.dylib"に起動時に実行されるデーモンが記述されているので、ここから以下のデーモンを読み込まないように削除します。

com.apple.SpringBoard.plist

com.apple.backboardd.plist

com.apple.mobile.lockdown.plist

com.apple.mobile.softwareupdated.plist

com.apple.softwareupdateserviced.plist

 

上二つはSpringBoard関係です。JBデーモンやSubstrateをロードしてからホーム画面を読み込みたいのでリストから消しておきます。

3番目はAFC2を有効化した際にSubstrateをロードしてから起動するようにしたいのでリストから消します。

下二つはSoftware Update関連です。いりません。

 

そして、JBデーモン("/Library/LaunchDaemons")やSubstrateをロードするためのバイナリを起動時に実行させたいので、"/usr/libexec/CrashHousekeeping"あたりを"reloader"に置き換えます (同様に、"reloader"のバイナリのidentは"com.apple.CrashHousekeeping"に設定する必要があります。)。

ここで、"com.apple.SpringBoard.plist", "com.apple.backboardd.plist", "com.apple.mobile.lockdown.plist"の3つは"/Library/LaunchDaemons"に配置しておくことで、"reloader"実行時にJBデーモンと一緒に読み込まれ、脱獄された状態でホーム画面が表示されます。

 

 

 

 

 


Copyright (C) 2017-2018 Diosra2. All Rights Reserved.