
CVE-2025-21479 (Adreno KGSL) के लिए iQOO Neo8 (SM8475) पर स्थानीय रूट एक्सप्लॉइट - भौतिक मेमोरी रीड/राइट, SELinux अक्षम करता है, रूट शेल लॉन्च करता है
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 अनलॉक करने पर भी निर्भर नहीं करता।
仅限对你自己拥有、或已获授权的设备进行安全研究。
and $12, 0x3)存在缺陷,会把 Self-Draw-State(SDS)包误判为
RingBuffer(RB)。因此在用户态将伪造的 CP_SMMU_TABLE_UPDATE 放入 SDS
块中提交,即可覆写 GPU 的 TTBR0,让 GPU 页表指向任意物理页——从此 GPU
可以读写任意物理内存。stabilize_rw 将映射加固为 2 MB 自映射区域,
支持大批量快速读取(fast_pread_bytes 等)。selinux_state.enforcing 字段清零。
随后从固定物理基址 0xA8000000 转储内核映像(默认上限 43 MB)——
SM8475 没有物理 KASLR——并直接从原始转储中解析 kallsyms 结构
(大小端自动识别),因此虚拟 KASLR 也不影响。prepare_kernel_cred(0) →
commit_creds(),并关闭 seccomp)补丁 __do_sys_capset。fork 出的子进程
调用 capset() → 变为 uid 0 → 恢复被覆盖的内核代码 → 子进程以
u:r:shell:s0 域重新执行你指定的命令(默认 sh)。内核代码最终
与运行前逐字节一致。| 型号 | vivo V2301A(iQOO Neo8,代号 PD2301,主板 taro) |
| SoC | SM8475(骁龙 8+ Gen 1)+ Adreno 730 |
| Android | 14(UP1A.231005.007,SDK 34,qssi-user) |
| 内核 | 5.10.198-gki-gfb2f5774872c |
| SELinux | Enforcing(运行时被本工具关闭) |
完整设备信息见 device_info.txt。
├── 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+)均可,示例:
# 静态链接(自包含、任意 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
#推送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") होगी।

| चर | कार्य |
|---|---|
CHEESE_PHYADDR=<phys> | कर्नेल भौतिक आधार पता को बाध्यकारी रूप से निर्दिष्ट करें (अंतर्निहित gPhyAddrs प्रोबिंग तालिका को छोड़ें)। |
CHEESE_ATTEMPT=<n> | gPhyAddrs[0] के बजाय gPhyAddrs[n] का उपयोग करें; 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 | विफलता के बाद सीधे बाहर निकलें, संख्या बदलकर पुनः प्रयास न करें। |
vivo मॉडलों की विशेष तंत्र के कारण, iQOO Neo8 पर root विशेषाधिकार को स्थिर बनाए रखने के लिए इसे अक्षम करना आवश्यक है (विस्तृत सिद्धांत यहाँ नहीं बताया गया है। अन्य vivo मॉडलों और कर्नेल संस्करणों पर यह सामान्य रूप से लागू नहीं हो सकता है, vr.ko को स्वयं निकालकर रिवर्स इंजीनियरिंग विश्लेषण करना आवश्यक है)। निम्नलिखित कार्यों को निष्पादित करने से पहले सुनिश्चित करें कि वर्तमान shell सत्र को root विशेषाधिकार प्राप्त हैं।
#备份原始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 को फिर से चलाएँ और फिर jailbreak निष्पादित करें
$(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 (प्रभावित फ़र्मवेयर) और डिवाइस सिस्टम पर Qualcomm द्वारा जून 2025 में जारी सुरक्षा पैच स्थापित न हो, भौतिक डंप में kallsyms को पार्स किया जा सकने वाला कर्नेल हो, और भौतिक KASLR न हो।
can't get GPU r/w — GPU प्रारंभ विफल; पहले प्रतीक्षा करें, फिर भी न हो तो CHEESE_ATTEMPT=1..n आज़माएँ या मैन्युअल रूप से
CHEESE_PHYADDR निर्दिष्ट करें; एकल प्रयास को डीबग करते समय CHEESE_NO_RETRY=1 जोड़ें।CHEESE_READ_FULL_KERNEL=1 के साथ पूर्ण इमेज पढ़ें (साथ में
CHEESE_KALLSYMS_MAX_MB से ऊपरी सीमा बढ़ाएँ), फिर CHEESE_FORCE_MANUAL_PATCHFINDER=1 पर विचार करें।cheese एक्सप्लॉइट के लेखकm/adrenaline.h KGSL हेडर फ़ाइल, जो ioctl इंटरफ़ेस परिभाषाएँ प्रदान करती हैयह रिपॉज़िटरी zhuowei/cheese पर आधारित संशोधित संस्करण है (मूल रिपॉज़िटरी में कोई लाइसेंस नहीं है) कमज़ोरी का पूर्ण सिद्धांत cheese रिपॉज़िटरी और कमज़ोरी बुलेटिन में देखें।
यह रिपॉज़िटरी केवल शिक्षा और सुरक्षा अनुसंधान के लिए है, कृपया इसका उपयोग केवल उन्हीं डिवाइसों पर करें जो आपके स्वयं के हों या जिनके लिए आपको अधिकृत किया गया हो। लेखक किसी भी दुरुपयोग के लिए उत्तरदायी नहीं है। इस टूल का उपयोग वारंटी रद्द कर सकता है या संबंधित सेवा शर्तों का उल्लंघन कर सकता है।