本文为看雪论坛优秀文章
看雪论坛作者ID:Thehepta
上一篇发了如何写一个hook框架,但是还是依赖于root权限,而在android平台,magisk就是root的代名词,所以有了这篇文章。
由于有些东西还并未全部弄懂,所以不敢乱写。
+ 3、固件验证(avb)、回滚保护、system as root、 ab分区(更新较快,没跟上)
固件验证,Android Verified Boot(这个没仔细查,研究的时候已经是2.0了),多了一个vbmeta.img分区,用于校验 boot.img system.img vendor.img 这些分区,确保不被篡改(可以解锁,关闭)。
system as root,原来的就是将system.img变成根文件系统,原来都是boot.img里面的ramdisk 是根文件系统的
回滚保护,直接修改system.img镜像,无效,数据在启动的时候如果有vbmeta验证,会将数据修正。
ab分区,分区修改,反正就是将recovery 分区删掉了,要想使用twrp,没法刷写进recovery了,需要用fastboot 直接应道twrp镜像
+ selinux
linux下有两种权限管控,传统的DAC(直接访问控制),和MAC(强制访问控制)安全机制(selinx)。
关于selinux,我看了很多资料,很长时间没弄明白,所以在这里就我自己的理解详细写一下。
+ MAC和DAC
+ DAC
是以用户为主体,比如,就像现实世界中的人,你运动,你学习,你考大学,你装修,把自己的房子烧了,没人管你的,你的这些行为,就是进程,而你烧房子,花钱,等等,就是操作文件,房子就是文件,钱,就是文件,你怎么操作,没人管你,因为他们是属于你的,你是主体。
+ MAC
mac以进程为主体,文件,属性为客体,就像现实世界中,以事件为主体,物质为客体,这种情况下,假如你要烧你的房子,假如假如你要花你的钱,在DAC中是允许的,但是在mac中,会首先判断你的行为事件,比如你的行为事件是装修,是需要对房子进行操作的,但是你的操作确是烧房子,拆房子,就会被禁止,比如你要吃饭,是要花钱的,但是你的操作是花钱买法拉利了,这也是没有权限的。粒度为进程(有安全上下文标签),管控行为,为读写,执行,等等,被执行者(文件)贴上标签,进程操作被文件的时候,通过进程和文件的标签判断,是否可以操作。
selinux,是在mac基础上进行的加强和扩展
+ selinux 工作原理
+ 在编译的时候,确定了大致的安全策略,尤其一些比较重要,权限高的文件。这些安全策略会将这些文件管理的死死的,不会给予他们任何多余的权限
+ 全文件加标签,会将每一个文件都加上安全上下文的标签,彻彻底底的管控
+ 主要工作点是内核模块,在内核各个操作点,添加钩子,当操作发生的时候,会首先通过安全策略进行判断。(只要钩子写的全,就不可能绕过去)
+ selinux 对于漏洞的防御
selinux能防御应用层的root权限漏洞,对于内核层的root权限漏洞,存在直接从内核关闭selinux的可能。但是如果无法关闭selinux,root权限将无法外泄,因为selinux权限的策略对于root用户、权限的非root用户访问默认是禁止的。
对于selinux 而言,是不是root,没有任何区别,root这个概念是DAC所提供的的用户概念,而selinux是策略控制的,不会因为,你是root用户,就不对你进行策略管控
root用户在DAC权限来说是有关闭selinux的权限的(android上,别的linux没搞过,不清楚),但是如果selinux打开了,你就要拥有关闭selinux权限的MAC策略权限。
内核漏洞如果无法直接从内核层面关闭selinux,那么即使获取了root,也是无法绕过selinux策略的,跟用户层的root提权漏洞会面临一样的结果。
avc: denied { execute } for name="12456" dev="tmpfs" ino=472904 scontext=u:r:untrusted_app:s0:c153,c256,c512,c768 tcontext=u:object_r:unlabeled:s0 tclass=file permissive=0
./magiskpolicy --live "allow untrusted_app shell_data_file file { execute execute_no_trans }"
supolicy --apply root.te --live
+ 修改selinux策略
修改了很多次策略,自己都麻了,但是总结起来,就三个阶段
+ 1、adb 获取root权限
我们虽然在adb中运行漏洞获得了权限,但是我们想要把这个权限外泄给别的adb终端,在selinux打开的情况下,策略是关闭的,所以我一次一次的重启,一次一次的根据报错信息更新策略,最后通过了。
+ 2、应用获取root权限
前面搞完了我以为可以过年了,回头应用用的时候才发现,不能使用,因为,selinux限制非系统应用获取root权限。对于这个策略,目前有两种方案绕过,第一种,就是接着改策略,第二种是magisk使用的,就是在root权限和获取的应用之间在套一层shell,先用shell获取root权限,然后在用应用和shell通讯,由这个持有root的shell,执行操作。这也是magisk su 和 supersu 他们两个程序在源代码上的差别。
+ 3、梭哈
我照着supersu 和magisk 写了一个简洁的好读的su程序使用,但是我没用实现magisk间接调用的那一部分,所以在改第二个应用获取root权限的时候,改了一天,一直改策略,改到了怀疑人生,然后一条规则在我脑海中形成了
```
allow kernel * * *
```
成品策略文件root.te
```
allow shell kernel unix_stream_socket *
allow shell devpts chr_file *
allow untrusted_app shell_data_file file *
allow untrusted_app kernel unix_stream_socket *
```
上面这个,直接把selinux 很多策略直接通过了,使用需谨慎。
1|walleye:/data/local/tmp/tmp2 # ls
supersu
walleye:/data/local/tmp/tmp2 #
walleye:/data/local/tmp/tmp2 # cp supersu /sbin/
cp: /sbin//supersu: Read-only file system
1|walleye:/data/local/tmp/tmp2 #
1|walleye:/data/local/tmp # mount --bind tmp2 / sbin
walleye:/data/local/tmp # cd /sbin/
walleye:/sbin # ls
supersu
walleye:/sbin #
看雪ID:Thehepta
https://bbs.kanxue.com/user-home-767217.htm
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!