1、 了解授权机制:
Su 被用户调用 —> Su创建了一个socket监听 —> Su 向Superuser发送了一个广播(即是有一个程序要请求root) —> su等待socket 数据接收(有超时处理) —> Superuser 界面收到广播后,弹出一个对话框,询问用户 —> Superuser 向传来的数据中的socket写回用户应答结果 —> Su 根据socket得到的结果处理应该不应该继续执行 —> 完成授权管理
2、 superuser是怎么知道谁想用root权限?
superuser 共有两个activity: SuperuserActivity 和 SuperuserRequestActivity ,其中SuperuserActivity 主要是用来管理白名单的,就是记住哪个程序已经被允许使用root权限了,省的每次用时都问用户。
SuperuserRequestActivity 就是用来询问用户目前有个程序想使用root权限,是否允许,是否一直允许,即放入白名单。
这个白名单比较关键,是一个sqlite数据库文件:
/data/data/com.koushikdutta.superuser/databases/superuser.sqlite
root的本质就是往 /system/bin/ 下放一个su文件,不检查调用者权限的su文件。普通程序可以调用该su来运行root权限的命令。
3、 su为什么一定要放到system?
adb shell mount 命令可以发现
/dev/block/bootdevice/by-name/system /system ext4 rw,seclabel,relatime,data=ordered 0 0
/dev/block/bootdevice/by-name/userdata /data ext4 rw,seclabel,nosuid,nodev,noatime,noauto_da_alloc,data=ordered 0 0
/dev/block/bootdevice/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,noatime,noauto_da_alloc,data=ordered 0 0
cache,data分区都是nosuid,所以不能给程序加SUID位,所以无法提权;
4、Android 4.2以后需要通过native service拉起su daemon之类的服务进程才能正常使用root相关功能;
Android 5.x以后需要搞定selinux才能正常使用root相关功能,新版的授权管理一般都带有类似
seinject的功能来注入安全策略,依靠替换系统服务如zygote等native service;
转载请注明来源:Cofface Blog » 了解Superuser和su