解释SEAndroid并详细破解它的规则(sepolicy)

之前做Xposed的时候遇到了一个问题。xposed的卸载本来是需要root权限的,但是Xposed的原理是黑掉了合子的进程(Xposed的原理后面会写),而合子本身是有root权限的,所以Xposed应该可以利用合子的root权限自行卸载。但实际操作中发现不了。经过一番研究发现,这是因为SeaAndroid的缘故,zygote的一些操作会受到SeaAndroid的限制,其root权限并不是任意的。先详细说说SEAndroid,再来说说如何改变这个规则。

这篇文章有三个目的:

1.了解SEAndorid的工作原理

2.能够理解SEAndroid的规则。

3.能够添加或删除自己的规则(这个规则可能大多数人都不使用,所以前两个是主要目的)

SEAndroid是SELinux对Android的移植。SELinux是Linux上的一种系统保护机制,全称是安全增强Linux,是MAC(强制访问控制系统)的一种实现。其目的是明确指出哪些资源(文件、网络端口等。)一个进程可以访问。基于Linux实现了Android系统。对于传统的Linux系统,NSA开发了一套安全机制SELinux来增强安全性。但是,由于Android系统具有独特的用户空间运行时,SELinux并不完全适用于Android系统。为此,NSA和Google为Android系统开发了基于SELinux的SEAndroid。

Android 4.4首次引入了这一机制。SeaAndroid和SELinux最大的区别就是SeaAndroid在Android系统中适配Binder。进入adb shell后,可以使用getenforce命令来查看它是否被应用。在root之后,可以通过setenforce 0关闭SEAndroid。但是目前好像关闭了这个功能。

要理解SEAndorid的概念,就不得不提到DAC和MAC。

DAC是Linux传统的访问控制模式,可以控制文件、文件夹和* * *共享资源的访问。在DAC模型中,文件对象的所有者(或管理员)负责管理访问控制。DAC使用ACL(访问控制列表)为非管理员用户提供不同的权限,而root用户有完全的自由控制文件系统。

通俗地说,如果小明创建了一个文件,他就对该文件拥有绝对的控制权,他可以自主控制其他人对该文件的权限。文件有三种权限:读(r)、写(w)和执行(x)。我们可以通过命令ls -l l看到每个文件的权限,然后可以通过命令chmod指定这个其他人对这个文件的权限。(chmod 777?1.txt这个命令大家应该都懂,就不细说了。)

但这种机制的缺点是root用户可以控制任何文件的权限,为所欲为。控制粒度较粗。如果我只想让另一个人看我的文件,而这个人和我不在同一个用户群,那我只能通过chmod XX4 XX来达到这个目的,但这样其他任何人都可以看我的文件。因此,它具有相对较粗的颗粒尺寸。

于是Linux引入了MAC机制,即强制访问控制。MAC的核心思想是,任何进程想要在SELinux系统中做任何事情,都必须先在安全策略配置文件中被赋予权限。如果安全策略配置文件中没有权限,则该进程没有此权限。这个机制相当于一个白名单,上面配置了所有进程的权限。一个进程只能做白名单上权限内的事情,一旦想做不属于自己权限的操作,就会被拒绝。

与DAC不同,MAC不再简单地将进程划分为根进程,而是为每个进程(主体)和文件(对象)配置一个类型。当一个进程操纵(读和写,等等。)一个文件,系统会检查流程类型是否有该文件类型的操作权限。

通过命令ps -Z,可以看到进程的安全标签,ls -Z可以看到文件的标签(安全上下文)。

例如,在进程安全上下文中,init进程的类型为init,下面的进程的类型为kernel。(其实一个进程的类型也叫域。)

文件安全上下文中123.txt的类型是tootfs。

(进程和文件安全上下文标签的格式为用户:角色:类型:安全_级别,不考虑其他列。这涉及到SELinux中的其他几个访问控制模型。在SEAndroid中,我们只需要关心他的类型,比如init进程。U:r: init: s0,我们只需要知道他的类型是init。)

知道了进程和文件的安全上下文,如何通过它们的安全上下文来控制权限?

手机上有一个文件叫sepolicy,是SEAndroid的安全策略配置文件,里面包含了所有进程的权限配置,进程只能在其权限内运行。即使此文件有根权限,也不能删除它。转储这个文件的内容,你会发现里面有很多规则(我通过了魅族的4000规则,三星的20000规则)。看两个例子。

?允许不受信任的应用系统应用数据文件:文件{读取}

?允许合子SD card _ type:file { read write creat rename }

其具体格式为:allow domain type:class { permission }?(域是指流程的类型)

通过这种格式解释上述三个规则,

1.允许不可信应用类型的进程读取系统应用数据文件类型的文件。

2.允许合子类型的进程读写creat重命名sdcard_type的文件。

所以MAC的控制方式是这样的:当一个进程操作一个文件时,系统会检查进程和文件的上下文,看进程的类型是否有权限操作文件的类型。比如zygote要读取sdcard上的一个文件,文件的类型是sdcard,zygote的类型(域)是zygote,系统会检查找到这个规则:allow Zygote SD card _ type:file { read write creat rename }。则该操作将被允许执行。如果zygote想删除一个sdcard上的文件,系统发现对应的规则里没有删除,就会被拒绝。(以上两条规则和这个例子都是我自己编的,只是为了说明情况。真实情况下,zygote有权删除sdcard上的文件。)

DAC和MAC同时工作,一个操作在执行前会根据DAC和MAC进行检测。如果任一机制的条件都不满足,就会被拒绝。

上面一节解释了SeaAndroid的工作原理,所以我们知道了为什么zygote的root权限不能为所欲为,而是如何改变SeaAndroid的规则,扩大zygote的权限。直接更改sepolicy是不可能的,因为sepolicy在boot.img中,每次开机都会重写和读取文件sepolicy,更改不可能成功。

所以直接解压boot.img,替换里面的sepolicy,重新打包。Linux上有一套解压打包工具,windows解压工具是Android-image-tools-windows . zip?先找到手机厂商的官方ROM刷包,找到boot.img解压。里面有一个叫sepolicy的文件。修改sepolicy然后更换,重新打包刷到手机里。(嗯,其实挺复杂的,不过我觉得大部分人可能不需要。先这么写吧,有必要再详细写。本来打算上传自己的工具,但是不知道怎么上传文件。。。我找不到我的工具的链接,您可以在此处查找))

/xmikos/setools-android

?1.sepolicy-inject:插入规则

2 .搜索:反编译策略

3.seinfo:检查sepolicy的版本。

修改策略的命令:推送到手机上,直接输入。/(对应文件)查看其用法(这里是我插入的命令之一)。

。/se policy-inject-s zygote-t labeled fs-c file system-P remount,getattr,relabelto,transition,quotamod,unmount-P/se policy-o/SD card/se policy 1

/showthread.php?t=2073775

博客是学习的起点,不是终点。。。本文只是对SEAndroid的介绍,目的性很强,只说主要部分,很多内容没有涉及。如果对SEAndroid有深入了解,可以看看老罗的文章。

* *最后来个赞!!!添加一个关注点,可以吗* *

参考链接:

SEAndroid安全机制简介和学习计划强烈推荐老罗。

SEAndroid策略分析建议

Android的安全机制

深刻理解SELinux