首页
社区
课程
招聘
[讨论]总结一下这段时间对于越狱隐藏的研究
发表于: 2021-1-10 21:54 31806

[讨论]总结一下这段时间对于越狱隐藏的研究

2021-1-10 21:54
31806

这个工具主要用于处理rootfs检测, 基于一种非侵入式, 不依赖基板, 不注入任何模块, 不修改目标进程任何代码和数据

 

原本设想的是通过磁盘系统的mount功能构建一个原始的rootfs,
虽然我们可以直接将原始rootfs快照直接mount出来, 但是必须处理/private/var分区的映射,
但是由于XNU内核不支持mount bind功能(支持mount union但是一个apfs分区不能mount两次),
所以还是只能修改内核vnode数据实现映射, 也许可以通过mount一个hfs格式的dmg分区实现(没有详细测试)
然后就是mount devfs到我们构建的rootfs上(这一步忘了踩了半天坑), 基本上还是kerbypass那一套

 

这是第一步, 构建出一个root根分区结构, 第二步就是让目标进程chroot到我们构建的这个rootfs目录
主要有两种方式, 一种是让目标进程调用chroot系统调用进行切换, 第二种就是kernbypass的直接修改proc的rdir和cdir
但是kernbypass是基于基板注入自己的dylib让目标进程暂停下来, 这种带有侵入式的方式本身就很容易被针对性检测

 

所以我想的是劫持launchd进程的posix_spawn启动子进程, 由于较新版本的ios系统, 苹果应该是对launchd和amfid这两个关键进程,
做了一些特殊防护, 我们自己写的dylib无法注入到launchd进程去, 所以这里采用了exception port来实现拦截.
拦截到posix_spawn之后, 修改attr参数的flags, 加入 POSIX_SPAWN_START_SUSPENDED 标记,
这样目标进程在创建起来之后, 并不会开始执行任何代码, 我们在posix_spawn函数返回后, 可以取得目标进程的pid,
然后使用change root vnode实现chroot即可.

 

最开始的时候我测试的是直接修改launchd进程的rdir之后, 就无法启动任何app了, 经过分析发现, 子进程在dyld阶段,
load system cache的时候失败了, 猜测这应该是posix_spawn的内核实现依赖当前进程的rdir数据,
只要目标进程创建完毕之后, 在dyld执行之前修改目标进程的rdir, dyld过程并不会受到影响.

 

经过这段时间对越狱隐藏的研究学习, 基本上也是对越狱过程的一个学习, 这里我只是重点研究了rootfs的隐藏.
这个poc也是分享给大家一起学习进步, 本身越狱过程对系统的改动是十分巨大的, 越狱隐藏的过程不亚于一次越狱恢复的过程.
所以要在目前公开的越狱工具基础上进行完美的越狱隐藏, 工作量也是非常大的, 而且由于公开的越狱工具并没有开源(完整开源),
导致我们对越狱过程中修改了系统哪些地方, 并不完全所知, 这并不是一个友好的事情. 要想实现完美的越狱隐藏, 最佳的方式还是基于越狱工具本身,
就像android的magisk和magisk hide, 我们需要推动越狱社区和越狱工具往新的方向发展, 越狱工具应当减少对系统的修改, 比如不再挂载rootfs为rw,
而是基于/private/var构建一个虚拟的rootfs给越狱APP使用, 而让部分需要隐藏越狱的app基于原始rootfs运行, 比如对于kernel和deamon的patch不再一刀切,
而是基于调用的进程进行差异化处理, 针对需要隐藏越狱的app执行原始流程逻辑, 这样才能实现深层次的, 不可检测性的越狱隐藏.

 

poc代码:

 

hiddon
a undetectiable way to hide rootfs
only a poc, test success on iphonex(ios 13.5.1), odyssey jailbreak
wechat pay work fine

 

https://github.com/tuancc-hub/hiddon


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 2
支持
分享
最新回复 (5)
雪    币: 0
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持
2021-2-5 20:47
0
雪    币: 141
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
2021-2-18 17:50
0
雪    币: 58
活跃值: (1269)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
个人认为kernbypass 至于是否能被app检测, 只要操作放在app模块加载之前即可. APP没有执行时机自然没法被检测. 但是kernbypass他就是个文件系统层面的检测屏蔽. 至于模块检测还是得自己处理, dyld肯定是要改造的
楼主说的kernbypass被检测, 是如何检测的呢
2021-11-7 15:28
0
雪    币: 58
活跃值: (1269)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
"主要有两种方式, 一种是让目标进程调用chroot系统调用进行切换"
楼主应该没理解kernbypass, 正因为这个系统调用需要权限的,普通app调用过不成功, 否则也不用实现内核chroot了. 
“这种带有侵入式的方式本身就很容易被针对性检测” 这个我就很疑惑, 请楼主给出检测方法吧, 如果有方法,那么也必然可以屏蔽
2021-11-7 15:37
0
雪    币: 263
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我就是这么干的 不挂载rootfs为rw  只注入自己要注入的进程 不进行全局注入 没有东西可以检测到 
2021-12-4 01:11
0
游客
登录 | 注册 方可回帖
返回
//