Android中SELinux的示例分析

  介绍

这篇文章将为大家详细讲解有关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的示例分析