这篇文章将为大家详细讲解有关Android中SELinux的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
<强>一,SELinux资源访问基本概念强>
, SELinux使用类型强制来改进强制访问控制。所有的主体(程序进程)对客体(文件/套接字等资源)的访问都有一条TE规则来许可。当程序访问一个资源的时候,系统会搜索所有的TE规则集,并根据结果进行处理。这个规则集是由访问向量规则(AV,访问向量)来描述的。
内核向外部暴露允许访问的资源权限,由你来描述主体拥有什么样的访问权.SELinux定义了30个不同的客体类别:
安全处理系统功能文件系统文件dir fd lnk_file chr_file blk_file socket_file…,
引用>每个客体类别都定义了操作许可,比如针对文件有19个操作许可:
ioctl读写创建getattr setattr锁relablefrom relableto附加拆开重命名链接执行swapon quotaon mounton execute_no_trans入口点
引用>,这两个内容在后面介绍常用语法的时候会涉及到。所以对于文件的操作许可,我们可以看到基本上是对文件的操作方法,所以程序调用这些功能的时候,系统会检查是否有一个TE规则,授予了该程序权限来使用该功能。
<强>二,Android中的SELinux 强>
<强> 2.1开启SELinux 强>
首先必须先开启SELinux功能,谷歌提供了开启该选项的开关。在BoardConfig。可里面会定义如下变量:
BOARD_SEPOLICY_DIRS +=,构建/目标/板/一般/sepolicy对应路径下面就会有很多TE文件来描述进程对资源的访问许可。
<强> 2.2声明类型强>
type 类型名称, type system_app;<强> 2.3关联类型和属性强>
有两种方法可以将某个类型跟某个属性关联起来。
一,在声明类型的时候就关联已经定义的属性。
类型system_app域;
引用>这个就在定义system_app的时候就将它跟已经定义的域属性关联起来了。
typeattribute platform_app mlstrustedsubject;
引用>如果已经定义了类型platform_app,可以用typeattribute将它和已经定义的mIstrustedsubject关联起来。
注意:所有的属性和类型都共用一个命名空间,所以命名的时候不要出现同名的属性和类型哦。
<强>三、访问向量(AV)规则强>
AV用来描述主体对客体的访问许可。通常有四类AV规则:
允许:表示允许主体对客体执行许可的操作。
neverallow:表示不允许主体对客体执行制定的操作。
auditallow:表示允许操作并记录访问决策信息。
dontaudit:表示不记录违反规则的决策信息,切违反规则不影响运行
通用的类型规则语法位:
allow platform_app debugfs: file {, read ioctl };表示类别为platform_app的程序进程,对debugfs类型的文件执行读和ioctl操作。
<强>四,一些特殊的配置文件:强>
外部/sepolicy/attributes →,所有定义的属性都在这个文件, 外部/sepolicy/access_vectors →,对应了每一个类可以被允许执行的命令, 外部/sepolicy/roles →, Android中只定义了一个角色,名字就是r,将r和attribute 域关联起来, 外部/sepolicy/users →,其实是将用户与角色进行了关联,设置了用户的安全级别,s0为最低级是默认的级别,mls_systemHigh是最高的级别, 外部/sepolicy/security_classes →,指的是上文命令中类的,个人认为这个类的内容是指在android运行过程中,程序或者系统可能用到的操作的模块, 外部/sepolicy/te_macros →,系统定义的宏全在te_macros文件, 外部/sepolicy/* .te →,一些配置的文件,包含了各种运行的规则<强>五,selinux有两种工作模式强>
,“宽容”:所有操作都被允许(即没有MAC),但是如果有违反权限的话,会记录日志
“执行”:所有操作都会进行权限检查<强>六,其他强>
在te文件中经常出现如下的函数:
unix_socket_connect (platform_app, agpsd,, mtk_agpsd);这个其实是一个宏,它定义在文件名为te_macros的文件里面,经过全局搜索这个宏,发现如下定义:
, unix_socket_connect(1美元,,qmuxd,, qmux) ,allow qmux 1美元_qmuxd_socket: sock_file {, getattr unlink }; 以前,& # 39;)>其实也是一个允许访问向量。
Android中SELinux的示例分析