SELinux-Permissive-Only-version-of-Cheese-aka-CVE-2025-21479
目前这只是 Cheese 漏洞利用(又称 CVE-2025-21479)的仅 SELinux 宽容版本,该漏洞影响了包括三星骁龙设备在内的许多设备上的 adreno kgsl。
部分代码取自以下仓库,我要感谢 zhuowei 最初启动了这个概念验证,也感谢 sarabpal-dev 保持着一个维护良好且活跃的仓库
https://github.com/zhuowei/cheese
https://github.com/sarabpal-dev/cheese-cake
我决定接手这个项目,是把它当作一点挑战,而且因为我以前从未涉足过这么复杂的事情,所以即使它尚未完成,也是一次很好的学习经历。我最初想做的是看看整个利用链能否在 termux 环境中直接从完全不受信任的域完成。到目前为止,我已经在没有使用 adb 的情况下实现了 SELinux 宽容模式,将代码缩减到原来大小的约四分之一,它很稳定,通常从开始到结束不到一分钟,并且运行在我的三星 SM-S901W S22 骁龙(已锁定引导加载程序)上。我还没有深入挖掘 root 原语,也不确定不借助 adb 能否实现,但我仍会尝试。我希望这能激励人们去尝试那些通常被认为不可能做到的事情,也许有人会想出可行的办法。欢迎开启 issue,我愿意接受任何有用的贡献。
教程
这个漏洞利用非常简单,为了让它在你的设备上运行,你几乎不需要修改任何代码。你只需要:
- git clone 该仓库并 cd 进入
- 从你的确切固件中获取 boot.img
- 使用 unpack_bootimg(termux 中已有)从中提取内核
- 编译 extract-kallsyms.c 二进制文件并在你的内核上运行它
- 将你的 kallsyms.txt 直接放在你将要执行漏洞利用的路径中
- 使用
cc -o gpu_sam gpu_sam.c -ldl 编译
- 运行时会动态遍历你的 kallsyms.txt 以找到所有必要的偏移量
- 根据你的设备,唯一需要更改的是内核基址扫描的以下值:
const uint64_t candidates[] = { 0xC0000000, 0xE0000000 }; 和 for (uint64_t addr = 0xa8000000; addr < 0xa8500000; addr += 0x8000) {
- 如果一切顺利,你应该可以从普通的 termux shell 中获得稳定的 SELinux 宽容模式
备注
始终存在 smmu 错误或内核恐慌的风险,但在我的内核为 5.10.168 的手机上它运行得非常好,我很少遇到崩溃。你可能需要运行几次,甚至重启以重置 GPU 状态。我尽可能让它对用户友好。下面的视频只是一个快速演示,我当时已经是宽容模式了。尽情享用
https://github.com/user-attachments/assets/63d0dfa7-1390-41ce-96da-9c34d8a220ec