• Android 6.0中SELinux的TE简介


    在开发中,偶尔会碰到一些TE后缀的文件的修改和查看。google借鉴了SELinux安全机制,在Android内包含了该机制,而TE是SELinux中描述程序访问资源的语言。本文的目的是让大家在Android开发中,碰到相关问题时能够看懂相关的TE文件。在下面的内容中将描述SELinux基本的TE编写规则和在Android中的应用。

    SELinux资源访问基本概念

    SELinux使用类型强制来改进强制访问控制。所有的主体(程序进程)对客体(文件/socket等资源)的访问都有一条TE规则来许可。当程序访问一个资源的时候,系统会搜索所有的TE规则集,并根据结果进行处理。这个规则集是由访问向量规则(AV, Access Vector)来描述的。

    内核向外部暴露允许访问的资源权限,由TE来描述主体拥有什么样的访问权。SELinux定义了30个不同的客体类别:

    
    security process system capability filesystem file dir fd lnk_file chr_file blk_file socket_file ...
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    每个客体类别都定义了操作许可,比如针对file有19个操作许可:

    
    ioctl read write create getattr setattr lock relablefrom relableto append unlink link rename execute swapon quotaon mounton execute_no_trans entrypoint
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    这两个内容在后面介绍常用语法的时候会涉及到。所以对于file的操作许可,我们可以看到基本上是对文件的操作方法,所以程序调用这些功能的时候,系统会检查是否有一个TE规则,授予了该程序权限来使用该功能。

    Android中的SELinux

    开启SELinux

    首先必须先开启SELinux功能,google提供了开启该选项的开关。在BoardConfig.mk里面会定义如下变量:

    
    BOARD_SEPOLICY_DIRS += build/target/board/generic/sepolicy
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    对应路径下面就会有很多TE文件来描述进程对资源的访问许可。

    常用语法

    类型和属性

    在TE中,所有的东西都被抽象成类型。进程,抽象成类型;资源,抽象成类型。属性,是类型的集合。所以,TE规则中的最小单位就是类型。

    声明类型

    
    type 类型名称
    
    type system_app;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5

    这里定义了一个system_app的类型,这个类型抽象的是某些进程所属的域。至于类型别名集和属性集这些额外的东西,请自己搜索了解。乳沟只是为了看懂TE文件,我们只保持最小了解原则。

    声明属性

    
    attribute 属性名称;
    
    attribute domain;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5

    关联类型和属性

    有两种方法可以将某个类型跟某个属性关联起来。

    一,在声明类型的时候就关联已经定义的属性。

    
    type system_app, domain;
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    这个就在定义system_app的时候就将它跟已经定义的domain属性关联起来了。

    
    typeattribute platform_app mlstrustedsubject;
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    如果已经定义了类型platform_app,可以用typeattribute将它和已经定义的mIstrustedsubject关联起来。

    注意:所有的属性和类型都共用一个命名空间,所以命名的时候不要出现同名的属性和类型哦。

    访问向量(AV)规则

    AV用来描述主体对客体的访问许可。通常有四类AV规则:

    • allow:表示允许主体对客体执行许可的操作。

    • neverallow:表示不允许主体对客体执行制定的操作。

    • auditallow: 表示允许操作并记录访问决策信息。

    • dontaudit:表示不记录违反规则的决策信息,切违反规则不影响运行。

    通用的类型规则语法位:

    
    allow platform_app debugfs:file { read ioctl };
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    表示类别为platform_app的程序进程,对debugfs类型的文件执行read和ioctl操作。

    一些特殊的配置文件:

    a. external/sepolicy/attributes -> 所有定义的attributes都在这个文件
    b. external/sepolicy/access_vectors -> 对应了每一个class可以被允许执行的命令
    c. external/sepolicy/roles -> Android中只定义了一个role,名字就是r,将r和attribute domain关联起来
    d. external/sepolicy/users -> 其实是将user与roles进行了关联,设置了user的安全级别,s0为最低级是默认的级别,mls_systemHigh是最高的级别
    e. external/sepolicy/security_classes -> 指的是上文命令中的class,个人认为这个class的内容是指在android运行过程中,程序或者系统可能用到的操作的模块
    f. external/sepolicy/te_macros -> 系统定义的宏全在te_macros文件
    g. external/sepolicy/*.te -> 一些配置的文件,包含了各种运行的规则

    selinux有两种工作模式

    “permissive”:所有操作都被允许(即没有MAC),但是如果有违反权限的话,会记录日志
    “enforcing”:所有操作都会进行权限检查

    
    permissive platform_app;
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    其他

    在te文件中经常出现如下的函数:

    
    unix_socket_connect(platform_app, agpsd, mtk_agpsd);
    
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    这个其实是一个宏。它定义在文件名为te_macros的文件里面,经过全局搜索这个宏,发现如下定义:

    
    
    unix_socket_connect($1, qmuxd, qmux)
    
    allow qmux $1_qmuxd_socket:sock_file { getattr unlink };
    
    ')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    其实也是一个allow访问向量。

    总结

    在分析时时刻牢记,TE规则描述的是主体对客体访问的许可。TE的最小单位是类型,这个概念抽象了主体和客体。每个主体对客体执行某种许可,都需要有对应的av规则描述,否则就会失败。在实际项目过程中如果碰到相关的问题,可能就需要修改te文件,编辑相关的操作许可。

    本文对平常了解比较少的SELinux的TE规则进行了简述,需要更详细了解的请仔细阅读参考文献的内容。

    参考文献:

    1. MyArrow的专栏: 看懂SELinux策略语言–类型强制(编写TE规则)

    2. Linux安全体系分析,第三章 SELinux访问控制机制

    3. 重庆鲳鱼:andorid中SELinux规则分析和语法简介

  • 相关阅读:
    Maven报错:“请使用 -source 7 或更高版本以启用 diamond 运算符”
    C++项目——基于QT的电梯仿真系统
    Ubuntu下Java环境配置
    maven
    Java、IDEA笔记
    vim及ctags的使用
    英特尔(intel)、思科(cicso)实习面试
    可变参数函数——以printf为例子
    求单链表是否有环、环长、入环点、链长
    53. Maximum Subarray
  • 原文地址:https://www.cnblogs.com/ztguang/p/12644911.html
Copyright © 2020-2023  润新知