Android——SELinux 权限简介
Posted Yawn,
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android——SELinux 权限简介相关的知识,希望对你有一定的参考价值。
权限不够导致问题,android ADB关闭Selinux 后尝试
adb shell setenforce 0
1. 问题
1.问题log
E SELinux : avc: denied { find } for service=display pid=3015 uid=1046 scontext=u:r:mediacodec:s0tcontext=u:object_r:display_service:s0 tclass=service_manager permissive=0
I auditd : avc: denied { find } for service=display pid=3015 uid=1046 scontext=u:r:mediacodec:s0 tcontext=u:object_r:display_service:s0 tclass=service_manager permissive=0
注意denied后面{}中的内容, 说明了缺失的权限
2.添加权限的格式
allow SourceContext TargetContext:TargetClass Permission;
3.例子
按照格式对照1中的log,可以读出信息:
scontext 对应SourceContext, 是mediacodec
tcontext 对应 TargetContext, 是display_service
tclass对应TargetClass, 是service_manager
最后应该添加的权限是
allow mediacodec display_service:service_manager find;
2. 基本语法
rule_name source_type target_type:class perm_set
rule_name: 规则名,分别有allow,dontaudit,neverallow等
source_type: 主要作用是用来填写一个域(domain), 一般描述一个进程
target_type: 目标类型, 即安全上下文
class: 类别,主要有File,Dir,Socket,SEAndroid还有Binder等, 在此基础上又分出设备字符类型 (chr_file), 链接文件(lnk_file)等
perm_set: 动作集
3. 详细介绍
rule_name:
- allow:允许某个进程执行某个动作
- auditallow:记录某项操作。默认SELinux只记录那些权限检查失败的操作。 auditallow则使得权限检查成功的操作也被记录。它和赋予权限无关,只是记录, 权限赋予只能用allow
- dontaudit:对那些权限检查失败的操作不做记录。
- neverallow:没有被allow到的动作默认就不允许执行的。neverallow只是显式地写出某个动作不被允许,如果添加了该动作的allow,则会编译错误
source_type:
- 指定一个"domain" 一般描述某个进程, 该域内的的进程,受该条TE语句的限制。用type关键字,把一个自定义的域与原有的域相关联, 用type定义一个新域:type shell, domain
- 表示把shell加入domain域, shell与domain在同一个集合里, 如果有一个allow domain xxxxx 的语句,同样地也给了shell xxxxx的属性.
target_type:
- 指定进程需要操作的客体(文件,文件夹等)类型(安全上下文), 同样是用type与一些已有的类型,属性相关联
//属性dev_type在某些attributes文件中定义
attribute dev_type;
attribute mlstrustedobject;
// 使用type定义一个新的属性和现有属性关联
type usb_device, dev_type, mlstrustedobject; - 也可以先用type关键字定义属性,在用typeattribute关键字进行属性关联
#定义httpd_user_content_t,并关联两个属性
type httpd_user_content_t, file_type, httpdcontent;
分成两条语句进行表述:
#定义httpd_user_content_t
type httpd_user_content_t;
#关联属性
typeattribute httpd_user_content_t file_type, httpdcontent;
class:
- 用class来定义一个客体类别, 类似:
#file-related classes
class filesystem
class file #代表普通文件
class dir #代表目录
class fd #代表文件描述符
class lnk_file #代表链接文件
class chr_file #代表字符设备文件
…
#network-related classes
class socket #socket
class tcp_socket
class udp_socket
…
class binder #Android平台特有的binder
class zygote #Android平台特有的zygote
perm_set:
- 定义操作类型,有两种定义的命令, 如:
用common命令定义:
格式为:common common_name { permission_name … }
common定义的perm set能被另外一种perm set命令class所继承
如:
common file {
ioctl read write create getattr setattr lock relabelfrom relabelto
append unlink link rename execute swapon quotaon mounton - 用class命令定义:
class class_name [ inherits common_name ] { permission_name … }
inherits表示继承了某个common定义的权限
注意,class命令它不能被其他class继承
继承一个common,如继承了file common
class dir
inherits file
{
add_name
remove_name
reparent
search
rmdir
open
audit_access
execmod
}
不继承任何common,如
class binder
{
impersonate
call
set_context_mgr
transfer
}
以上是关于Android——SELinux 权限简介的主要内容,如果未能解决你的问题,请参考以下文章
Android : 为系统服务添加 SELinux 权限 (Android 9.0)
Android 在 SElinux下 如何获得对一个内核节点的访问权限