导语:虽然如今越狱已经变得越来越没有必要,但是越狱之后还是能实现各种强大的功能的,有兴趣的朋友可以读一读这篇文章。
虽然如今越狱已经变得越来越没有必要,但是越狱之后还是能实现各种强大的功能的,有兴趣的朋友可以读一读这篇文章。
在iOS中,所有运行的代码,包括应用程序,都必须由苹果公司颁发的证书进行签名。因此,应用开发人员或公司在上架他们的产品时,都必须通过App Store的认证。这使苹果公司能够对应用程序执行检查,并确保所有应该有符合公司制定的策略。所以要重新控制你的设备,并能够执行任何你想要的操作,你将不得不越狱。
越狱的发展史
越狱的主要目的是在iOS及其关联的设备上执行任意应用和二进制文件,在64位设备未采用iOS 9之前,还没有检查内核代码完整性的机制,这意味着在修复内核安全机制之前,攻击者可以内核的这个漏洞,获得读写访问权限。为了避免这个漏洞被修补,就有人从配置iOS 9的iPhone 5开始,引入了KPP(内核补丁保护),因为配置了iOS 9的iPhone 5可以使用EL3 CPU功能来执行内核安全检查。不过,卢卡斯•托德斯科(Lucas Todesco)却发现了一个漏洞,并将其应用于Yalu102越狱工具中。自iPhone 7发布以来,所有iPhone都配置了KTRR,KTRR与KPP功能相同,但更依赖硬件来强制否定对设备的写入访问,因此系统无法再进行内核代码的更新和修复。利用这个漏洞,Lucas Todesco能够将iOS 10的防护能力回溯到10.1.1版本。在此之后,我就再也没有听说过有什么漏洞可用于越狱的了,这意味着在新的iOS中进行越狱,将变得越来越困难了,攻击者只能对__DATA等可写段下手。
纵观越狱的发展历史,刚开始,越狱设备要么必须连接到计算机才能越狱(没有持久性);要么不受限制(在iOS重新启动后仍然越狱)。后来,越狱就是一种所谓的“半自动化操作”,即每次启动设备时,你都必须在手机上启动相关的应用程序才能越狱。因此,越狱软件的最好传播方式是将其打包为应用程序进行传播。如果要将打包为应用程序的越狱软件安装在手机上,用户需要使用免费或付费的开发人员帐户对证书进行签名,这可以通过Cydia Impactor轻松完成。Cydia Impactor是一款专门为IOS系统制作的越狱恢复系统,它可以将你已经越狱的设备恢复成之前未越狱的状态,而且恢复之后不需要进行系统升级。与其它的恢复软件相比,Cydia Impactor恢复之后会卸载所有安装的越狱数据包,但是会保留越狱时的系统版本,方便用户以后再次越狱使用。当然,这款软件还有一个功能就是免越狱安装软件,如果是没有越狱的设备使用Cydia Impactor电脑版的话,不需要越狱你的设备,通过它可以直接去安装越狱软件。
在通过开发人员的帐户进行签名后,用户就可以启动应用程序。请记住,Cydia Impactor目前处于测试阶段,这种方法安装的软件只能使用7天,如果想要继续使用的话,就要重复原来的安装步骤,到时候只要进行覆盖安装就可以保留软件的数据。
现代越狱技术的使用
由于大多数安全检查都是在内核中执行的,因此,越狱必须利用内核。
利用内核漏洞
利用内核漏洞的通常做法,首先是利用内核组件,如IOKit驱动程序或Mach层,其主要目的是利用此漏洞获取对内核内存的任意读写访问权限。对内核内存进行利用的最佳方法是通过内核任务,这是一个用于抽象和操作mach任务组件(如线程和虚拟内存)的对象。一旦实现了对内核的访问,就可以开始后期的重新开发和利用阶段。
后期的重新开发和利用阶段
为了获得越狱软件的全部功能,用户需要执行以下步骤:
1.获得root权限;
2.绕过沙箱的安全检测;
3.获得对root文件系统的读写访问权限;
4.绕过代码签名验证;
由于使用了KTRR,越狱软件可不会通过简单的修补内核代码来绕过安全机制,而是通过修复内核可写结构并操纵一些关键用户域组件来绕过安全机制。一些越狱方法可能会执行除上述步骤以外的其他步骤,以减轻最终用户的操作困难,并提供其他功能和组件。
LiberiOS和Electra两个越狱工具的对比研究
LiberiOS和Electra是支持运行iOS 11.1.2的两个主要越狱工具。LiberiO的第一个版本使用的是QiLin框架,而Electra则没有使用。这两个越狱都使用的是Ian Beer的async_wake漏洞来获取内核任务tfp0。开始利用此漏洞后,这两个工具会首先定位内核库,推断出ASLR 的slide。 Electra还定义了一个名为KCALL的宏,这样用户就可以使用v0rtex攻击中的技术调用内核函数。这样,LiberiOS和Electra使用他们的内核读写函数(基于tfp0)来克服安全机制。
root权限的获得
LiberiOS通过从QiLin调用rootifyMe函数来获得root权限,第一步是在内核内存中查找自己的进程结构。一旦找到进程结构,LiberiOS将检索凭证结构(进程结构中的偏移量0x100)地址。然后,通过覆盖位于偏移量0x18的有效、真实和保存的用户ID,将流程结构的UID和GID设置为0。此时,代码签名标志也设置为CS_SIGNED | cs_allowlements_validation | CS_GET_TASK_ALLOW | CS_VALID。
_setuidProcessAtAddr ; called by rootifyMe [...] LDR X8, [SP,#0x110+self_ucred] ADD X0, X8, #0x18 ; self_ucred + 0x18 (destination) LDR X8, [SP,#0x110+var_D0] ; local buffer filled with 0 (source) LDR X1, [SP,#0x110+var_C8] ; 12 (size) MOV X2, X8 BL _writeKernelMemory
Electra循环遍历进程列表并保存其中一些进程的地址,在此我要强调一下内核和Electra本身。在使用KCALL宏复制内核凭证位置后它将用内核凭据替换自己的MAC标签(在凭据结构中偏移0x78)。 MACF(强制访问控制框架)是iOS中用于hook系统调用或mach陷阱并执行各种检查(由MAC策略描述),以允许或拒绝操作的框架。MAC标签是这些策略用作存储空间的结构体,这也奠定了基于MACF(例如沙箱)机制来定义进程的权限。UID和GID设置为0的方式与LiberiOS相同,只是Electra也调用setuid(0)。
uint64_t kern_ucred = 0; KCALL(find_copyout(), kern_proc+0x100, &kern_ucred, sizeof(kern_ucred), 0, 0, 0, 0); uint64_t self_ucred = 0; KCALL(find_copyout(), our_proc+0x100, &self_ucred, sizeof(self_ucred), 0, 0, 0, 0); KCALL(find_bcopy(), kern_ucred + 0x78, self_ucred + 0x78, sizeof(uint64_t), 0, 0, 0, 0); KCALL(find_bzero(), self_ucred + 0x18, 12, 0, 0, 0, 0, 0); setuid(0);
绕过沙箱机制
以下结构是位于凭证结构的偏移量0x78处的MAC标签:
struct label { int l_flags; union { void *l_ptr; long l_long; } l_perpolicy[MAC_MAX_SLOTS];};
每个l_perpolicy“slot”由一个特定的MACF模块使用,第一个模块是AMFI,第二个模块是沙箱。LiberiOS调用ShaiHulud2ProcessAtAddr将0放在其第二个标签l_perpolicy [1]中。作为沙盒使用的标签(在函数sb_evaluate中处理),此操作将中和它,并同时保持AMFI(Apple移动文件完整性)l_perpolicy [0]使用的标签不变(它更精确,并防止有用的权限损失)。
MOV X1, #8 ; size ADD X8, SP, #0x50+zero STR XZR, [SP,#0x50+zero] LDR X0, [SP,#0x50+self_mac_label_ptr] LDR X0, [X0] ; self_mac_label ADD X0, X0, #0x10 ; self_mac_label->l_perpolicy[1] (destination) MOV X2, X8 ; pointer to 0 (source) BL _writeKernelMemory ;
通过将进程凭证内部的MAC标签替换为内核的MAC标签,Electra已经可以绕过沙盒机制了。
获得对root文件系统的写入访问权
绕过沙箱后,就可以调用mount函数。而要更新root vnode标志,则必须禁用标志MNT_ROOTFS,否则MACFhook会阻止它。所以Electra和LiberiOS在没有MNT_ROOTFS和MNT_RDONLY的情况下都调用了mount (Electra还会关闭MNT_NOSUID标志)。然后,用户可以手动将MNT_ROOTFS标志返回。现在,在手机的根文件系统上,用户就获得了完全的读/写访问权限。
绕过代码签名
代码签名检查由内核扩展AMFI及其守护进程amfid执行,对于LiberiOS,在绕过代码签名之前需要做两件事。首先,它将TF_PLATFORM标志添加到其任务标志,这是在守护程序上使用task_for_pid所必需的,因为只有平台二进制文件才能获得另一个平台二进制文件的任务端口。然后,它将从拥有task_for_pid-allow和com.apple.system-task-ports的进程借用权限,以启用对task_for_pid的调用,这分别由plateformizeMe和borrowEntitlementsFromDonor函数完成。最后一个 spawn /usr/bin/sysdiagnose则会借用权限并简单地用sysdiagnose替换LiberiOS MAC标签指针。
ADRP X8, #[email protected] ; "/usr/bin/sysdiagnose" ADD X0, X8, #[email protected] ; "/usr/bin/sysdiagnose" ADRP X8, #[email protected] ; "-u" ADD X1, X8, #[email protected] ; "-u" BL _borrowEntitlementsFromDonor
最后,利用LiberiOS调用castrateAmfid。此函数将使用setExceptionHandlerForTask为amfid注册一个新的异常处理程序。通过使用0x454D41524542494C(无效地址)覆盖amfid中导入的函数指针MISValidateSignatureAndCopyInfo,对MISValidateSignatureAndCopyInfo的调用将被重定向到自定义处理程序。通过始终返回布尔值0 (ok),处理程序将有效的绕过代码签名。
通过在内核的信任缓存中添加正确的信息,还可以绕过签名机制。信任缓存是用来验证ad hoc二进制文件的哈希数组。Electra使用函数inject_trusts将二进制文件inject_criticald,amfid_payload.dylib和pspawn_payload.dylib添加到位于可写内存(原始Trust Cache的缓存版本)中的Trust Cache中:
inject_trusts(3, (const char **)&(const char*[]){ "/bootstrap/inject_criticald", "/bootstrap/amfid_payload.dylib", "/bootstrap/pspawn_payload.dylib", // Don't forget to update number in beginning });
然后,产生守护进程inject_criticald,该进程又将amfid_payload.dylib注入amfid。通过使用fake_MISValidateSignatureAndCopyInfo重新绑定/usr/lib/libmis.dylib中的MISValidateSignatureAndCopyInfo符号,签名验证由Electra的替代函数执行:
void rebind_mis(void) { void *libmis = dlopen("/usr/lib/libmis.dylib", RTLD_NOW); //Force binding now old_MISValidateSignatureAndCopyInfo = dlsym(libmis, "MISValidateSignatureAndCopyInfo"); struct rebinding rebindings[] = { {"MISValidateSignatureAndCopyInfo", (void *)fake_MISValidateSignatureAndCopyInfo, (void **)&old_MISValidateSignatureAndCopyInfo_broken}, }; rebind_symbols(rebindings, 1); }
该函数会返回0,来代表LiberiOS处理程序。
文件系统修改
LiberiOS创建了一个新的目录/jb来添加实用程序二进制文件和amfidebilitate守护程序。 amfidebilitate的作用是始终保持amfid被禁行,因为如果amfid重新启动,则必须再次进行越狱。 LiberiOS和Electra通过Dropbear(一个相对较小的SSH服务器和客户端)为手机提供SSH访问。
Electra还添加了一个新的守护进程越狱功能,旨在提供对几个特别有用功能的权限访问。另外,LiberiOS和Electra还提供了一个shell脚本,来完全从文件系统中删除越狱。如果在UI Electra中启用了微调功能,那Electra将安装其他的组件。
总结
尽管LiberiOS和Electra越狱的目标都相同,但LiberiOS和Electra却是以不同的方式实现的。例如,代码签名绕过是通过注入或异常处理程序注册两个不同的过程完成的。 从安装的内容来看,LiberiOS和Electra针对不同类型的用户。 安全研究人员通常需要一些工具来轻松地在手机上进行各种实验,例如在对SSH访问和处理常见的二进制文件时,LiberiOS就足够用了,因为两者都提供了用于SSH的Dropbear且安装了几个二进制文件。虽然,附带的功能越少,对系统的影响会更低。 然而,Electra提供的附加功能,例如Cydia(iPhone、iPod touch、iPad等设备上的一种破解软件,类似苹果在线软件商店iTunes Store 的软件平台的客户端,在越狱的过程中被装入到系统中的,其中多数为iPhone、iPod Touch、ipad的第三方软件和补丁,主要都是弥补系统不足用),就比较受普通用户和开发人员的欢迎。
不过它们也有相同之处,即都是一种半绑定的越狱工具,用户可以自己重启iOS设备,但是在每次启动时,iOS设备启动序列都是未修改的,它们都将引导到其原始的、不被破解的状态。不过用户不需要通过电脑来重新越狱,仅需打开LiberiOS或Electra应用即可。