Android是在linux基础上构建的,权限的管理即要依赖apk中的permission,也要考虑和linux的uid/gid的方式结合。虽然很多操作可以在java层完成,但诸如设备文件的访问,又要回归到传统的uid/gid管理模式,比如设备文件
crw-rw---- bluetooth net_bt_stack 204, 68 2016-12-07 13:24 ttyAMA4
net_bt_stack组对设备文件是可以操作的,如果查看/system/etc/permissions/platform.xml
<permission name="android.permission.BLUETOOTH_ADMIN" > <group gid="net_bt_admin" /> </permission> <permission name="android.permission.BLUETOOTH" > <group gid="net_bt" /> </permission> <permission name="android.permission.BLUETOOTH_STACK" > <group gid="net_bt_stack" /> </permission> <permission name="android.permission.NET_TUNNELING" > <group gid="vpn" /> </permission> <permission name="android.permission.INTERNET" > <group gid="inet" /> </permission> <permission name="android.permission.READ_LOGS" > <group gid="log" /> </permission> <permission name="android.permission.WRITE_MEDIA_STORAGE" > <group gid="media_rw" /> <group gid="sdcard_rw" /> </permission> ...
可以看到,如果apk申请了android.permission.BLUETOOTH_STACK权限,它的进程将具备linux的uid/gid管理体系下的net_bt_stack组权限
运行该apk,然后查看/proc/pid/status,Groups中也直接阐明了这一点
State: S (sleeping) Tgid: 13412 Pid: 13412 PPid: 15316 TracerPid: 0 Uid: 10135 10135 10135 10135 Gid: 10135 10135 10135 10135 FDSize: 64 Groups: 3001 3002 3008 9997 50135
但这并不意味着,直接su app_id得到的shell具备该gid。Android下的su并不是基于/etc/passwd等文件实现的完整权限切换,仅保留了uid的信息。不过Android提供的run-as可以完整切换权限,得到具备该gid的shell