越狱过程一直是个神秘的过程,iOS系统在运行了一个应用程序几秒钟后突然摆脱了苹果的束缚。在很长一段时间里,这个应用程序的运行期间究竟发生了什么在很大程度上是未知的,甚至直到今天,直到iOS 11(实际上,是12),最终用户(即临时用户、eta民间用户、重定向器或者唠叨)仍然对正在进行的进程基本上不求甚解。在这篇博客中,我将试图解释历史上实现和使用越狱的主要要素。这篇文章并非包罗万象,各种iOS版本的各种越狱工具可以使用不同的补丁程序和技术,但它们的确基本上都浓缩到您将要阅读的内容中。
这个过程的命名可能来自苹果的“Jailed(监禁)”方法。应用程序和用户必须只使用苹果提供的,这只是该设备能力的一小部分。打破这个监狱的限制是整个越狱进程的愿景。
不,Cydia和越狱本身没什么关系。Cydia是越狱“社区”的副产品,不是只要有了Cydia,越狱就会被称为越狱,就像越狱缺乏Cydia仍然是越狱。区别在于他们的目标群体(或者说用户基础)。
Cydia是一个GUI(图形用户界面)应用程序,它在后台使用dpkg和apt(以及其他)安装.deb(Debian)包。这些软件包遵循一种非常严格的格式(要我说是太严格了),我将在后面讨论。正如聪明人可能已经想到的,您不需要Cydia来安装包。由于Cydia依赖于apt和dpkg(等等),您可以简单地通过SSH或者通过设备上的移动终端应用程序使用这些二进制文件。Cydia正是为了让这个过程尽可能简单。也有可能更复杂。
所以,是的,我的iOS 11.3.x/11.2.x 越狱,Osiris,早在Electra还没成型之前就发布了,过去和现在都是越狱,尽管我从来没有用过任何GUI安装程序(Cydia或者类似的)。同样的情况也适用于Jonathan Levin(iOS 11到11.1.2)的LiberiOS,这可能是迄今为止最稳定的iOS 11越狱。这些越狱事件主要针对研究人员和高阶玩家,而不是小白(他们通常因缺乏Cydia而大发雷霆)。
越狱必须运行在能够打开Cydia、Installer 5、Icy Project或设备上的SSH之前。越狱的步骤取决于iOS版本和设备。它以前对设备类型的依赖较少,但是随着iOS 9.0上的KPP(内核补丁保护程序)和iOS 10上的KTRR(所谓的内核文本只读区域)的出现,现在,越狱成功的几率与设备型号越来越相关了。例如,iPhone 7之前的设备使用KPP,它是在EL3(ARM异常级别3)中运行的软件保护,但是iPhone 7和更新的设备使用基于硬件的KTRR。在这种情况下,只包含KPP绕过(比如Yalu)的越狱程序在iPhone 7上无法工作,而且更新版本也不行,因为KPP本身并不存在。然而,多亏了@xerub和“KPPLess”的方法,Yalu支持了iPhone 7。通常,对于这些设备,需要某种KTRR绕过,正如siguza在他给KTRR准确命名的文章中所解释的那样。因此,通过这种方式,越狱工具必须非常清楚,它处理的是什么类型的设备。
在设备上发生任何事情之前,必须以某种方式将jailbreakpayload部署到设备。这在今天听起来可能非常微不足道,因为任何人都可以获得一个免费的苹果开发者帐户来签名一个IPA文件,并通过CydiaImpact或类似工具将其安装到的设备上,但是它以前并不这么简单。苹果公司通过iOS 9.0向大众介绍了这个带有配置文件的自签名,这在越狱的历史上并不久远。
在那之前很久,CodeSign被技术高超的越狱团队以非常有趣的方式绕开了,不幸的是,这些团队已经消失很久了。如果你还有积灰的iPhone 4,那么你很有可能使用Pangu for iOS 7.1 - 7.1.2越狱。小聪明们可以很容易地看到,由于这里讨论的是iOS 7.1.x,因此使用免费配置文件进行自签名和部署签名的IPA是不存在的。那么他们的技巧是什么呢?
Pangu for iOS 7.1-7.1.2有自己的Windows和macOS程序为您进行部署。它安装的应用程序(就称为“Pangu”吧)用当时存在的企业证书进行签名,这是很强大的东西,但是在黑市上不像今天那么容易获得(所以出现了这些签名服务,如Ignition和AppValley)。
然而,他们的证书过期了。电脑上的Pangu程序提示用户将设备的日期和时间设置回2014年的日期(更具体地说,是2014年6月2日)。 虚拟应用程序由盘古程序部署,它的主要目的是丢弃这个宝贝证书。IPA本身实际上是盘古Windows /MACOS二进制本身的一部分。使用任何反汇编程序(我使用JToo工具和IDA)很容易被发现。Jonathan Levin的Jtool具有一个可以生成HTML输出的牛逼功能(!)当我写博客时,这是非常有用的。
下面是Pangu二进制在MaOS上的样子。看到那个多出来的段了吗?
你看见 __TEXT.__objc_cons2
区了吗?
你计算一下0x10029ed87 - 0x10003dc04 = 2494851 bytes
(十进制)也就是2.494851兆字节。这是一个很大的section。也难怪,它被嵌入到IPA文件中。objc_cons1, objc_cons2 和 objc_cons3 都被嵌入到越狱有效载荷中(untether, plists, libraries等)。
多说无益,还是看看吧!
Jtool是一个非常强大的工具。它有能力从二进制中提取整个部分。命令是jtool -e(extract)/PATH
。如果我们对Pangu二进制文件这样做,我们将得到一个名为pangu.__TEXT.__objc_cons2
的新文件,该文件正好能被file工具(1)标识为“gzip压缩数据,来自Unix”,那么tar tvf
应该能够很好地列出内容。它确实可以。
做一个tar xvf
会把内容提取到“Payload”文件夹,tar xvf命令可以将里面的内容解压出来。因此,在手机上部署的IPA文件实际上是ipa1。如你所见,有一个名为embedded.mobileprovision的文件,其中包含企业证书。如果我们右键单击它并选择“获取信息”,Finder就能够向我们显示一些关于内嵌的证书的信息。正如你所看到的,它属于“Hefei Bo Fang”,我也不知道是什么。
正如你所看到的,Pangu和其他许多越狱一样,依赖于开发人员证书来绕过代码签名,但是将IPA部署到设备上并不像您想象的那么容易。现在,我们快速地打开Cydia Impactor,拖放IPA,登录,然后就可以了。这是直到iOS 9.0才出现的情况,所以Pangu必须像其他越狱团队之前做的那样——用苹果的矛来攻苹果的盾。 iTunes可以很容易地与设备通信,直到iTunes 12.x,iTunes也能够处理iOS应用程序。直到剥离了这个功能,但是也暗示了一个或多个框架(或Windows用户的DLL)在创建与设备的连接并执行与应用程序相关的任务时是必须的事实。当然,我们讨论的是AppleMobileDevice(framework/DLL)。在iTunes及其驱动程序包中,这个框架在以前的越狱中被广泛使用,它仍然被Windows上所有的“备份iOS/照片/通讯录/等等”程序用于与设备进行可靠的通信。当然,API是私有的,但它们被多个研究者逆向成狗食,又被其他研究者超越。它们也在libimobiledevice项目中重新创建。
如你所见,有了它,Pangu最终可以与设备进行通信,并在适当的时候投放有效负载。其余部分遵循下面将要讨论的一组几乎公式化的规范补丁。
Pangu是我想要的例子,因为它是相当新的,所以它应用了大部分的补丁(与ReSn0w等相比),也因为它是我在iPhone 4上经常使用的一个越狱。
我主要给出它作为一个示例,以便你可以看到在当时绕过CodeSign与现在绕过CodeSign之间的区别。
我已经创建了以下图表,它应该(在理论上)显示大多数越狱的流程。当然,实现和技术会因iOS版本和iOS版本而不同,一些越狱操作可能以完全不同的顺序进行。
因此,从图中可以看出,绝大部分重要的步骤都是在越狱设备上进行的,能在设备外部做的事情十分有限。入口向量因越狱补丁的不同而不同。如今,包括我的Osiris, Coolstar & Co’s Electra 还有 Jonathan’s LiberiOS在内的大多数越狱者都使用带有临时证书的IPA应用程序,并且使用Xcode或Cydia Impactor.(或签名服务)部署到设备上。然后,用户执行应用程序,并触发漏洞利用。
其他方法包括但不限于WebKit漏洞、邮件漏洞等。WebKit漏洞更普遍些,TotallyNotSpyware是iOS 10.x到10.3.364位Jailbreak的一个很好的例子,如果我们讨论遗留问题,JailbreakMe系列可能是最好的例子。这些基于WebKit的越狱通常通过Safari 访问特定的网址来实现 payload 部署。而该网址是经过精心设计,以触发 WebKit(Safari浏览器内核)漏洞。
在剩下的文章中,我将假设像Osiris, LiberiOS 或 Electra这样的基于IPA的越狱。此外,本文假设我们已经有了一个原始的内核漏洞,它提供了TFP0和KPPless方法。
在成功安装并运行应用程序之后,CodeSign不再是问题,至少在初始阶段是这样。我们仍然不能运行无签名或伪造签名的二进制文件,但至少我们可以自己运行(漏洞利用程序),而不会被AMFI杀死。然而,问题是我们仍然受到沙盒的限制。SandBox阻止我们访问容器之外的任何东西,因此没有“读/写”权限。我们能看到的只有我们自己的数据。这种情况必须改变。我们必须把Shai Hulud的力量赐予我们!
SandBox是一个内核扩展(KEXT),它确保你不会访问到超出应该访问的内容。默认情况下,在var/mobile/Containers的所有内容都是沙箱化的。苹果自己的默认应用程序也是沙箱沙箱化的。当您通过Xcode、App Store或Cydia Impactor安装应用程序时,您将自动将应用程序放置在/var/mobile/Containers/Bundle/Application/。没有其他方法安装应用程序,因此我们的越狱应用程序无论如何将默认沙箱化。 那么,应用程序是如何访问它们运行所需的服务的呢?Deezer如何连接到我的蓝牙耳机?YouTube如何解码帧?Twitter如何给我发送通知?简单,通过API。这些API允许容器化的应用程序以受控的方式与核心服务(bluetoothd, wifid, mediaserverd等)通信,这些核心服务也被沙箱化,这些核心服务通过IOKit与kexts/kernel通信。所以,你不能直接和内核对话。下面的图表可以帮助您了解。
当然,作为iOS上的应用程序,您不仅不能看到文件系统和用户数据,而且在很大程度上还忽略了其他应用程序的存在。是的,通过某些API,如果另一个应用程序注册为接受处理此类输入的应用程序,则可以将文件/数据传递给另一个应用程序,但即使这样,作为应用程序,您也不知道其他应用程序的存在,而是通过以下提供的一系列API,例如,发送.PDF文件以在任何应用程序中打开。 一些应用程序还提供uri schemes供你与它们通信。假设您在iOS上的Chrome中,找到了您想打的公司的电话号码。如果你按下它,你会被问到是否真的想打电话,然后直接从iOS转到Call应用程序,电话号码已经被拨了。这又是如何实现的呢?
简单。“电话”应用程序已经注册了一个URI scheme,它看起来是这样的:TEL://XXXXXXXXXXX,因此如果您将Tele: //5552220001添加到HTML页面并在Safari中单击它,iOS就知道要打开谁来处理它。Facebook,WhatsApp也一样,
要使用应用程序中的URI scheme,只需调用正确的UIApplication方法。那就是
那么这是否意味着您绕过了SandBox,因为您可以将数据传递到另一个应用程序并打开它?不是的。你所做的一切都是通过一套控制良好的API来完成的。你不知道手机应用程序存在。iOS知道。下面是沙箱对应用程序的感觉。
沙箱逃逸可以通过多种方式进行。
Osiris越狱使用了QiLin内置的沙箱逃逸工具,这个工具被称为“ShaiHulud”。
QiLin(还有LiberiOS和Osiris 越狱)凭借内核的证书逃离了沙箱。不仅如此,因为现在我们有了内核的证书,我们可以访问任何我们想要的东西,包括像execve()、fork()和posix_spawn()这样的系统调用!Jonathan Levin在本文.*OS Internals Volume III的一部分中很好地解释了Qilin如何从沙箱中逃脱,还有获得内核签名。
当然,QiLin保存了应用程序的证书,并在退出之前对其进行恢复,这是为了防止由于控制内核凭据的各种锁而造成恐慌。
Electra 的11.2.x -> iOS 11.3.1也使用了相同的内核证书方法来绕过沙箱和其他特权。
如果Jailbreak没有附带二进制包(也称为基本二进制文件),那么它就不能提供太多的价值。这个二进制包通常可以包含一长组的命令行二进制文件,可以通过编程或通过SSH连接使用。这些二进制文件包括但不限于二进制文件:重命名、移动、删除文件、像dropbear这样的SSH客户端及其依赖项、像ZSH这样的各种shell、像gzip这样的归档实用程序和标准chown,chmod和用于扰乱文件权限的chflag等。 NOTA BENE! Please do not confuse bootstrap with bin pack or base binaries. The base binaries are the same thing as the bin pack and they represent the usual unix binaries used for moving files, changing file permissions and owners, SSH, process probing, shells, etc. A bootstrap contains usually everything else: maybe a jailbreakd daemon (very common on Meridian, Unc0ver, Electra and Electra 11.3.1 but not on Osiris or LiberiOS), Cydia and other applications that may be installed by default. These are not base binaries 注意!请不要将Bootstrap与bin包或基本二进制文件混淆。基本二进制文件与bin包是一样的,它们表示通常用于移动文件、更改文件权限和所有者、SSH、进程探测、shell等的unix二进制文件。Bootstrap通常包含其他所有内容:可能是越狱守护进程(在Meridian, Unc0ver, Electra 和 Electra 11.3.1上非常常见,但在Osiris或LiberiOS上不常见)、Cydia和其他默认安装的应用程序。这些不是基本二进制文件。
纵观越狱的历史,相当的越狱团队已经以.tar格式构建了自己的二进制包,一旦他们访问了根文件系统,他们就部署和提取了.tar格式的二进制包,我们将在下面进行讨论。
在64位的iOS 11.x上,有一个由Jonathan Levin创建并在NewOSXBook上发布的非常好的通用二进制包,可以在任何iOS 11越狱中使用。该二进制包包含大量用于各种目的的二进制文件,包括ARM编译版本的jtool,用于扰乱签名并在设备上进行反汇编。 The following is the content of the binpack by Jonathan Levin used in his LiberiOS Jailbreak for iOS 11.x and my Osiris Jailbreak for iOS 11.2.x 以下是Jonathan Levin在他的LiberiOS Jailbreak for iOS 11.x和Osiris Jailbreak for iOS 11.2.x中使用的二进制包的内容
因此,我们利用了内核漏洞并获得了内核内存R/W,我们利用了一个bug,或者我们给自己提供了内核证书,然后我们也退出了SandBox,现在我们想要删除投放payload(它可以包含Cydia、二进制文件、配置文件、用于检查是否安装了越狱的虚拟文件等等)。为了做到这一点,我们需要对文件系统具有写权限。默认情况下,iOS根文件系统挂载为只读,所以我们需要重新安装它,因此补丁的名称为:Root FS Remount。
这就是2018年7月,当Electra for iOS 11.3.1处于开发阶段时缺少的组件,大多数eta folks都陷入了困境。
在QiLin(还有在LiberiOS和Osiris 越狱)上,重新挂载到iOS 11.2.6是这样工作的:正如我所说的,默认情况下,ROOT FS是作为只读安装的。不仅如此,SandBox还有一个hook,阻止您将其重新挂载为Read/Write。挂钩是通过mount_begin_update()和mount_common()中的MACF调用实现的。所有的钩子都检查在安装标志中是否存在MNT_ROOTFS标志。如果存在,则操作失败。那么QiLin做了什么呢?简单。它关闭MNT_ROOTFS标志。
以下罗列的是Qilin工具包中的remountRootFS,Jonathan Levin在newosxbook.com和*OS Internals的第三卷中公开提供。
Jonathan Levin的代码非常简单。翻转MNT_ROOTFS标志,调用mount(2)刷新用于挂载的内核代码路径,恢复标志并测试。完工。已经是R/W了。
在较早的越狱LightweightVolumeManager::_mapForIO补丁中完成了: Electra的重载 iOS 11.3通过引入APFS快照推进了一步。当苹果开始使用快照时,APFS在iOS中已经使用了相当长的一段时间,但是当他们这么做时,它打破了我们对iOS 11.2.x甚至更老版本的尝试和真正的重装。要解决这个问题,需要找到一个新的bug。问题在于,iOS将恢复到只读安装的快照,因此每次重新启动时,我们所安装的tweaks、二进制文件等内容都会消失。
在这一点上,有两件事情可以做:改变整个越狱,走向“ROOTless”,或者找到绕过快照的方法。正是由于@pwn20wnd和@umanghere,才创建了正确的重装。Umang发现了pwn20wnd在Electra中开发的一个“bug”。 好吧,说它是一个bug,有点夸张了。它不是一个bug,而是fs_snapshot系统调用的一个功能。不管怎样,它是有效的。 Pwn20wnd对于这个快照问题的绕过也是非常简单的。下面是Electra iOS 11.3.1源代码中的函数:
可能看起来很复杂。那是因为它本来就很复杂。Pwn20wnd花了很多工作来实现这个绕过,但是一旦知道了bug,问题就开始消解。看,这个bug非常简单:iOS在每次重启后都会恢复到APFS系统快照,如果有的话。问题来了——如果有一个。如果没有,iOS就会像在没有快照的iOS 11.2.6上那样随意地继续引导,而不是以破坏性的方式进行引导循环或出错。
那么补丁呢?查找并把快照重命名成其他东西。
怎么实现?有点复杂。如果分析代码,可以看到上述快照的名称是动态的(或至少包含动态部分),因此无法对其进行硬编码。动态部分恰好是boot-manifest-hash。在做任何事情之前,Pwn20wnd似乎给自己提供了内核凭证。 你可以通过运行以下指令找到它。ioreg -p IODeviceTree -l | grep boot-manifest-hash
在Electra中,用于查找boot-manifest-hash的所有逻辑都位于apfs_util.c中,如你在这里看到的:
这个函数是从另一个名为find_system_snapshot的函数内部调用的,该函数处理查找快照本身的逻辑。该函数将检索到的manifestHash附加到硬编码部分com.apple.os.update,从而得到当前快照的真实名称。然后,它将快照名称返回给调用者,但在将其大声打印出来之前不会返回:P:
有了内核的签名,以及快照的正确名称,Pwn20wnd将返回到rootfs_remount.c,以完成此宏大漏洞的最后一部分——重命名快照。他将其重命名为“orig-fs”,然后检查是否重命名成功。然后他恢复自己的凭据并删除内核凭证。最后,重新启动设备。这就是为什么第一次为iOS 11.3-11.3.1使用Electra时,无论使用哪个漏洞,您的设备都将强制重新启动。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-2-2 16:29
被kanxue编辑
,原因: