lin20080410的专栏

从站在巨人的肩上,向成为巨人迈进... 互相学习!

基于android6.0版本的SELinux文件访问安全策略

转自:http://blog.chinaunix.net/uid-7213935-id-5750899.html

 

在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/目录下的文件.
阅读更多
文章标签: selinux Android权限
个人分类: android开发
想对作者说点什么? 我来说一句

SELinux安全策略和探释.pdf

2016年10月18日 192KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