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权限

SELinux入门简介

Android 在 SElinux下 如何获得对一个内核节点的访问权限

Android 5.x SEAndroid/SElinux内核节点的读写权限学习笔记

SELinux的主要作用简介