636 字
2 分钟
ShiroSU 内核提权部分讲解
CAUTION此文章所有内容均已弃用
SSU 内核是 SSU 的一部分,但其并非 SSU 的主要定位,其将会作为可选内容而存在
概述
SSU 内核部分是一个针对 Android 内核的提权与权能限制处理的部分:
- root 提权: 注入
su并在其被执行时在内核层面提权为root - 能力管理绕过: 注入拦截能力检查函数,绕过 Linux 能力限制
- SELinux 绕过: 注入拦截 SELinux 访问控制,允许敏感操作
技术架构与核心机制
关键注入点与探针部署
| 探针类型 | 注入函数 | 功能说明 |
|---|---|---|
| kprobe | sys_execve (按情况区分具体名称) | 监控 su 执行,触发提权 |
| kretprobe | cap_capable | 绕过 Linux 能力检查 |
| kretprobe | avc_denied | 绕过 SELinux 访问控制 |
探针注册流程
flowchart TD
A[模块加载] --> B[注册 execve kprobe]
B --> C[注册 cap_capable kretprobe]
C --> D[注册 avc_denied kretprobe]
D --> E[监控/劫持敏感操作]
核心提权逻辑
伪代码,并非实际逻辑
struct cred *cred = (struct cred *)__task_cred(current);
// 1. 提权为 rootcred->uid = cred->euid = cred->suid = cred->fsuid = GLOBAL_ROOT_UID;cred->gid = cred->egid = cred->sgid = cred->fsgid = GLOBAL_ROOT_GID;cred->securebits = 0;
// 2. 赋予所有能力memset(&cred->cap_inheritable, 0xff, sizeof(kernel_cap_t));memset(&cred->cap_permitted, 0xff, sizeof(kernel_cap_t));memset(&cred->cap_effective, 0xff, sizeof(kernel_cap_t));memset(&cred->cap_bset, 0xff, sizeof(kernel_cap_t));memset(&cred->cap_ambient, 0xff, sizeof(kernel_cap_t));
// 3. 关闭 seccomp (部分需要依情况)current_thread_info()->syscall_work &= ~SYSCALL_WORK_SECCOMP;current_thread_info()->flags &= ~(TIF_SECCOMP | _TIF_SECCOMP);current->seccomp.mode = 0;current->seccomp.filter = NULL;
// 4. 设置 root 组if (cred->group_info) { // 设置组为 root ...}概述:
- UID/GID 提权: 将当前进程的所有
用户和用户组提权为root= - 能力位全开: Linux 的
capability机制用于细粒度权限控制,全部置1后进程拥有所有内核能力 - 关闭 seccomp:
seccomp是 Linux 的系统调用过滤机制,关闭后进程可自由调用所有系统调用 - 组信息 root 化: 将进程的
group_info指向root组,避免组权限限制
SELinux 绕过机制
伪代码,并非实际逻辑
// avc_denied kretprobe handler
if (current->real_cred->uid.val == /* 白名单 UID */) { regs->regs[0] = 0; // 白名单 UID 直接设置允许} else if (!current->real_cred->uid.val) { regs->regs[0] = 0; // root 同样设置允许}概述:
- SELinux 绕过: 通过
kretprobe注入SELinux的访问控制决策函数以绕过进程访问资源限制 - UID 检查: 仅对特定
UID(如ShiroSU 管理器以及由用户设置的白名单 UID)或root生效 - 强制放行: 将返回值设为
0,表示访问被允许,从而绕过 SELinux 的安全策略
能力检查绕过
伪代码,并非实际逻辑
// cap_capable kretprobe handler
if (current->real_cred->uid.val == /* 白名单 UID */) { regs->regs[0] = 0; // 白名单 UID 直接设置允许} else if (!current->real_cred->uid.val) { regs->regs[0] = 0; // root 同样设置允许}概述:
- cap_capable 绕过: 通过
kretprobe注入 Linux 内核能力检查的核心函数以在能力检查返回时劫持其返回值 - UID 检查与放行: 对指定
UID或root直接返回允许,绕过所有capability检查
进程监控与自动提权
- 通过
kprobe注入sys_execve(具体地址名称需要依内核版本以及架构而定),监控进程执行su - 检测到执行
su时,自动调用提权函数实现提权为root
伪代码,并非实际逻辑
char buf[128] = {0};struct Param param;param = *(struct Param *)regs->regs[0];if (copy_from_user(buf, param.filename, sizeof(buf) - 1)) return 0;
if (!strcmp(buf, "/system/bin/su")) { // 提权进程为 root ...}声明
本文章所展示的代码为 ShiroSU 内核的部分伪代码,并非实际代码,与实际代码会有出入,伪代码仅供参考
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
ShiroSU 内核提权部分讲解
https://770414.xyz/posts/ssu-ko-fund/ 部分信息可能已经过时
相关文章 智能推荐
1
真正的现代 root 方案 —— ShiroSU
ShiroSU ShiroSU 将怎样带来完全不一样的 root 方式?
2
ShiroSU Beta: 不一样的 root 方式实现的背后
ShiroSU 过去的一年中,我们究竟做了什么
3
如何挽救被侵犯的存储空间?
ShiroSU 苏柚是如何解决存储空间所面临的困境的?
4
四周目(总结): SukiSU Ultra 的种种问题
GO4 SukiSU Ultra 小事很多,大事不少,如此“令人瞩目”?
5
三周目: SukiSU Ultra 是一个正经项目吗?
GO4 SukiSU Ultra 是人类开发出来的吗?(是神人开发出来的,已经脱离人类的范畴了)





