解释SEAndroid并详细破解它的规则(sepolicy)
这篇文章有三个目的:
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