了解Superuser和su

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#cofface.com(请将#替换为@)

转载请注明来源:Cofface Blog » 了解Superuser和su

赞 (31) 打赏

感谢您的支持,我会继续努力的!

支付宝扫一扫打赏