Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
cve-2025-21479_iqooneo8 — Local root exploit for CVE-2025-21479 (Adreno KGSL) on iQOO Neo8 (SM8475) - physical memory r/w, disables SELinux, spawns root shell | Kitploit
أدوات/GitHubGitHub/qingizi7/cve-2025-21479_iqooneo8
Android SecurityPrivilege EscalationExploit FrameworksExploitationReverse EngineeringMobile SecurityHardware & IoT SecurityPayload DevelopmentBinary Exploitation

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
GitHubqingizi7/cve-2025-21479_iqooneo8

cve-2025-21479_iqooneo8

Local root exploit for CVE-2025-21479 (Adreno KGSL) on iQOO Neo8 (SM8475) - physical memory r/w, disables SELinux, spawns root shell

عرض المستودع
4218منذ 8 أياملم تتم المراجعة بعد
المحتوى غير متوفر باللغة المطلوبة. عرض النسخة الإنجليزية.

CVE-2025-21479 — Qualcomm Adreno GPU 提权漏洞利用(SM8475 / iQOO Neo8)

针对 CVE-2025-21479 的本地提权实验代码,目标是 vivo V2301A(iQOO Neo8 / PD2301,Snapdragon 8+ Gen 1 / SM8475,Adreno A730,Android 14,GKI 内核 5.10)上的 Qualcomm Adreno GPU(KGSL)。

原理上,漏洞利用通过 KGSL 的 CP_SMMU_TABLE_UPDATE 命令驱动 GPU 的 SMMU, 获得任意物理内存读写能力,进而关闭 SELinux、定位内核符号并取得 root shell——全程不需要刷机,也不依赖解锁 Bootloader。

仅限对你自己拥有、或已获授权的设备进行安全研究。


它做了什么

  1. GPU 物理内存原语。 Adreno A730(eureka_panther)微码的访问检查 (and $12, 0x3)存在缺陷,会把 Self-Draw-State(SDS)包误判为 RingBuffer(RB)。因此在用户态将伪造的 CP_SMMU_TABLE_UPDATE 放入 SDS 块中提交,即可覆写 GPU 的 TTBR0,让 GPU 页表指向任意物理页——从此 GPU 可以读写任意物理内存。
  2. 稳定化读写。 通过 stabilize_rw 将映射加固为 2 MB 自映射区域, 支持大批量快速读取(fast_pread_bytes 等)。
  3. 关闭 SELinux。 在物理内存中把 selinux_state.enforcing 字段清零。 随后从固定物理基址 0xA8000000 转储内核映像(默认上限 43 MB)—— SM8475 没有物理 KASLR——并直接从原始转储中解析 kallsyms 结构 (大小端自动识别),因此虚拟 KASLR 也不影响。
  4. root 载荷。 用一段 AArch64 shellcode(prepare_kernel_cred(0) → commit_creds(),并关闭 seccomp)补丁 __do_sys_capset。fork 出的子进程 调用 capset() → 变为 uid 0 → 恢复被覆盖的内核代码 → 子进程以 u:r:shell:s0 域重新执行你指定的命令(默认 sh)。内核代码最终 与运行前逐字节一致。

测试设备

完整设备信息见 device_info.txt。

仓库结构

root@kitploit:~
├── source/
│   ├── cheese.c            # 漏洞利用主程序(include 了下面两个文件)
│   ├── kallsyms_lookup.c   # 针对原始内核映像的 kallsyms 解析器
│   └── adrenaline.h        # KGSL ioctl / 命令定义(作者 hawkes)
├── exploit                 # 预编译 arm64 二进制(动态链接,minSdk 21,
│                           #  NDK r30-beta2)
├── device_info.txt         # 用于调参的目标设备信息
└── README.md

注意:cheese.c 会 #include kallsyms_lookup.c 和 adrenaline.h, 编译时三个文件需要放在同一目录。

编译

任意较新的 Android NDK(r25+)均可,示例:

root@kitploit:~
# 静态链接(自包含、任意 API 等级可运行;体积较大)
aarch64-linux-android34-clang -o cheese source/cheese.c -static

# 动态链接(体积小,依赖设备自带的 libc;API 等级需匹配设备)
aarch64-linux-android34-clang -o exploit_dyn source/cheese.c
# 若要兼容 API 21+ 设备,请改用 aarch64-linux-android21-clang

使用方法

root@kitploit:~
#推送exploit
adb push exploit /data/local/tmp/

#运行exploit
adb shell
chmod +x /data/local/tmp/exploit
/data/local/tmp/exploit

详细教程点我(里面有一键工具)

成功后会得到一个 uid=0 的 shell,且本会话 SELinux 已被关闭。进程在完成 提权后会重新执行 argv[1..](缺省为 sh)。每次运行会有一段倒计时 ("pte wait 3 second")和 43 MB 内核读取进度("Read X / 43 MB")。 提权成功,uid=0

环境变量

禁用vr.ko

