查看原文
其他

KernelSU: 内核 ROOT 方案,来了!

维术 虚拟框架 2023-01-02

大约一年多以前,我在一篇讲Android 上 ROOT 的过去、现在和未来 的文章中提到:

我认为,随着 GKI 的出现,内核的碎片化会逐渐消失,我们完全可以通过修改内核的方式去获取 EL1 root。

本以为这一天很快就会到来,没想到时间过去这么久,马上都要 Android 14 了,这玩意儿还是没有出现...没办法,我就只好自己动手了!其实我之前在探索某大型 5V5 游戏的态势感知系统的时候,已经使用过内核相关技术了;正好几个月前换了新手机,其系统出厂是 Android 12,内核是基于 GKI 的;于是我尝试把这个「态势感知系统」移植到 GKI 内核上,在移植的过程中,KernelSU 的雏形初现;我索性一不做二不休,直接把它淦完了!现在我宣布:

KernelSU,一种基于内核技术的 ROOT 方案,它来了!

什么是 KernelSU?

KernelSU,顾名思义,就是基于内核的 SU。它通过自定义内核,直接在内核中赋予目标进程 root 权限。更多关于 root 的知识可以参考我之前的文章:何为 root?

其实 KernelSU 很早就有人提出了来了,大约 2018 年的时候,XDA 上的 zx2c4 就给出了一个简单的实现[1];虽然整个实现非常简单,但它的确给我们展示了另外一种可能。后来,LSPosed 团队在实现 WSA 的 Magisk 方案的时候,也曾通过 KernelSU 来 root WSA[2]

由于 KernelSU 的实现需要自定义内核,而 Android 系统的碎片化极其严重,又由于 Linux 内核不同版本之间没有兼容性可言;因此之前的 KernelSU 方案很难拥有通用性:你必须给每个型号的设备编译一个自定义内核,这几乎是不可能实现的。另外,之前的 KernelSU 实现没有鉴权系统,系统中的任何进程,无需任何授权,都可以直接通过 su 访问到 root 权限;这对普通用户来说是难以接受的:随便一个 App 一上来就有可能控制你的整个手机。

不过,我今天实现的 KernelSU 已经很好地解决了以上两个问题。

我干了什么?

为了解决之前内核 root 方案的问题,我干了三件事:

第一件事,就是等。我等到了 GKI 的出现,Google 通过 GKI 统一了 Android 系统的内核,在 GKI 2.0 以后,不同的 Android 设备之间在 KMI 兼容的情况下,是可以使用通用内核的;虽然理想与现实之间还是有一些差距,但现在 GKI 内核的通用性,已经与曾经那个碎片化时代不可同日而语了。

第二件事,我找到了一种 KernelSU 的鉴权方案;通过在内核中扫描当前进程的 apk,然后验证其签名来实现 root 管理器;root 管理器与内核之间通过特制的系统调用来授权,保证未授权进程无法使用 root 功能。

第三件事,我采用了一种稳定的系统调用拦截技术;通过 kprobe 来拦截系统调用,进而实现 root 管理器和内核之前的通信,不在文件系统中留痕,能完美地隐藏自己。

FAQ

KernelSU 支持哪些设备?

内核版本 5.10 以上的设备支持,其他均不支持;未来也许可以通过 static binary instrumentation 的方式 backport 到旧内核,就看有没有有缘人来实现了。

KernelSU 与传统的 ROOT 有什么区别?

KernelSU 主要工作在内核空间,而传统的 ROOT 如 Magisk 实际工作在用户空间。

KernelSU 能有类似 Magisk 的模块功能吗?

KernelSU 会有模块功能,不过可能与 Magisk 的模块不同;KernelSU 将提供内核模块接口,其规划的模块功能,主要用来将代码或者脚本文件加载进内核空间执行;而非类似 Magisk 那样提供文件系统 overlay。不过理论上讲,KernelSU 也可以实现文件系统 overlay。

KernelSU 的模块能提供 Xposed 功能吗?

KernelSU 的模块将来主要工作在内核空间,而 Xposed 为用户空间的功能;因此 KernelSU 无法之间实现 Xposed;目前来看,基于 ptrace 的注入技术可以部分实现 Xposed 的功能(比如少阴App),但我认为将来可能有更好的方案出现。

KernelSU 能完美隐藏 root 吗?

我不确定。但理论上讲,内核相比应用程序处于特权级别,它有能力对应用程序屏蔽任何信息;比如在内核中可以完美地拦截所有系统调用,这是隐藏 root 的核武器。

KernelSU 最大的优势是什么?

KernelSU 可以提供针对内核的 HOOK 接口,你可以对内核中的几乎任意函数进行拦截;比如拦截系统调用,过滤 openat、inofity 等。内核级别的 HOOK,意味着对所有所有进程完美的控制,除非你的对手也是 root 进程。

KernelSU 是开源的吗?

Yes, 开源地址:https://github.com/tiann/KernelSU

普通用户如何使用?

先自行摸索,或者等教程。

结语

KernelSU 还有很多功能有待完善,如果有问题请大家多多包容,有能力欢迎加入开发 :)

最后祝大家玩得开心!

晚安!

引用链接

[1] 简单的实现: https://git.zx2c4.com/kernel-assisted-superuser/
[2] 通过 KernelSU 来 root WSA: https://github.com/LSPosed/WSA-Kernel-SU


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存