越狱检测与反检测及越狱社区未来发展

大家好, 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).

你可能感兴趣的:(越狱检测与反检测及越狱社区未来发展)