@guhuizaifeiyang
2018-09-12T17:53:46.000000Z
字数 2368
阅读 6118
Android开发
在android6.0以后的版本,google采用了SELinux的文件访问安全策略,想比较以前,绝对提高了文件的安全,不像以前那样,
对文件访问可以是无条件的。本篇文章就分享下常用的一些安全策略。
传统的 Linux设备文件访问控制机制通过设置用户权限来实现.
SELinux 拥有三个基本的操作模式
在SELinux中,所有访问都必须明确授权,SELinux默认不允许任何访问,不管Linux用户/组ID是什么。这就意味着在SELinux中,没有默认的超级用户了,与标准Linux中的root不一样,通过指定主体类型(即域)和客体类型使用allow规则授予访问权限,allow规则由四部分组成:
举例如下:
这个规则解释如下:
拥有域类型user_t的进程可以读/执行或获取具有bin_t类型的文件客体的属性.
a. 首先排除DAC权限的问题,使用“ls –l”检查相关文件的属主和权限。如果DAC的权限许可,则就是SELinux的策略显式地拒绝了当前操作的执行。
b. 通过“setenforce 0”命令进入permissive模式(getenforce命令查看模式)。此操作可暂时关闭selinux强制访问控制,可直接进行调试,若此时操作还是不允许,则与selinux无关。
c. 通过“adb shell dmesg | grep avc > avc_log.txt”查看 AVC log,在android6.0 版本中,这个用的最多。从分析失败操作相应的AVC Denied Msg入手区分问题的根源,以下为一条拒绝信息:
d. 使用 external/selinux/prebuilts/bin/audit2allow tool 直接生成policy.
audit2allow -i avc_log.txt
即可自动输出生成的policy
可在/device/qcom/sepolicy/common/untrusted_app.te文件中增加如下语句解决此问题:
allow untrusted_app sysfs_irdev : file { write };
SELinux(或SEAndroid)将app划分为主要三种类型(根据user不同,也有其他的domain类型):
1)untrusted_app 第三方app,没有Android平台签名,没有system权限
2)platform_app 有android平台签名,没有system权限
3)system_app 有android平台签名和system权限
从上面划分,权限等级,理论上:untrusted_app < platform_app < system_app
user=system seinfo=platform,domain才是system_app
user=_app,可以是untrusted_app或platform_app,如果seinfo=platform,则是platform_app。
app对应的te文件