在android6.0以后的版本,google采用了SELinux的文件访问安全策略,想比较以前,绝对提高了文件的安全,不像以前那样,
对文件访问可以是无条件的。本篇文章就分享下常用的一些安全策略。
1. linux传统 设备文件访问控制方法
传统的 Linux设备文件访问控制机制通过设置用户权限来实现.
? 超级用户(root),具有最高的系统权限,UID为0。
? 系统伪用户,Linux操作系统出于系统管理的需要,但又不愿赋予超级用户的权限,
需要将某些关键系统应用文件所有权赋予某些系统伪用户,其UID范围为1~ 499,系统的伪用户不能登录系统。
? 普通用户,只具备有限的访问权限,UID 为 500 ~ 6000,可以登录系统获得 shell
在Linux权限模型下,每个文件属于一个用户和一个组,由UID与GID标识其所有权。针对于文件的具体访问权限定义为可读(r)、可写(w)与可执行(x),并由三组读、写、执行组成的权限三元组来描述相关权限。
第一组定义文件所有者(用户)的权限,第二组定义同组用户(GID相同但UID不同的用户)的权限,第三组定义其他用户的权限(GID与UID都不同的用户)。
2.SElinux采用主体对客体的强制访问控制
1) SELinux 拥有三个基本的操作模式
? Disabled:禁用SELinux策略
? Permissive:在Permissive模式下,SELinux会被启用但不会实施安全性策略,而只会发出警告及记录行动。Permissive模式在排除SELinux的问题时很有用.
? Enforcing:这个缺省模式会在系统上启用并实施SELinux的安全性策略,拒绝访问及记录行动.
setenforce 0 命令进入permissive模式
setenforce 1 命令进入Enforcing模式
2) 类型强制(TE)访问控制
在SELinux中,所有访问都必须明确授权,SELinux默认不允许任何访问,不管Linux用户/组ID是什么。这就意味着在SELinux中,没有默认的超级用户了,与标准Linux 中的root不一样,通过指定主体类型(即域)和客体类型使用allow规则授予访问权限,allow规则由四部分组成:
? 源类型(Source type(s) ) 通常是尝试访问的进程的域类型
? 目标类型(Target type(s) ) 被进程访问的客体的类型
? 客体类别(Object class(es)) 指定允许访问的客体的类型
? 许可(Permission(s)) 象征目标类型允许源类型访问客体类型的访问种类
举例如下:
这个规则解释如下:
拥有域类型user_t的进程可以读/执行或获取具有bin_t类型的文件客体的属性.
3) 如何排除SELinux安全策略引起的问题
a. 首先排除DAC权限的问题,使用“ls –l”检查相关文件的属主和权限。如果DAC的权限许可,则就是SELinux的策略显式地拒绝了当前操作的执行。
b. 通过“setenforce 0”命令进入permissive模式(getenforce命令查看模式)。此操作可暂时关闭selinux强制访问控制,可直接进行调试,若此时操作还是不允许,则与selinux无关。
c. 通过“dmesg | grep avc”查看 AVC log,在android6.0 版本中,这个用的最多。从分析失败操作相应的AVC Denied Msg入手区分问题的根源,以下为一条拒绝信息:
可在/device/qcom/sepolicy/common/untrusted_app.te文件中增加如下语句解决此问题:
allow untrusted_app sysfs_irdev : file { write };
d) 如何自定义域类型.
客体类别为file的可以在/device/qcom/sepolicy/common/file.te文件中增加如:
客体类别为device的可以在/device/qcom/sepolicy/common/device.te文件中增加如:
然后在安全上下定义文件file_contexts 中增加需要的安全上下文定义,如下:
注意:
上面的路径/sys/devices/virtual/sec(/.*)?中不能有链接类型的文件或目录,否
则安全上下文定义将无效.
e) 如何验证自定义域类型和安全上下文(安全策略)已生效.
1) 使用命令 make kernel 编译重新生成boot.img
2) 下载 boot.img 到手机上,并重启手机.
3) 查看手机根目录下file_contexts文件
root@msm8916_32:/ # cat file_contexts
/sys/devices/virtual/sec(/.*)? u:object_r:sysfs_irdev:s0
/sys/class/sec(/.*)? u:object_r:sysfs_irdev:s0
/sys/devices/virtual/input/input2/offset u:object_r:sysfs_proxdev:s0
4) 查看手机文件系统相应目录 如下:
root@msm8916_32:/sys/devices/virtual/sec/sec_ir # ls -Z
-rwxrwxrwx root root u:object_r:sysfs_irdev:s0 ir_info
-rwxrwxrwx root root u:object_r:sysfs_irdev:s0 ir_learn
-rwxrwxrwx root root u:object_r:sysfs_irdev:s0 ir_send
这些文件都属于sysfs_irdev域。
5) 假如untrusted_app.te文件有如下定义:
allow untrusted_app sysfs_irdev:file { open read write ioctl };
则所有属于untrusted_app域的app都可以读写/sys/devices/virtual/sec/下的文件
6)查看那些进程属于untrusted_app域
root@msm8916_32:/ # ps -Z
u:r:untrusted_app:s0 u0_a127 30854 294 com.cubic.autohome
u:r:untrusted_app:s0 u0_a68 31531 294 com.general.remote
........
这两个app可以读写/sys/devices/virtual/sec/目录下的文件.
阅读(8977) | 评论(0) | 转发(0) |