背景 #
在安卓系统中,权限控制十分的严格。 举个例子,APP想要连接网络,需要权限;想要拉起相机,需要权限;想要读写文件,需要权限,等等。 这样做的目的是防止APP应用恶意的对系统进行破坏。
实现权限管理功能的模块叫做SELinux( Security Enhanced Linux )。
SELinux #
Security Enhanced Linux,顾名思义,安全增强的Linux。 在传统的Linux中,权限控制的基本单位是“用户”,root用户可以拥有所有的权限,因此各大黑客、漏洞的目标都是获取root用户,从而可以获取所有的权限。 这种模式也叫作DAC 自主访问控制Discretionary Access Control
但是SELinux的权限基本单位是“进程”,这种模式也叫作 MAC 强制访问控制Mandatory Access Control
因此SELinux的权限配置也十分的复杂,详情请自行谷歌 SELinux的官方文档。
SELinux的配置: #
**TODO **
暂时关闭SELinux #
SELinux有三种模式:
- Enforcing 强制— SELinux 策略强制执行,基于 SELinux 策略规则授予或拒绝主体对目标的访问
- Permissive 宽容— SELinux 策略不强制执行,不实际拒绝访问,但会有拒绝信息写入日志
- Disabled 禁用— 完全禁用SELinux
一般我们调试时,可以将SELinux设置到Permissive模式:
在uboot的启动参数中加上 androidboot.selinux=permissive
即可
root #
虽然Android系统上主要使用SELinux来做权限管理,但是Linux的基于用户的权限管理仍然生效。举个栗子:
假设某个应用即使有读写文件的权限,但是仍然不能直接读取/var/log 这种uid是root的文件。
如果此时我们要让应用读写、操作root权限的某些命令,就需要给安卓系统进行root。
给安卓系统进行root: #
【Android 10 编译完全root版本】https://www.jianshu.com/p/b7b0361aca34
另外,系统进行了root之后,可以通过 adb shell pm grant package_name permission
给APP授权。而不弹窗。
安全的root #
上述文档是对整个系统开放了root,这实际上是不安全的。 比较安全的方法的是对某一个APP开放root,其他APP均向那一个APP申请root权限。这也是superSu、magisk这种常见的root工具的做法。