大家好, 2021新年快乐!
随着ios系统本身的逐步完善以及智能手机的发展步入成熟阶段, 普通用户对于越狱需求的逐步降低, 整个越狱社区略显疲态, 形成一个恶性循环, 这无论对于我们喜欢搞机爱好者, 还是喜欢研究的开发者来说, 都不是一个好消息.
其中特别是一些主流APP,如银行类, 游戏类, 抖音等使用技术手段进行越狱检测以区别对待不同用户群体的做法, 利用自身的市场垄断地位, 逼迫用户二选一, 给越狱社区的发展蒙上了一层阴影.
所以基于此,我想邀请大家建立一套持久的, 深层次的, 不可检测的反越狱检测模块. 以促进越狱社区的发展.
重点我们可以参考android系统的magisk hide, 当然由于ios本身的越狱和android的root还是有较大差异, android的root目前主要以厂商解锁bootloader后刷入自定义的boot镜像, 在启动阶段进行patch, 只需要获取到用户态的root身份即可. 而ios的越狱目前主流则以通过用户态的APP利用内核漏洞获取到内核权限patch内核代码实现. 并且root过程会产生和越狱行为相关的文件到磁盘. 所以综合来说, ios的越狱状态相比android会对系统造成更大的变化, 也更加容易被检测.
目前主流的越狱检测方式如下(水平有限莫喷):
1:基于文件的检测, 上面提到, 越狱过程中会产生一系列和越狱相关的文件到磁盘, 以及越狱后安装的各种框架, 插件, APP等.
虽然普通APP在沙盒中无法读写这些文件, 但是可以获取到这些文件的状态, 例如: 是否存在, 文件大小, 是否为符号链接等. 由此可以比较准确的判断手机是否被越狱过(可能无法区分当前越狱是否激活).
2:基于系统相关API的行为变更, 上面提到, 越狱需要利用内核漏洞patch内核相关代码, 以及可能会对系统其它相关服务进程进行patch修改, 那么必然会导致一些系统API的行为产生可预期的变化.
例如: fork, system等, (以及越狱程序一般会patch代码签名相关的组件, 也许可以检查这一点)
3:基于检测相关越狱框架和app的方式, 比如检测cydia的 url scheme是否可用, 检测当前进程是否有加载mobile substrate基板模块,越狱相关进程等.
基于此,我们便有了相应的通用处理方案, 先说第3点, 对于检测越狱相关app等, 可以采取随机改名移位, patch系统相关服务组件隐藏app等方式, 相对来说比较好处理, 而对于基板检测, 目前有substrate,substitute,libhooker等,我不确定是否默认会自动注入到所有APP进程, 可以通过改进过滤等方式, 针对需要隐藏越狱的APP不注入基板模块即可解决.
而对于第2种检测方式, 则可以通过patch内核和相关系统服务组件进程的方式, 针对需要隐藏越狱的APP, 执行原有代码流程逻辑, 即可规避该种检测方式.
对于第1种检测方式, 个人认为则是最难以处理的, ios系统越狱后, 不同的越狱程序, 安装了不同的越狱APP, 框架, 插件等, 对磁盘文件的改动, 都是不一样的. 我们既不能直接针对需要隐藏越狱的APP阻止访问磁盘系统, 也比较难以用通用性的方式隐藏所有和越狱相关的磁盘文件.
其中目前有一款开源的隐藏越狱插件kernbypass,
开源地址(https://github.com/akusio/KernBypass-Public) ,我大概看了一下原理和流程, 其注入了一个tweak到所有进程, 检查当前APP是否在需要隐藏越狱的名单中, 则暂停当前APP进程, 并通知其deamon程序通过内核端口tfp0修改内核中该APP进程的相关数据, 实现chroot当前APP进程的根目录到/private/var/MobileSoftwareUpdate/mnt1, 然后再恢复APP进程继续执行.
这款插件目前在我的iphone手机中测试对建行APP并不能有效, 而且其注入到每个进程的tweak dylib也极容易被针对性检测, 以及/private/var/MobileSoftwareUpdate/mnt1 在我的ios系统中查看到该目录为空, 是否意味着目标APP无法访问到任何根目录中的文件, 这也及其容易被针对性检测.
让我们来回想android的magisk hide是如何做的, magisk由于patch了boot启动文件, 在系统启动的早期阶段, 其利用linux的namespace mount构建了一个虚拟文件系统附加到系统原生的文件系统之上.
但是遗憾的是,目前来说ios的越狱都不是在系统的早期阶段, 而且ios的XUN内核也不支持namespace mount功能.
好在天无绝人之路,从ios10.3开始, 苹果采用了APFS磁盘文件系统格式, APFS有一个快照功能, 可以将一个磁盘分区的状态固定在某一个时间点, 并且支持单独以只读方式挂载磁盘快照(本身ios的rootfs就是以这种方式挂载的system分区). 所以我们也可以利用这一点, 针对特定APP来实现类似于systemless的反越狱检测方式.
当然一个人的力量是有限的,整个越狱社区的发展离不开众多开发者, 用户以及第三方的支持, 只有我们开发者使用技术的力量, 协助第三方壮大整个越狱生态, 才能让更多的用户选择越狱, 不排斥越狱. 才能避免被部分APP以强迫性行为倒逼我们用户进行二选一, 进而促进整个越狱社区的良性循环.
有兴趣的小伙伴可以加入我的越狱研究小群(703156427).