Root Profile 的 UID GID 与补充组——给 su 降级的第一个抓手
Android 的用户与组模型
Linux 系统用「用户 + 组」做权限判断:每个用户有唯一 UID,每个用户可属多个组,每组有 GID。UID 0 是 root 用户,拥有最高权限。Android 里每个 App 都是一个独立用户(share uid 的情况除外):
0= root1000= system2000= ADB shell10000-19999= 普通应用
注意:这里的 UID 与「手机多用户 / 工作资料」不是一个概念。工作资料是对 UID 的分片(如 110000-119999),其中每个应用同样拥有自己的独有 UID。
在 adb shell 里执行 id,能看到 UID、主组与一长串补充组:
uid=2000(shell) gid=2000(shell) groups=2000(shell),1004(input),1007(log),
1011(adb),1015(sdcard_rw),3003(inet),... context=u:r:shell:s0
组是很多能力的开关:inet 组代表能建网络 socket,sdcard_rw 代表可读写存储。
Root Profile 能改什么
Root Profile 可以自定义应用执行 su 之后进程的 UID、GID 与补充组。两个经典用法:
- 降级 UID:把某应用 su 后的 UID 设为 2000——它拿到的实际是 ADB shell 级权限,而不是完整 root。冻结类应用这样配置最合适;
- 裁剪补充组:从组列表里去掉
inet——这个 su 就无法访问网络。配合防火墙类应用可实现「有 root 但不能联网」。
一个必须分清的边界
App Profile 控制的是 su 之后的权限,不是应用本身的权限。应用自己申请了网络权限的话,它不走 su 也能联网;去掉 su 的 inet 组只是让 su 这条路不通。
配置建议
- 先用最小集:给应用只开它功能必需的组;
- 修改前在 adb shell 里跑一遍
id,对照理解每一项的含义; - 改完让应用重新执行 su 实测,行为不符再回来调。