
vivo iQOO Neo9S Pro (MT6989)용 원클릭 루트 킷으로, MCAST 전송을 통해 CVE-2026-43499 futex PI UAF를 익스플로잇하며, 스크립트와 분석 문서를 포함합니다.
**vivo iQOO Neo9S Pro(V2339FA, MediaTek MT6989)**용 GhostLock 원클릭 root 키트. 이 저장소에는 MCAST transport 이식 패치, 원클릭 스크립트, 전체 분석 문서가 포함되어 있습니다. 완전한 실행 가능 키트(바이너리 및 KernelSU 포함)는 Releases를 참조하세요.
Device: vivo iQOO Neo9S Pro (V2339FA / PD2339, MT6989) Firmware: PD2339_A_16.2.12.1.W10.V000L1 (Android 16) Kernel: 6.1.145-android14-11-maybe-dirty Vulnerability: CVE-2026-43499 (futex PI requeue UAF) For device owners / security research only. Use on your own device.
setsockopt(SOL_IP, MCAST_JOIN_SOURCE_GROUP, buf, 0x108)의 0x108 바이트 스택 복사를 오염 프리미티브로 발견하여 사용했으며, stale rt_mutex_waiter를 완전히 덮어써 전체 체인(W1→W2→W3→KernelSU)을 뚫었습니다.ghostlock-kit-20260913.zip을 다운로드하고 압축을 해제합니다.cd <解压目录>\ghostlock-kit
powershell -ExecutionPolicy Bypass -File .\scripts\run-at-lockscreen.ps1 -Reboot
[+] Root 成功!가 보이면 완료입니다(실행 중 휴대폰 잠금을 해제하지 마세요). 검증:adb shell su -c id
# uid=0(root) gid=0(root) groups=0(root) context=u:r:ksu:s0
실패하면 커널 panic이 발생하여 자동 재부팅되며, 스크립트가 자동으로 대기 후 재시도합니다(성공률 약 25–30%/회; 잠금 화면 타이밍에서는 거의 한 번에 성공). root는 임시(KernelSU late-load)이며, 휴대폰 재부팅 후에는 스크립트를 다시 실행해야 합니다.
.
├── scripts/
│ ├── run-at-lockscreen.ps1 # 원클릭: 재부팅→잠금 화면 대기→푸시 검증→실행→자동 재시도(권장)
│ └── retry-if-needed.ps1 # 범용 재시도(강제 재부팅 없음)
├── src/
│ └── ghostlock-mcast.patch # 소스 변경(베이스라인 ghostlock-app @ 50d2b72)
├── docs/ # 분석 문서(익스플로잇 보고서/transport 분석/waiter 및 PI walk/기기 매뉴얼/문제 해결 기록)
└── LICENSE # Apache-2.0(업스트림 계승)
바이너리와 완전한 키트(files/ghostlock, files/ksud, files/offsets.json, KernelSU APK)는 git 저장소에 포함되지 않습니다.
Releases에서 ghostlock-kit-20260913.zip을 다운로드하세요.
| 자산 | 설명 | SHA-256 |
|---|---|---|
ghostlock-kit-20260913.zip | 완전한 키트(스크립트+바이너리+APK+문서) | df547f6b2852a0d86582958e049ef5a44599a5a91ce0dace2162fb7d0fcab11d |
키트 내 주요 파일(MD5):
| 파일 | MD5 |
|---|---|
files/ghostlock(익스플로잇 프로그램) | e581609ed114d33efa3b8a1958f85637 |
files/ksud(공식 KernelSU v3.3.0 사용자 공간) | de059ed8ffd896129a0a4bbe338c946a |
files/offsets.json(본 기종 오프셋) | a2498197161b01bdcc5dffc0614fbfbd |
FUTEX_WAIT_REQUEUE_PI에서 반환된 후, task->pi_blocked_on이 여전히 자신의 스택에 있는 rt_mutex_waiter를 가리키고 있습니다.setsockopt(SOL_IP, MCAST_JOIN_SOURCE_GROUP, buf, 0x108)로 do_ip_setsockopt가
memset(0x108) + copy_from_user(0x108)을 실행하며, 복사 구간 [S'−0x338, S'−0x230)이 해당 waiter(waiter는 버퍼 오프셋 0x60에 위치)를 완전히 덮어씁니다.
buf[8]=0으로 설정하면 패밀리 검증이 실패하여 syscall이 복사 후 깨끗하게 반환됩니다.sched_setattr → rt_mutex_adjust_prio_chain이 위조된 waiter를 읽음 → rb_erase left-only relink로
*(target) := value 쓰기 프리미티브 형성.cred = init_cred → W3 seccomp 정리(shell 흐름에서는 건너뜀) → root 스크립트가 KernelSU late-load.자세한 내용은 docs/를 참조하세요(증거 체인, 디스어셈블리 분석 및 크래시 현장 포함).
| 문제 | 처리 |
|---|---|
| 실패 후 휴대폰 재부팅 | 정상(확률적 이벤트); 재부팅 후 잠금 해제하지 말고 바로 스크립트 재실행 |
| 매니저가 "미설치/미작동" 표시 | 먼저 su -c id 사용 가능 여부 확인; 매니저를 열어 새로고침, 하지 말 것: 스와이프로 닫기/강제 종료 |
| root가 재부팅 후 사라짐 | 정상(late-load는 비영구적); 스크립트 재실행 |
| ReSukiSU를 사용하고 싶음 | 본 기기에서는 사용 불가(매니저를 열면 즉시 멈추고 재부팅), 필요하면 별도로 매칭 버전 구성 |
| 시스템 업데이트 후 | offsets.json이 무효화될 수 있으므로 재생성/가져오기 필요 |
# 베이스라인: ghostlock-app @ 50d2b72(PR#127 포함)
git clone https://github.com/YuKongA/ghostlock-app.git
cd ghostlock-app && git checkout 50d2b72
git apply /path/to/src/ghostlock-mcast.patch
make NDK_ROOT=<your-ndk> ghostlock
패치 내용: MCAST transport(do_mcast_fake_lock_route), 라우팅 선택, observe/사전 구축 로직,
GHOSTLOCK_WALK_LOG(consumer 측 walk 위치 파악), root 스크립트 pstore 백업, GHOSTLOCK_SKIP_VR.
ksud와 APK는 공식 v3.3.0 릴리스에서 가져왔으며, 저작권은 해당 저자에게 있습니다기기 소유자가 자신의 기기에서 로컬 보안 연구 및 개인용 root를 수행하기 위한 용도로만 제공됩니다. 어떠한 미인가 기기나 불법 용도로도 사용하지 마세요. 본 도구를 사용하면 기기가 불안정해지거나 데이터 위험이 발생할 수 있으므로, 직접 백업하고 그에 따른 결과를 감수하시기 바랍니다.