-
-
[转帖]神奇小子Geohot对本次越狱的逆向工程分析
-
发表于: 2014-3-15 13:21 5975
-
原文地址:http://geohot.com/e7writeup.html
译文地址:http://iphone.tgbus.com/news/class/201312/20131224161231.shtml
这一次可爱(气急败坏的)Geohot,也就是我们的神奇小子,发了一篇Evasi0n7的越狱解析。同时通过他的解析我们也可以推断出一些越狱内幕。神奇小子以Evasi0n软件的第一视角展示了Evasi0n是如何工作的。
Geohot用比喻写出了这次越狱的商业竞争:最开始他想用7美金和去中国旅游吃必胜客自助沙拉来和中国人做这笔越狱交易,可惜他发现中国必胜客已经没有自助沙拉了,那还玩个毛,所以才没这笔交易。还发了个中国人如何在自助沙拉堆沙拉的新闻:http://kotaku.com/how-chinese-ingenuity-destroyed-salad-bars-at-pizza-hut-834835079。所以据推测,交易是每一次越狱他赚七美金,但Evaders团队聪明的用买断价卖给了中国团队(某极)。才有了现在的越狱。
Geohot说他把这篇文章写出来是出于无聊,也是和大家介绍下这次越狱,并没有搅和同行干活的目的。这些东西不会帮助苹果封越狱漏洞,因为这是Evasi0n公用库里的东西,他所做的只是做了些逆向工程。Geohot表示自己不会再碰越狱了,除非出ARM128位处理器,这次开发越狱也是因为想玩玩64位。经过他的解析,中国人应该不会在越狱工具里安装后门。由于泄露,他和Evaders做的越狱80%重复,但基本漏洞和实现方式还是相同的。而且下次越狱肯定别想用了,封掉此漏洞很简单。下面是Evasi0n解析:
软件打开后会用afc通过查找文件” .evasi0n7_installed”检查越狱状态越狱状态。Afc运行在”/var/mobile/Media”,所以全路径是:"/var/mobile/Media/.evasi0n7_installed"。如果点击越狱按钮,即开启越狱之旅。
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. 上传越狱数据。把以下这三个文件通过afc上传到"/var/mobile/Media":"evasi0n-install/packagelist.tar","evasi0n-install/Cydia.tar","evasi0n-install/extras.tar"。留着一会越狱用。这里包含Cydia或者传说中的中国第三方商店。
3. 注入Evasi0n程序(1/2)。先不会安装程序,但是要把解压后的文件用afc上传到手机"/var/mobile/Media/Downloads/WWDC.app"。主程序”/var/mobile/Media/Downloads/WWDC.app/WWDC”没有被改权限,因为afc默认把权限改为664.
4. 注入Evasi0n程序(2/2)。现在修改一下pkg.ipa里面的Info.plist,加入一个新的可执行文件” ../../../../../../var/mobile/Media/Downloads/WWDC.app/WWDC”。至于为啥不用改别的,由于程序就是原版wwdc软件并且有签名,所以代码签名检查直接通过。上传pkg.ipa,运行ipa里的com.apple.mobile.installation_proxy(本地安装),然后再把程序图标改成Evasi0n越狱图标~ 大功告成!
现在有趣的开始了:再通过afc复制进手机两个文件,包含"#!/usr/libexec/afcd-S -d / -p 8888"的” Downloads/WWDC.app/WWDC”和"Downloads/WWDC.app/gameover.dylib"。懂了吧,这软件就是为了执行afcd用的,-S 是为了访问特殊文件,-d /让afcd在root下运行,-p 8888使其在8888端口运行。
但是afcd有沙盒限制的,肿么办捏? 注入刚才传上来的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呢?木有人。漏洞开始:如果S_ATTR_LOC_RELOC被设置成全可执行,当头+x被检查后+x就会被移除掉,但是在+xpages被映射前,执行代码签名
Afcd从binary里初始化沙盒,所以干掉dylib(gameover的LC_ID_DYLIB是"/usr/lib/system/libsystem_sandbox.dylib"),沙盒就不会被初始化,afcd也就想干嘛就干嘛了。
但是又怎么让dylib加载呢?就是下一步配置系统了。
5. 配置系统(1/2)。第一步先忙活些没用的,但是很可爱。从afc(还是执行在沙盒中的afc),想要访问”/tmp”就要创建个symlink。但是afc还是很聪明的不在目录外创建symlink。symlink("../../../../../tmp","Downloads/a/a/a/a/a/link") 还是在沙盒里面,是吧~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",把"EnvironmentVariables"加入,到developer.apple.wwdc-Releaseapp。最帅的:"DYLD_INSERT_LIBRARIES -> /private/var/mobile/Media/Downloads/WWDC.app/gameover.dylib",现在afcd运行,gameover.dylib被注入。
现在要用mobilebackup来利用第二个漏洞、
现在的目的是把文件随便拷入/var,但不行,因为afc还运行在沙盒里。但是没事,可以编辑”/tmp”,像刚才展示的。对于每一个在"/var/mobile/Library/Caches/com.apple.mobile.installation.plist","/var/mobile/Library/Caches/com.apple.LaunchServices-054.csstore" 的文件,被强制重建, 和"/var/mobile/Library/Preferences/com.apple.backboardd.plist",被加入"BKNoWatchdogs"="Yes"去掉了程序启动30秒超时, 新建一个 "pkg.zip", 用afc上传到"/var/mobile/Media"。
然后,用命令去安装它,解压并创建了"/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")
<p style="line-height: nullpx; text-indent: 0em; text-align: left;">installd_extract("/var/mobile/Media/pkg.zip","tmp/install_staging.XXXXXX/foo_extracted")</p>
当解压到"tmp/install_staging.XXXXXX/foo_extracted",文件会去"/var/mobile/Library/Caches/",没有沙盒。
7. 重启。第一次重启。让com.apple.mobile.installation.plist 重新加载。
8. 要继续,请解锁设备并点Evasi0n图标。最后,当你点击图标,执行"#!/usr/libexec/afcd -S -d / -p 8888",gameover.dylib关闭了afc沙盒,但是还是mobile用户组。程序会快速做两件事,在沙盒外:symlink("../../../../../dev/rdisk0s1s1","/var/mobile/Library/Logs/AppleSupport")
利用漏洞,这个文件在每次重启时被CrashHousekeeping 执行chown mobile:mobile, 因为chowm要通过symlinks…
然后告诉"/var/mobile/Library/BackBoard/applicationState.plist"下次开机时重开evasin软件。
9. 再重启。。。"/dev/rdisk0s1s1"被chowm mobile:mobile,像刚才说到的
10. 修改rootfs。
现在afc在沙盒外运行,"/dev/rdisk0s1s1"是mobile:mobile,开始写块设备。
现在内核已经不允许重新以rw挂载rootfs。所以直接用afcd的-S选项写块设备。
被写入文件:
"/evasi0n7"-- the main binary which does the kernel exploit.
"/evasi0n7-installed"-- just a blank file
"/System/Library/LaunchDaemons/com.evad3rs.evasi0n7.untether.plist"-- touched to make launchd load this
"/System/Library/Caches/com.apple.xpcd/xpcd_cache.dylib"-- the new home of the LaunchDaemons, codesign haxx
"/System/Library/Caches/com.apple.dyld/enable-dylibs-to-override-cache"-- convinces the system to look on the filesystem before the dyld_cache
"/usr/lib/libmis.dylib"-- overrides the symbols in amfid to make the signature check return 0, withabove codesign trick
You know,[re-export] _MISValidateSignature (_CFEqual from CoreFoundation)
<p style="line-height: nullpx; text-indent: 0em; text-align: left;">"xpcd_cache.dylib" contains a plist with just twolaunchdaemons, com.apple.MobileFileIntegrity, which starts with the signaturefree libmis.dylib, and com.evad3rs.evasi0n7.untether, which is the unsigneduntether.</p>
由于DYLD_INSERT_LIBRARIES不会在amfid下好使,因为他有"__RESTRICT"字段。因此用刚才的trick,替换掉了真正的library.
11. 再重启。这回是更新刚才对块设备的更改。
12. 以root在设备上允许 /evasi0n7。现在又能看到水滴屏幕了,剩下的事就交给用户和稀泥了。
翻译的威锋技术组Jackie099有话说:由于好多术语无法翻译。不准确的地方求大家去看英文原版,清楚的多。
译文地址:http://iphone.tgbus.com/news/class/201312/20131224161231.shtml
这一次可爱(气急败坏的)Geohot,也就是我们的神奇小子,发了一篇Evasi0n7的越狱解析。同时通过他的解析我们也可以推断出一些越狱内幕。神奇小子以Evasi0n软件的第一视角展示了Evasi0n是如何工作的。
Geohot用比喻写出了这次越狱的商业竞争:最开始他想用7美金和去中国旅游吃必胜客自助沙拉来和中国人做这笔越狱交易,可惜他发现中国必胜客已经没有自助沙拉了,那还玩个毛,所以才没这笔交易。还发了个中国人如何在自助沙拉堆沙拉的新闻:http://kotaku.com/how-chinese-ingenuity-destroyed-salad-bars-at-pizza-hut-834835079。所以据推测,交易是每一次越狱他赚七美金,但Evaders团队聪明的用买断价卖给了中国团队(某极)。才有了现在的越狱。
Geohot说他把这篇文章写出来是出于无聊,也是和大家介绍下这次越狱,并没有搅和同行干活的目的。这些东西不会帮助苹果封越狱漏洞,因为这是Evasi0n公用库里的东西,他所做的只是做了些逆向工程。Geohot表示自己不会再碰越狱了,除非出ARM128位处理器,这次开发越狱也是因为想玩玩64位。经过他的解析,中国人应该不会在越狱工具里安装后门。由于泄露,他和Evaders做的越狱80%重复,但基本漏洞和实现方式还是相同的。而且下次越狱肯定别想用了,封掉此漏洞很简单。下面是Evasi0n解析:
软件打开后会用afc通过查找文件” .evasi0n7_installed”检查越狱状态越狱状态。Afc运行在”/var/mobile/Media”,所以全路径是:"/var/mobile/Media/.evasi0n7_installed"。如果点击越狱按钮,即开启越狱之旅。
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. 上传越狱数据。把以下这三个文件通过afc上传到"/var/mobile/Media":"evasi0n-install/packagelist.tar","evasi0n-install/Cydia.tar","evasi0n-install/extras.tar"。留着一会越狱用。这里包含Cydia或者传说中的中国第三方商店。
3. 注入Evasi0n程序(1/2)。先不会安装程序,但是要把解压后的文件用afc上传到手机"/var/mobile/Media/Downloads/WWDC.app"。主程序”/var/mobile/Media/Downloads/WWDC.app/WWDC”没有被改权限,因为afc默认把权限改为664.
4. 注入Evasi0n程序(2/2)。现在修改一下pkg.ipa里面的Info.plist,加入一个新的可执行文件” ../../../../../../var/mobile/Media/Downloads/WWDC.app/WWDC”。至于为啥不用改别的,由于程序就是原版wwdc软件并且有签名,所以代码签名检查直接通过。上传pkg.ipa,运行ipa里的com.apple.mobile.installation_proxy(本地安装),然后再把程序图标改成Evasi0n越狱图标~ 大功告成!
现在有趣的开始了:再通过afc复制进手机两个文件,包含"#!/usr/libexec/afcd-S -d / -p 8888"的” Downloads/WWDC.app/WWDC”和"Downloads/WWDC.app/gameover.dylib"。懂了吧,这软件就是为了执行afcd用的,-S 是为了访问特殊文件,-d /让afcd在root下运行,-p 8888使其在8888端口运行。
但是afcd有沙盒限制的,肿么办捏? 注入刚才传上来的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呢?木有人。漏洞开始:如果S_ATTR_LOC_RELOC被设置成全可执行,当头+x被检查后+x就会被移除掉,但是在+xpages被映射前,执行代码签名
Afcd从binary里初始化沙盒,所以干掉dylib(gameover的LC_ID_DYLIB是"/usr/lib/system/libsystem_sandbox.dylib"),沙盒就不会被初始化,afcd也就想干嘛就干嘛了。
但是又怎么让dylib加载呢?就是下一步配置系统了。
5. 配置系统(1/2)。第一步先忙活些没用的,但是很可爱。从afc(还是执行在沙盒中的afc),想要访问”/tmp”就要创建个symlink。但是afc还是很聪明的不在目录外创建symlink。symlink("../../../../../tmp","Downloads/a/a/a/a/a/link") 还是在沙盒里面,是吧~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",把"EnvironmentVariables"加入,到developer.apple.wwdc-Releaseapp。最帅的:"DYLD_INSERT_LIBRARIES -> /private/var/mobile/Media/Downloads/WWDC.app/gameover.dylib",现在afcd运行,gameover.dylib被注入。
现在要用mobilebackup来利用第二个漏洞、
现在的目的是把文件随便拷入/var,但不行,因为afc还运行在沙盒里。但是没事,可以编辑”/tmp”,像刚才展示的。对于每一个在"/var/mobile/Library/Caches/com.apple.mobile.installation.plist","/var/mobile/Library/Caches/com.apple.LaunchServices-054.csstore" 的文件,被强制重建, 和"/var/mobile/Library/Preferences/com.apple.backboardd.plist",被加入"BKNoWatchdogs"="Yes"去掉了程序启动30秒超时, 新建一个 "pkg.zip", 用afc上传到"/var/mobile/Media"。
然后,用命令去安装它,解压并创建了"/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")
<p style="line-height: nullpx; text-indent: 0em; text-align: left;">installd_extract("/var/mobile/Media/pkg.zip","tmp/install_staging.XXXXXX/foo_extracted")</p>
当解压到"tmp/install_staging.XXXXXX/foo_extracted",文件会去"/var/mobile/Library/Caches/",没有沙盒。
7. 重启。第一次重启。让com.apple.mobile.installation.plist 重新加载。
8. 要继续,请解锁设备并点Evasi0n图标。最后,当你点击图标,执行"#!/usr/libexec/afcd -S -d / -p 8888",gameover.dylib关闭了afc沙盒,但是还是mobile用户组。程序会快速做两件事,在沙盒外:symlink("../../../../../dev/rdisk0s1s1","/var/mobile/Library/Logs/AppleSupport")
利用漏洞,这个文件在每次重启时被CrashHousekeeping 执行chown mobile:mobile, 因为chowm要通过symlinks…
然后告诉"/var/mobile/Library/BackBoard/applicationState.plist"下次开机时重开evasin软件。
9. 再重启。。。"/dev/rdisk0s1s1"被chowm mobile:mobile,像刚才说到的
10. 修改rootfs。
现在afc在沙盒外运行,"/dev/rdisk0s1s1"是mobile:mobile,开始写块设备。
现在内核已经不允许重新以rw挂载rootfs。所以直接用afcd的-S选项写块设备。
被写入文件:
"/evasi0n7"-- the main binary which does the kernel exploit.
"/evasi0n7-installed"-- just a blank file
"/System/Library/LaunchDaemons/com.evad3rs.evasi0n7.untether.plist"-- touched to make launchd load this
"/System/Library/Caches/com.apple.xpcd/xpcd_cache.dylib"-- the new home of the LaunchDaemons, codesign haxx
"/System/Library/Caches/com.apple.dyld/enable-dylibs-to-override-cache"-- convinces the system to look on the filesystem before the dyld_cache
"/usr/lib/libmis.dylib"-- overrides the symbols in amfid to make the signature check return 0, withabove codesign trick
You know,[re-export] _MISValidateSignature (_CFEqual from CoreFoundation)
<p style="line-height: nullpx; text-indent: 0em; text-align: left;">"xpcd_cache.dylib" contains a plist with just twolaunchdaemons, com.apple.MobileFileIntegrity, which starts with the signaturefree libmis.dylib, and com.evad3rs.evasi0n7.untether, which is the unsigneduntether.</p>
由于DYLD_INSERT_LIBRARIES不会在amfid下好使,因为他有"__RESTRICT"字段。因此用刚才的trick,替换掉了真正的library.
11. 再重启。这回是更新刚才对块设备的更改。
12. 以root在设备上允许 /evasi0n7。现在又能看到水滴屏幕了,剩下的事就交给用户和稀泥了。
翻译的威锋技术组Jackie099有话说:由于好多术语无法翻译。不准确的地方求大家去看英文原版,清楚的多。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: