如何在我们的应用程序中检查 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,所有检查都是在本地进行的,但是您可以实施相当多的检查来让攻击者的工作变得更加困难:
您可以让您的应用 "ask" 在调试器上 OS 不 运行 如果是,它只会崩溃。你可以阅读更多here.
您可以检查文件系统是否存在特定文件,这些文件仅存在于越狱的 phones FileManager
(NSFileManager
):
- /Applications/Cydia.app
- /Library/MobileSubstrate/MobileSubstrate.dylib
- /bin/bash
- /usr/sbin/sshd
- /etc/apt
/private/var/lib/apt/
- 您可以检查您的应用是否可以 open/handle 到 Cydia 的深层链接:
"cydia://package/com.example.package"
- 您可以检查您的应用程序是否具有 运行 root 权限,方法是尝试从您的应用程序的沙箱中创建一个文件(假设在文件系统的根目录中),然后将其删除。
- 您可以查看当前加载了哪些动态库。当 phone 越狱时,会加载一些特定的框架,例如:
- MobileSubstrate (用于连接到应用程序的进程)
- SubstrateLoader (用于连接到应用程序的进程)
- CydiaSubstrate (用于连接到应用程序的进程)
- libcycript (来自二进制文件解密工具的库)
- cynject (来自二进制文件解密工具的库)
如果您决定实施这些检查,请注意一些事项,例如您如何将字符串存储在二进制文件中。如果你的可执行 Mach-O 文件在像 Hopper 这样的反汇编器中被查看并且你已经存储了字符串 "MobileSubstrate" 攻击者可以很容易地在可执行文件的 __TEXT 区域看到它,看看使用这个地址的地方并猜测您正在尝试执行越狱检查,然后 NOP 退出整个越狱测试功能。保持字符串以某种方式编码,比方说 Base64。
你做越狱测试的其他死赠品,是函数名称,不要像 isJailbroken()
这样命名你的函数,因为这些符号可以再次看到,使用无意义的名称(与良好的编程习惯相反)。还要将标记 __attribute__((always_inline))
添加到与越狱检查相关的 c 函数的声明中,将 @inline(__always)
添加到 Swift 中的函数的声明中。如果您不熟悉函数内联,您可以阅读更多相关内容 here.
我已经构建了一个包含所有这些检查的框架,混淆但有很多评论,如果你愿意你可以检查一下here
越狱现场是一场猫捉老鼠的追逐,谁能胜出,就看谁愿意付出更多的努力。
希望对您有所帮助!
我正在研究越狱 iOS 的 checkra1n 漏洞,并查看了一些提醒用户您的设备已被入侵的开源库。
是否有安全证书可以识别设备是否已越狱或直接 link/API 我们的应用程序在进行关键交易之前验证的 Apple 服务器?
基本上,这里的问题陈述是恶意用户不应该能够从 root 设备或应用程序的沙盒环境访问关键交易数据。
没有用于检查越狱设备的 API,所有检查都是在本地进行的,但是您可以实施相当多的检查来让攻击者的工作变得更加困难:
您可以让您的应用 "ask" 在调试器上 OS 不 运行 如果是,它只会崩溃。你可以阅读更多here.
您可以检查文件系统是否存在特定文件,这些文件仅存在于越狱的 phones
FileManager
(NSFileManager
):- /Applications/Cydia.app
- /Library/MobileSubstrate/MobileSubstrate.dylib
- /bin/bash
- /usr/sbin/sshd
- /etc/apt
/private/var/lib/apt/
- 您可以检查您的应用是否可以 open/handle 到 Cydia 的深层链接:
"cydia://package/com.example.package"
- 您可以检查您的应用程序是否具有 运行 root 权限,方法是尝试从您的应用程序的沙箱中创建一个文件(假设在文件系统的根目录中),然后将其删除。
- 您可以查看当前加载了哪些动态库。当 phone 越狱时,会加载一些特定的框架,例如:
- 您可以检查您的应用是否可以 open/handle 到 Cydia 的深层链接:
- MobileSubstrate (用于连接到应用程序的进程)
- SubstrateLoader (用于连接到应用程序的进程)
- CydiaSubstrate (用于连接到应用程序的进程)
- libcycript (来自二进制文件解密工具的库)
- cynject (来自二进制文件解密工具的库)
如果您决定实施这些检查,请注意一些事项,例如您如何将字符串存储在二进制文件中。如果你的可执行 Mach-O 文件在像 Hopper 这样的反汇编器中被查看并且你已经存储了字符串 "MobileSubstrate" 攻击者可以很容易地在可执行文件的 __TEXT 区域看到它,看看使用这个地址的地方并猜测您正在尝试执行越狱检查,然后 NOP 退出整个越狱测试功能。保持字符串以某种方式编码,比方说 Base64。
你做越狱测试的其他死赠品,是函数名称,不要像 isJailbroken()
这样命名你的函数,因为这些符号可以再次看到,使用无意义的名称(与良好的编程习惯相反)。还要将标记 __attribute__((always_inline))
添加到与越狱检查相关的 c 函数的声明中,将 @inline(__always)
添加到 Swift 中的函数的声明中。如果您不熟悉函数内联,您可以阅读更多相关内容 here.
我已经构建了一个包含所有这些检查的框架,混淆但有很多评论,如果你愿意你可以检查一下here
越狱现场是一场猫捉老鼠的追逐,谁能胜出,就看谁愿意付出更多的努力。
希望对您有所帮助!