虚拟化分身是手游工作室刷资源、代练的基础工具。Chaos引擎作为商业虚拟化方案,已迭代30多个版本,伪装能力极强。本文深度解析Chaos引擎的虚拟化原理,以及金丝雀安全13种内核级检测策略。
一、Chaos引擎虚拟化原理
层次1: Mount Namespace隔离
宿主进程创建新的Mount Namespace
通过bind mount伪装/data/data、/sdcard等目录
层次2: Java层伪装
Hook ApplicationInfo.packageName返回分身包名
Hook ApplicationInfo.uid返回分身UID
层次3: 进程管理
分身进程使用宿主UID运行
通过cgroup调度组管理分身进程
核心矛盾:Chaos引擎可以伪装Java层信息,但无法完全伪造内核级信息。/proc、/sys等内核接口文件由Linux内核直接维护,Hook框架无法修改其内容。
二、Namespace维度(3项)
1. Namespace差异检测
对比进程的PID Namespace与User Namespace。虚拟化环境中分身进程的Mount Namespace与宿主不同。
2. mountinfo bind mount检测
// 正常进程: /data/data/com.game → /data/data/com.game
// 分身进程: /data/data/com.host → /data/data/com.clone (bind mount)
3. mountinfo自身包名缺失检测
正常进程mountinfo中一定有自身包名的数据目录挂载,分身进程只有宿主包名。分值60分,高置信度。
三、UID维度(3项)
4. UID不匹配检测
// Java层: ApplicationInfo.uid = 10XXX (分身UID)
// 内核层: /proc/self/status → Uid: 10YYY (宿主UID)
5. Groups辅助UID检测
分身进程Groups中包含宿主权限组(3001/3002)但缺少分身应有的权限组(3003)。
6. cgroup UID路径检测
从/proc/self/cgroup路径提取真实UID,与Java层UID对比。
四、cgroup维度(2项)
7. cgroup真实包名提取
从cgroup路径中提取进程的真实包名。分身进程的cgroup包名为宿主包名。
8. cgroup调度组过滤
过滤top-app、foreground、apps等调度组名,避免误判。
五、SELinux维度(2项)
9. SELinux MCS类别检测(60分,高置信度)
// SELinux上下文: u:r:untrusted_app:s0:cXXX,cYYY
// MCS类别 = (UID - 10000) * 2 + 50
// 分身进程: MCS类别与宿主UID匹配,与Java UID不匹配
// 原因: SELinux上下文由内核在进程创建时分配,无法伪造
为什么MCS不可伪造?SELinux上下文由内核security模块在进程fork时分配,MCS类别基于真实UID计算。修改SELinux上下文需要修改内核代码,非Root环境下不可能。
10. SELinux上下文异常检测
六、maps维度(3项)
11. maps多APK加载检测
分身进程maps中包含宿主APK的加载记录。
12. maps宿主SO库检测
分身进程加载了宿主的native库。
13. maps宿主数据目录检测
分身进程maps引用了宿主包名的数据目录路径。
七、评分机制与误判防护
| 检测项 | 分值 | 置信度 |
|---|---|---|
| mountinfo自身包名缺失 | 60分 | 高 |
| SELinux MCS类别 | 60分 | 高 |
| UID不匹配 | 50分 | 高 |
| cgroup真实包名 | 50分 | 高 |
| cgroup UID路径 | 50分 | 高 |
| 其他8项 | 30-40分 | 中 |
触发条件:总分≥80分 且 高置信度命中≥1项。正常设备所有检测项均为0分。Android系统特性(随机化目录、系统服务、cgroup调度组名)已做过滤。