2文件安全上下文
SEAndroid是一种基于安全策略的MAC安全机制。这种安全策略实施在主体和客体的安全上下文之上。
这意味着安全策略在实施之前,SEAndroid安全机制中的主休和客体是已经有安全上下文的。
在SEAndroid安全机制中,主体一般就是进程,而客体一般就是文件。文件的安全上下文的关联有不同的方式。
本文主要分析文件安全上下文的设置过程。
虽然android系统中有各种不同的文件,但再次仅论述应用进程的数据文件, 无论是系统应用程序,还是第三方应用程序,
它们的数据文件都是位于data分区的data子目录中的,因此需要有一种机制给在/data/data目录中创建的数据文件
设置不同的安全上下文。应用程序在安装的时候,PackageManagerService会通过守护进程installd在/data/data
目录中创建相应的数据目录,以后应用程序在运行的过程中默认创建的数据文件就位于对应的数据目录中,
因此只要给这些数据目录设置不同的安全上下文,就可以让不同类型的应用程序在运行的过程中创建不同安全上下文的数据文件。
例如.data/data 目录下面的文件上下文如下,这些是都apk的文件目录,
ls -Z
2.1 读取mac_permissions.xml文件
PackageManagerService负责安装Android应用程序,在该服务启动(构造方法中)的时候会调用SELinuxMMAC的
readInstallPolicy方法读取mac_permissions.xml文件,
mFoundPolicyFile = SELinuxMMAC.readInstallPolicy();
readInstallPolicy方法如下,
public static boolean readInstallPolicy() {
// Temp structure to hold the rules while we parse the xml file
List<Policy> policies = new ArrayList<>();
FileReader policyFile = null;
XmlPullParser parser = Xml.newPullParser();
try {
policyFile = new FileReader(MAC_PERMISSIONS);
Slog.d(TAG, "Using policy file " + MAC_PERMISSIONS);
parser.setInput(policyFile);
parser.nextTag();
parser.require(XmlPullParser.START_TAG, null, "policy");
••••
这个方法一看就知道是将xml文件解析出来,然后放到集合中保存,保存在sPolicies中。
private static List<Policy> sPolicies = new ArrayList<>();
PackageManagerService通过调用SELinuxMMAC类的静态成员函数readInstallPolicy,
就初始化好了接下来安装应用程序时要用到的seinfo字符串。
PackageManagerService在安装应用程序的时候,会调用到scanPackageDirtyLI来解析应用程序的信息。
这个函数会同时也会给正在安装的应用程序分配一个字符串,如下所示: