SEAndroid相关总结

有时候会遇到selinux相关的问题,今天来做一下总结:

打开和关闭selinux功能

如果出现了selinux相关的权限拒绝,则在kernel log 或者android log中都有对应的”avc: denied”,当然也可能和selinux的模式有关系,我们需要首先要确认当时SELinux 的模式, 是enforcing mode 还是 permissve mode.

如果问题容易复现,我们可以先将SELinux 模式调整到Permissive mode,然后再测试确认是否与SELinux 约束相关.
在ENG 版本中:

adb shell setenforce 0

setenforce 0 设置SELinux 成为permissive模式 临时关闭selinux
setenforce 1  临时打开selinux 

另外当出现selinux相关问题,我们可以通过下面的命令来抓取对应的log

adb shell dmesg | grep avc
adb shell "cat /proc/kmsg | grep avc" > avc_log.txt

根据log来写出需要缺少的权限

07-06 05:09:22.397 I/auditd  (  627): avc:  denied  { find } for service=ext_telephony_service_impl pid=11765 uid=10024 scontext=u:r:priv_app:s0:c512,c768 tcontext=u:object_r:ext_telephony_service_server:s0 tclass=service_manager permissive=1 

缺少什么权限:  缺少 find 权限
谁缺少权限: scontext=u:r:priv_app:s0                                    
对哪个文件缺少权限: tcontext=u:object_r:ext_telephony_service_server               
什么类型的文件:  tclass=service_manager   

allow priv_app ext_telephony_service_server:service_manager {find}

可以看到上面我们根据log,以及scontext,tcontext,tclass的值反推出当前缺少的权限以及那个类型的文件缺少什么权限,进而可以写出当前的配置。

audit(0.0:53): avc: denied { execute } for path="/data/data/com.mofing/qt-reserved-files/plugins/platforms/libgnustl_shared.so" dev="nandl" ino=115502 scontext=u:r:platform_app:s0 tcontext=u:object_r:app_data_file:s0 tclass=file permissive=0  

缺少什么权限:  缺少 execute 权限
谁缺少权限: scontext=u:r:platform_app:s0                                  
对哪个文件缺少权限: tcontext=u:object_r:app_data_file             
什么类型的文件: tclass=file   

allow platform_app app_data_file:file execute

如果是多个权限的添加可以使用下面方式:
allow mediaserver acdb_delta_file:file { create open read append getattr };

需要注意的是:
1. 有时候avc denied的log不是一次性显示所有问题,要等解决一个权限问题之后,才会提示另外一个权限问题, 比如提示确实某个目录的read权限,你加入read之后,再显示缺少write权限,要你一次次一次试,一次一次加。
这时你可以简单粗暴写个rw_dir_perms,这个权限包含了{open search write …}等等很多权限,我们可以查看external/sepolicy/global_macros来了解更多权限声明;
2. 要加入的权限很多时,可以用中括号,比如
allow engsetmacaddr vfat:dir { search write add_name create};

使修改生效

在sourcecode/external/sepolicy 目录下的对应模块的policy.mk做更改,添加或者移除我们修改的.te文件

BOARD_SEPOLICY_UNION += \
    audioserver.te \
    chargemon.te \
    config_linker.te \
    display_cc.te \
    priv_app.te \
    qns.te \
    rild.te \
    secd.te \
    system_app.te \
    system_server.te \
    thermal-engine.te \
    wvkbd.te

查看文件和进程的权限配置

查看进程的权限

ps -Z 

查看文件的权限

ls -Z

u:object_r:app_data_file:s0:c512,c768 appmetadata 
u:object_r:app_data_file:s0:c512,c768 fileinternal
u:object_r:app_data_file:s0:c512,c768 gaClientId  

SEAndroid框架

在SEAndroid中,每一个进程和文件都会关联有一个安全上下文。这个安全上下文由用户、角色、类型、安全级别四个部分组成,每一部分通过一个冒号来分隔,
分别是SELinux用户、SELinux角色、类型、安全级别,格式为“user:role:type:sensitivity”。

