跳过内容

iOS 安全测试

在本章节中,我们将深入探讨安全测试环境的搭建,并介绍一些用于测试 iOS 应用安全性的实用流程和技术。这些是 MASTG 测试用例的基础。

iOS 测试设置

虽然您可以使用 Linux 或 Windows 主机进行测试,但您会发现许多任务在这些平台上很难或不可能完成。此外,Xcode 开发环境和 iOS SDK 仅适用于 macOS。这意味着您肯定希望在 macOS 上进行源代码分析和调试 (这也会使黑盒测试更容易)。

主机设备

以下是最基本的 iOS 应用测试设置

  • 理想情况下,拥有管理员权限的 macOS 主机
  • Xcode Xcode 命令行工具 已安装。
  • 允许客户端到客户端流量的 Wi-Fi 网络。
  • 至少一台已越狱的 iOS 设备 (所需 iOS 版本)。
  • mitmproxy 或其他拦截代理工具。

获取 iOS 设备的 UDID

UDID 是一个 40 位的字母和数字的唯一序列,用于标识 iOS 设备。您可以在 macOS Catalina 及更高版本的 Finder 应用中找到 iOS 设备的 UDID,因为 iTunes 在 Catalina 中不再可用。打开 Finder 并在侧边栏中选择连接的 iOS 设备。

单击包含型号、存储容量和电池信息的文本,它将显示序列号、UDID 和型号。

您可以通过右键单击 UDID 来复制它。

也可以在设备通过 USB 连接时,通过 macOS 上的各种命令行工具获取 UDID

  • 通过使用 I/O Registry Explorer 工具 ioreg

    $ ioreg -p IOUSB -l | grep "USB Serial"
    |         "USB Serial Number" = "9e8ada44246cee813e2f8c1407520bf2f84849ec"
    
  • 通过使用 libimobiledevice suite

    $ idevice_id -l
    316f01bd160932d2bf2f95f1f142bc29b1c62dbc
    
  • 通过使用 system_profiler

    $ system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p;/iPhone/,/Serial/p;/iPod/,/Serial/p' | grep "Serial Number:"
    2019-09-08 10:18:03.920 system_profiler[13251:1050356] SPUSBDevice: IOCreatePlugInInterfaceForService failed 0xe00002be
                Serial Number: 64655621de6ef5e56a874d63f1e1bdd14f7103b1
    
  • 通过使用 instruments

    instruments -s devices
    

在真机上测试 (已越狱)

您应该有一个越狱的 iPhone 或 iPad 来运行测试。这些设备允许 root 访问和工具安装,从而使安全测试过程更加直接。如果您无法访问越狱设备,您可以应用本章后面描述的解决方法,但请为更困难的体验做好准备。

在 iOS 模拟器上测试

与 Android 模拟器完全模拟真实 Android 设备的硬件不同,iOS SDK 模拟器提供了更高层次的 iOS 设备模拟。最重要的是,模拟器二进制文件被编译为 x86 代码,而不是 ARM 代码。为真实设备编译的应用无法运行,这使得模拟器对于黑盒分析和逆向工程毫无用处。

在模拟器上测试

Corellium 是唯一公开可用的 iOS 模拟器。它是一种企业 SaaS 解决方案,具有按用户许可模式,不提供社区许可。

获取特权访问

iOS 越狱通常与 Android Root 相比,但该过程实际上完全不同。为了解释这种差异,我们将首先回顾 Android 上的“Root”和“刷机”概念。

  • Root:这通常涉及在系统上安装 su 二进制文件,或用 Root 的自定义 ROM 替换整个系统。只要引导加载程序可访问,就不需要利用漏洞来获得 Root 访问权限。
  • 刷自定义 ROM:这允许您在解锁引导加载程序后替换设备上运行的操作系统。引导加载程序可能需要利用漏洞才能解锁它。

在 iOS 设备上,刷自定义 ROM 是不可能的,因为 iOS 引导加载程序只允许启动和刷写 Apple 签名的映像。这就是为什么即使官方 iOS 映像如果没有 Apple 的签名也无法安装,并且这使得 iOS 降级只能在之前的 iOS 版本仍然签名时才有可能。

越狱的目的是禁用 iOS 保护 (尤其是 Apple 的代码签名机制),以便任意未签名代码可以在设备上运行 (例如,自定义代码或从替代应用商店下载的代码,如 Cydia Sileo)。“越狱”一词是指自动化禁用过程的一体化工具的口语参考。