由于vivo机型的特殊机制,在iQOO Neo8上需要禁用它才能维持root权限稳定(具体原理不在此说明。其他vivo机型和内核版本可能不通用,需自行提取vr.ko后逆向分析)。执行以下操作时请先确保当前shell会话已获得root权限。

root@kitploit:~
#备份原始apanic

dd if="$(readlink -f /dev/block/by-name/apanic)" of=/sdcard/apanic_full.bin
#adb shell内执行
adb pull /sdcard/apanic_full.bin ./
#主机端执行

#禁用vr.ko(风险自行评估)
printf '\370\037\000\000\000\000\000\000\000\000\000\000' | dd of=$(readlink -f /dev/block/by-name/apanic) bs=1 seek=$(( $(blockdev --getsize64 /dev/block/by-name/apanic) - 65472 )) conv=notrunc && sync

之后如果冷重启手机导致root权限失效,只需重跑exploit再执行越狱

ReSukiSU越狱(root权限持久化)

root@kitploit:~
$(find /data/app -type f -name "libksud.so" | grep resukisu) late-load --kmi android12-5.10

移植到其他设备

设备相关常量位于 source/cheese.c 顶部:

  • KERNEL_PHYS_BASE — 内核物理基址(默认 0xA8000000,SM8475)
  • IDMAP_PG_DIR_OFFSET — idmap_pg_dir 偏移(默认 0x245a000)
  • selinux_state_offset — 定位 selinux_state 用的偏移(默认 0x729030,实际物理地址 = idmap_pg_dir 物理地址 + 该偏移)
  • gPhyAddrs[] — 依次尝试的候选物理基址
  • DEFAULT_KERNEL_SIZE_MB — 内核读取的兜底值 / 上限

前置条件:Adreno A730/A7xx 系列 GPU(受影响固件)且设备系统未安装高通在2025年6月发布的安全补丁、物理转储中可解析到 kallsyms 的内核,且无物理 KASLR。

常见问题

  • can't get GPU r/w — GPU 初始化失败;先等待,还是不行可尝试 CHEESE_ATTEMPT=1..n 或手动 指定 CHEESE_PHYADDR;调试单次尝试时加 CHEESE_NO_RETRY=1。
  • kallsyms 解析失败 — 先用 CHEESE_READ_FULL_KERNEL=1 读取完整映像(配合 CHEESE_KALLSYMS_MAX_MB 扩大上限),再考虑 CHEESE_FORCE_MANUAL_PATCHFINDER=1。
  • 本工具不刷写、不持久化任何内容:内核代码和页表在结束前会被恢复, 重启后设备与运行前完全一致。

致谢

  • @zhuowei — CVE-2025-21479 的研究者,也是本 工具所基于的开源 cheese 漏洞利用的作者m/
  • cheese / cheese-cake 开源谱系 — SDS/TTBR0 技术、基于内核转储的 kallsyms 解析
  • hawkes — 2020 年的 adrenaline.h KGSL 头文件,提供 ioctl 接口定义
  • 酷安@renil — 对此漏洞在iQOO Neo8上复现的研究(vk.ko逆向分析)

此仓库基于 zhuowei/cheese 改造(原仓库无许可证) 漏洞完整原理见cheese仓库及漏洞公告。

  • 酷安@TNTHe — 我的酷安号

免责声明

本仓库仅用于教育与安全研究,请仅在你自己拥有或已获授权的设备上使用。 作者不对任何滥用行为负责。使用本工具可能导致保修失效或违反相关服务条款。

تنزيل الأداة
型号vivo V2301A(iQOO Neo8,代号 PD2301,主板 taro)
SoCSM8475(骁龙 8+ Gen 1)+ Adreno 730
Android14(UP1A.231005.007,SDK 34,qssi-user)
内核5.10.198-gki-gfb2f5774872c
SELinuxEnforcing(运行时被本工具关闭)
变量作用
CHEESE_PHYADDR=<phys>强制指定内核物理基址(跳过内置的 gPhyAddrs 探测表)。
CHEESE_ATTEMPT=<n>使用 gPhyAddrs[n] 而非 gPhyAddrs[0];GPU 初始化失败后 maybe_retry 会自动递增重试。
CHEESE_SWAPPER_PG_DIR_OFF=<off>跳过 swapper_pg_dir 扫描,直接使用该绝对偏移。
CHEESE_READ_FULL_KERNEL=1读取完整内核映像(默认读取上限为 DEFAULT_KERNEL_SIZE_MB = 43 MB)。
CHEESE_KALLSYMS_MAX_MB=<MB>覆盖 kallsyms 读取上限。
CHEESE_FORCE_MANUAL_PATCHFINDER=1强制使用手工 patchfinder 兜底(init_cred、prepare_kernel_cred)。
CHEESE_SKIP_GPU=1跳过 GPU 读写阶段(仅调试用)。
CHEESE_NO_RETRY=1失败后直接退出,不做换号重试。