如何在我们的应用程序中检查 root iOS/iPadOS,例如最近的 checkra1n 漏洞?

How to check for rooted iOS/iPadOS in our apps, like the recent checkra1n exploit?

我正在研究越狱 iOS 的 checkra1n 漏洞,并查看了一些提醒用户您的设备已被入侵的开源库。

是否有安全证书可以识别设备是否已越狱或直接 link/API 我们的应用程序在进行关键交易之前验证的 Apple 服务器?

基本上,这里的问题陈述是恶意用户不应该能够从 root 设备或应用程序的沙盒环境访问关键交易数据。

没有用于检查越狱设备的 API,所有检查都是在本地进行的,但是您可以实施相当多的检查来让攻击者的工作变得更加困难:

  1. 您可以让您的应用 "ask" 在调试器上 OS 不 运行 如果是,它只会崩溃。你可以阅读更多here.

  2. 您可以检查文件系统是否存在特定文件,这些文件仅存在于越狱的 phones FileManager (NSFileManager):

    • /Applications/Cydia.app
    • /Library/MobileSubstrate/MobileSubstrate.dylib
    • /bin/bash
    • /usr/sbin/sshd
    • /etc/apt
    • /private/var/lib/apt/

      1. 您可以检查您的应用是否可以 open/handle 到 Cydia 的深层链接:"cydia://package/com.example.package"
      2. 您可以检查您的应用程序是否具有 运行 root 权限,方法是尝试从您的应用程序的沙箱中创建一个文件(假设在文件系统的根目录中),然后将其删除。
      3. 您可以查看当前加载了哪些动态库。当 phone 越狱时,会加载一些特定的框架,例如:
    • MobileSubstrate (用于连接到应用程序的进程)
    • SubstrateLoader (用于连接到应用程序的进程)
    • CydiaSubstrate (用于连接到应用程序的进程)
    • libcycript (来自二进制文件解密工具的库)
    • cynject (来自二进制文件解密工具的库)

如果您决定实施这些检查,请注意一些事项,例如您如何将字符串存储在二进制文件中。如果你的可执行 Mach-O 文件在像 Hopper 这样的反汇编器中被查看并且你已经存储了字符串 "MobileSubstrate" 攻击者可以很容易地在可执行文件的 __TEXT 区域看到它,看看使用这个地址的地方并猜测您正在尝试执行越狱检查,然后 NOP 退出整个越狱测试功能。保持字符串以某种方式编码,比方说 Base64。

你做越狱测试的其他死赠品,是函数名称,不要像 isJailbroken() 这样命名你的函数,因为这些符号可以再次看到,使用无意义的名称(与良好的编程习惯相反)。还要将标记 __attribute__((always_inline)) 添加到与越狱检查相关的 c 函数的声明中,将 @inline(__always) 添加到 Swift 中的函数的声明中。如果您不熟悉函数内联,您可以阅读更多相关内容 here.

我已经构建了一个包含所有这些检查的框架,混淆但有很多评论,如果你愿意你可以检查一下here

越狱现场是一场猫捉老鼠的追逐,谁能胜出,就看谁愿意付出更多的努力。

希望对您有所帮助!