Android——SELinux 权限简介

权限不够导致问题,Android ADB关闭Selinux 后尝试

查询当前权限状态:adb shell getenforce
临时关闭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:		动作集

通俗介绍:

avc: denied { ioctl } for pid=3295 comm=“celerateService” path="/dev/cmapool" dev=“tmpfs” ino=8392 ioctlcmd=0x5000 scontext=u:r:system_app:s0 tcontext=u:object_r:mstar_cma_device:s0 tclass=chr_file permissive=1

{ ioctl }:缺少什么权限
scontext=u:r:system_app:s0:谁缺少权限
tcontext=u:object_r:mstar_cma_device:s0:对哪个文件缺少权限
tclass=chr_fil:什么类型的文件

找到system_app.te 通常会在device/XXX/XXX/sepolicy或device/XXX/XXX/sepolicy下然后找到此文件打开添加

allow system_app mstar_cma_device:chr_fil ioctl 就OK了。

添加然后 make installclean,再编译打包 就OK了。

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
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ly0724ok

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值