为给定版本的 iOS 开发越狱并非易事。作为安全测试人员,您很可能希望使用公开可用的越狱工具。不过,我们仍然建议研究已用于越狱各种 iOS 版本的技术 —— 您会遇到许多有趣的漏洞,并了解很多关于操作系统内部结构的知识。例如,适用于 iOS 9.x 的 Pangu9 利用了至少五个漏洞,包括一个 use-after-free 内核错误 (CVE-2015-6794) 和 Photos 应用中的任意文件系统访问漏洞 (CVE-2015-7037)。

有些应用会尝试检测它们运行的 iOS 设备是否已越狱。这是因为越狱会禁用 iOS 的一些默认安全机制。但是,有几种方法可以绕过这些检测,我们将在 “iOS 反逆向工程防御”一章中介绍它们。

越狱的益处

最终用户经常越狱他们的设备以调整 iOS 系统的外观、添加新功能以及从非官方应用商店安装第三方应用。但是,对于安全测试人员来说,越狱 iOS 设备具有更多好处。它们包括但不限于以下内容

  • 对文件系统的 Root 访问。
  • 可以执行未经 Apple 签名的应用程序 (包括许多安全工具)。
  • 不受限制的调试和动态分析。
  • 访问 Objective-C 或 Swift 运行时。

越狱类型

有线半有线半无线无线越狱。

  • 有线越狱不会在重启后保留,因此重新应用越狱需要在每次重启期间将设备连接 (有线) 到计算机。如果未连接计算机,设备可能根本无法重启。

  • 除非设备在重启期间连接到计算机,否则无法重新应用半有线越狱。设备也可以自行启动到非越狱模式。

  • 半无线越狱允许设备自行启动,但用于禁用代码签名的内核补丁 (或用户区修改) 不会自动应用。用户必须通过启动应用或访问网站来重新越狱设备 (不需要连接到计算机,因此称为无线)。

  • 无线越狱是最终用户最受欢迎的选择,因为它们只需要应用一次,之后设备将永久越狱。

注意事项

随着 Apple 不断加强其操作系统,为 iOS 开发越狱变得越来越复杂。每当 Apple 意识到漏洞时,它都会进行修补,并将系统更新推送给所有用户。由于无法降级到特定版本的 iOS,并且由于 Apple 只允许您更新到最新的 iOS 版本,因此拥有一台运行可用于越狱的 iOS 版本的设备是一项挑战。某些漏洞无法通过软件修补,例如影响所有 CPU 直到 A12 的 BootROM 的 checkm8 漏洞

如果您有一个用于安全测试的越狱设备,请保持原样,除非您 100% 确定升级到最新的 iOS 版本后可以重新越狱。考虑获取一个 (或多个) 备用设备 (每次主要的 iOS 版本发布都会更新),并等待公开发布越狱。一旦公开发布越狱,Apple 通常会迅速发布补丁,因此您只有几天时间可以降级 (如果 Apple 仍然签名) 到受影响的 iOS 版本并应用越狱。

iOS 升级基于质询-响应过程 (生成所谓的 SHSH Blob 作为结果)。只有在对质询的响应由 Apple 签名时,设备才允许安装操作系统。这就是研究人员所说的“签名窗口”,也是您无法简单地存储下载的 OTA 固件包并在您想要时将其加载到设备上的原因。在次要的 iOS 升级期间,两个版本都可以由 Apple 签名 (最新的一个和之前的 iOS 版本)。这是您可以降级 iOS 设备的唯一情况。您可以从 IPSW 下载网站检查当前的签名窗口并下载 OTA 固件。

对于某些设备和 iOS 版本,如果在签名窗口处于活动状态时收集了该设备的 SHSH Blob,则可以降级到旧版本。有关此的更多信息,请访问 cfw iOS 指南 - 保存 Blob

使用哪个越狱工具

不同的 iOS 版本需要不同的越狱技术。 确定您的 iOS 版本是否有可用的公共越狱。谨防假冒工具和间谍软件,它们通常隐藏在与越狱组/作者的名称相似的域名后面。

iOS 越狱场景发展如此迅速,以至于提供最新的说明很困难。但是,我们可以将您指向一些目前可靠的来源。

请注意,您对设备所做的任何修改都由您自己承担风险。虽然越狱通常是安全的,但可能会出错,您最终可能会使您的设备变砖。除您自己外,任何其他方均不对任何损害负责。