UnjailMe
一个基于以下内容的沙箱逃逸:
- Rani Idan(Zimperium)的概念验证 (CVE-2018-4087)
- @cheesecakeufo 的 securityd 溢出概念验证(零日漏洞,无已知 CVE,感谢 Abraham!)
关于 ZIMPERIUM PoC
Rani 使用了 Jonathan Levine 的 sbtool 来找出沙箱内可通信的服务。
然后他在 bluetoothd 下发现了更多内容,并设置了拦截发送至该服务及来自该服务的消息的代码。
通过这样做,他发现可以劫持许多守护进程的会话,并泄露客户端端口。
由此,他发现可以为客户端到 bluetoothd 的连接添加一个带有附加数据的回调。
其后果是,可以控制系统守护进程的进程计数器(回调)和寄存器 x3(附加数据),而该守护进程的客户端端口(会话)已被拦截。
这使得沙箱应用有可能逃逸到特权上下文,并以系统权限运行代码。
Apple 在 iOS 11.2.5 中通过为会话 ID 使用 arc4random() 修补了这些漏洞。
似乎已无法再获取客户端的端口,但会话劫持仍然可行。
在新补丁中暴力破解此 arc4random() 大约需要 5 天(4,294,967,296 种可能),因此我仍在期待最终补丁,因为这不被视为安全问题的修复。
来源:Zimperium 博客
关于 Abraham Masri 的 PoC
据我所知,这是与 securityd 通信时的一个缓冲区溢出。
通过提供一个 XPC 消息(基于字典的值-键消息)并带有无效长度来实现。
服务接收消息,发生下溢。
Abraham 似乎找到了一种方法来控制许多处理器寄存器,使得在系统内运行的应用能够以系统权限执行代码。
Abraham 的 PoC 显示他正尝试自己为此漏洞编写利用程序,因为存在用于泄露基地址的代码,这被认为是构建 ROP 链的开端。
尚不清楚 Abraham 是计划自己编写此利用程序,还是为我们指明正确方向。
要求
- 一台运行 iOS 10 至 11.3.1 的 64 位 iOS 设备
关于此项目
- 此项目不是越狱,也不会成为越狱的一部分,因为它仅在用户空间运行
- 此项目不能也永远不会获得写入根文件系统的能力,因为内核强制将其挂载为只读
- 此项目不会轻易允许像 Cydia Substrate 那样的动态库形式的任意代码执行
- 此项目的主要目标是将沙箱容器应用权限提升至系统权限
- AMFI 强制所有二进制文件必须有效签名,此项目无法修补 AMFI
- 该项目旨在获取用户数据分区(/var/root, /var/mobile)的读写权限
- 该项目旨在获取受保护钥匙串存储的访问权限,用于凭据恢复和取证目的
- 该项目还旨在提供服务器功能,以便以 root 权限运行代码和进行文件传输
- 该项目旨在为开发者和研究人员的贡献提供帮助
- 该项目将使越狱开发者和安全研究人员更容易找到内核驱动中的漏洞(这些漏洞仅在特权上下文中可访问)或使用模糊测试技术找到用户空间漏洞
- 该项目将使越狱插件开发者更容易研究新的 iOS 11 功能,并在真实设备上调试插件开发
- 此项目主要针对 iOS 10 至 11.2.5,但从理论上讲,当相关利用程序开发完成后,也可支持 11.2.5 至 11.3(含)的版本
截图
如何使用该应用
- 该应用不会为项目增加任何价值,但可作为那些要求(很多社区里兴奋的人要求)的视觉展示
- 该应用将转储库和框架的信息,包括内存、mach-o 信息及其基地址,这对于 ROP 开发很有用
- 应用中的逻辑可能需要最多 15 分钟才能完成,因为有很多解析和打印输出,最终版本中不会如此
- 该应用不会为你的 iPhone 增加任何价值,也不会改变其软件行为;某些守护进程可能崩溃,但不会对系统造成永久性损坏
- 建议研究人员改为在 Xcode 中运行此项目
故障排除(非必需,但以防万一)
功能
- FTP 访问(目前沙箱内,将来会解除沙箱)
- 视觉 PoC
- Zerodium 的 PoC(最终略有改进,可调用 system() 函数)
- Abraham 的 PoC,应能够以 root 身份运行任意代码,非常适合 SSH
- Sem Voigtlander 的 PoC(内核地址空间分配 DoS,用于设备重启功能)
计划中
- 完整利用,包括完全控制其他守护进程的地址空间
- 远程 SSH shell 访问(Dropbear 或其衍生版本)
未来考虑事项
- SpringBoardd 代码注入(越狱爱好者你们好)
launchd(不可能,因为我们无法获取其会话)
假设(仅为推测)
- 查找具有 launchd 授权的守护进程 / 注入授权
注入加载 BaseBoard 框架的代码
- 泄露 dyld_shared_cache 中库的地址
- 在 dyld_shared_cache 的任何库中寻找 ROP gadget
- 通过设置回调和回调附加数据来调用 ROP 链
- 使用 BaseBoard 的反向工程逻辑使 launchd 在禁用 ASLR 的情况下运行 amfid 并带参数
- 修补 amfid
- 使用 BaseBoard 的反向工程逻辑使 afcd 在禁用 ASLR 的情况下为 / 运行带参数(类似于 afc2)
- 使用 BaseBoard 的反向工程逻辑运行 unjaild,这是一个可用作 launchd 包装器的守护进程,处理任务权限和代码注入
- 使用 BaseBoard 逻辑获取禁用 ASLR 的 launchd 的任务端口
待检查
- AMFI 补丁(不容易,我们无法获取 amfi 的会话,但或许可以通过其他守护进程进行提升)
- 授权注入(不太必要,因为我们控制了许多守护进程,不需要这个)
- 使用私有 API 进一步提权(BaseBoard.framework 可以以系统权限启动禁用 ASLR 的进程)???
- 复活 liblorgnette 并将其移植到 iOS (已完成)
下载 ipa
https://github.com/MTJailed/UnjailMe/releases/tag/0.1
鸣谢
- 感谢 Abraham (@cheesecakeufo) 提供的 securityd 零日漏洞
- 漏洞和初始 PoC:Rani Idan (Zimperium) <3
- PureFTPd
- liblorgnette 项目(我做了轻微改进)
- @ringarang 提供的新 UI
捐赠或贡献