
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 बंद करता है, कर्नेल प्रतीकों का पता लगाता है और रूट
शेल प्राप्त करता है—पूरी प्रक्रिया में फ्लैशिंग की आवश्यकता नहीं होती और न ही अनलॉक किए गए 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)। कर्नेल कोड अंततः
चलाने से पहले के समान बाइट-दर-बाइट समान होता है।पूर्ण डिवाइस जानकारी 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
adb push exploit /data/local/tmp/
adb shell
chmod +x /data/local/tmp/exploit
/data/local/tmp/exploit
विस्तृत ट्यूटोरियल के लिए यहाँ क्लिक करें (इसमें एक-क्लिक टूल है)
सफल होने पर आपको uid=0 वाला शेल मिलेगा, और इस सत्र में SELinux बंद कर दिया गया है। प्रक्रिया विशेषाधिकार वृद्धि पूरी करने के बाद
argv[1..] को फिर से निष्पादित करती है (डिफ़ॉल्ट sh है)। हर बार चलाने पर एक काउंटडाउन
("pte wait 3 second") और 43 MB कर्नेल पढ़ने की प्रगति ("Read X / 43 MB") दिखाई देती है।

$(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 (प्रभावित फर्मवेयर), भौतिक डंप में पार्स करने योग्य 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 शोषण के लेखकadrenaline.h KGSL हेडर फ़ाइल, जो ioctl इंटरफ़ेस परिभाषाएँ प्रदान करती हैzhuowei/cheese के आधार पर संशोधित (मूल रिपॉजिटरी में कोई लाइसेंस नहीं है)। पूर्ण सिद्धांत के लिए भेद्यता बुलेटिन देखें।
यह रिपॉजिटरी केवल शैक्षिक और सुरक्षा अनुसंधान के लिए है। कृपया इसका उपयोग केवल उन डिवाइसों पर करें जो आपके स्वामित्व में हैं या जिनके लिए आप अधिकृत हैं। लेखक किसी भी दुरुपयोग के लिए उत्तरदायी नहीं है। इस टूल के उपयोग से वारंटी समाप्त हो सकती है या संबंधित सेवा की शर्तों का उल्लंघन हो सकता है।
| मॉडल | vivo V2301A (iQOO Neo8, कोडनेम PD2301, मदरबोर्ड taro) |
| SoC | SM8475 (Snapdragon 8+ Gen 1) + Adreno 730 |
| Android | 14 (UP1A.231005.007, SDK 34, qssi-user) |
| कर्नेल | 5.10.198-gki-gfb2f5774872c |
| SELinux | Enforcing (रनटाइम पर इस टूल द्वारा बंद किया गया) |
| चर | कार्य |
|---|
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 | विफलता के बाद सीधे बाहर निकलें, कोई पुनः प्रयास नहीं। |