users定义在这里:

source/system/sepolicy/users

roles定义在这里:

source/system/sepolicy/roles

在SEAndroid中:
file_type 用来标注文件的安全上下文中的类型
domain 用来标注进程的安全上下文的类型
并且每一个用来描述文件安全上下文的类型都将file_type设置为其属性,每一个用来进程安全上下文的类型都将domain设置为其属性。

sepolicy结构

a. App进程 -> mac_permissions.xml
b. App数据文件 -> seapp_contexts
c. 系统文件 -> file_contexts
d. 系统属性 -> property_contexts
以上文件均位于external/sepolicy目录中。

te文件常见的四种命名规则

  • allow:赋予某项权限。
  • allowaudit:audit含义就是记录某项操作。默认情况下是SELinux只记录那些权限检查失败的操作。allowaudit则使得权限检查成功的操作也被记录。注意,allowaudit只是允许记录,它和赋予权限没关系。赋予权限必须且只能使
    用allow语句。
  • dontaudit:对那些权限检查失败的操作不做记录。
  • neverallow:前面讲过,用来检查安全策略文件中是否有违反该项规则的allow语句

在te文件中,我们一般遇到的语法是这样的:

rule_name source_type target_type:class perm_set
解读为: 为source_type设置一个rule_name的规则,规则是对target_type的class 进行 perm_set的操作。

下面拿些栗子给大家尝尝:

neverallow { appdomain -unconfineddomain } kmem_device:chr_file { read write };
绝对不允许app(除了有unconfineddomain属性的app)对kmem_device类型的字符设备进行读写的操作

neverallow { appdomain -unconfineddomain } self:capability2 *;
绝对不允许除了unconfineddomain以外的app对self类型的capability2进行任何的操作

type httpd_user_content_t, file_type, httpdcontent;
声明一个httpd_user_content_t的类型,具有file_type和httpdcontent的属性

type httpd_user_content_t;
声明一个httpd_user_content_t的类型
typeattribute httpd_user_content_t file_type, httpdcontent;
定义httpd_user_content_t具有file_type, httpdcontent的属性

allow user_t bin_t:file ~{ write setattr ioctl };
允许user_t对bin_t类型的file进行除了write setattr ioctl相关的操作

type_transition system wifi_data_file:sock_file system_wpa_socket;
当一个类型为system的类别去进行wifi_data_file类型的sock_file访问时,类型默认切换到system_wpa_socket

allow {user_t domain} {bin_t file_type sbin_t}:file execute ;
允许user_t和domain属性的类对bin_t, file_type, sbin_t类型的file进行可执行的操作

allow init unlabeled:filesystem mount;
允许init类型对unlabeled类型的filesystem进行mount的操作

allow init fotad:unix_stream_socket { bind create };
允许init类型对fotad类型的unix_stream_socket 进行bind和create的操作

type和class命令

一个Type所具有的权限是通过allow语句来描述的,

allow unconfineddomain domain:binder { call transfer set_context_mgr };  

表明domain为unconfineddomain的进程可以与其它进程进行binder ipc通信(call),并且能够向这些进程传递Binder对象(transfer),以及将自己设置为Binder上下文管理器(set_context_mgr)

type命令格式

type的命令如下:

type type_id [alias alias_id,] [attribute_id] 

将type_id(别名为alias)关联到attribute. 这样的话,方便用attribute来管理不同的type中包含相同的属性的部分。


type init, domain;
将init关联到domain,即将domain设置为init类型的属性

class命令的格式

class class_name [ inherits common_name ] { permission_name ... }

inherits表示继承了common定义的权限,然后自己额外实现了permission_name的权限

以上就是最近关于SEAndroid的记录,以后会不断更新该篇,或者等到自己相对理清了SEAndroid,会分开来记录学习。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值