Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
ghostlock-oneplus — GhostLock (CVE-2026-43499) — 부트로더가 잠긴 Android 기기를 위한 커널 익스플로잇 | Kitploit
도구/GitHubGitHub/joinchang/ghostlock-oneplus
Android SecurityPrivilege EscalationExploit FrameworksVulnerability AnalysisPenetration TestingMobile SecurityLearning & EducationBinary Exploitation
GitHubjoinchang/ghostlock-oneplus

ghostlock-oneplus

GhostLock (CVE-2026-43499) — 부트로더가 잠긴 Android 기기를 위한 커널 익스플로잇

저장소 보기
235462511일 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

GhostLock — 잠긴 부트로더 탈옥

잠긴 부트로더가 있는 Android 기기를 위한 커널 익스플로잇. 부트로더 잠금 해제나 부팅 이미지 수정 없이 임시 루트 + KernelSU 설치를 달성합니다. 런타임 시 커널 버전을 자동 감지하며 다중 기기 오프셋 테이블을 포함합니다.

GhostLock running on OnePlus Ace 6T with KernelSU (LKM, Jailbreak mode)

취약점

CVE-2026-43499 — Futex PI(우선순위 상속) Use-After-Free

Linux 커널 5.7 ~ 7.1에 영향. 안정 버전 6.1.175, 6.6.140, 6.12.86에서 수정됨. 2026년 9월 기준 대부분의 Android 기기는 패치되지 않은 상태입니다.

pselect6 syscall은 fd_set 데이터를 커널 스택에 복사합니다. futex PI 대기자(waiter) 메커니즘과 결합되면, 해제된 스택 프레임이 rt_mutex_waiter 구조체로 재사용될 수 있습니다. PI 체인 탐색 중 rb-tree 리밸런싱이 임의의 커널 주소에 제어된 값을 기록합니다.

지원 기기

검증 완료

기기SoC커널GKI 브랜치SHIFT
OnePlus Ace 6T (PLR110)SM88456.12.38android16-50
OnePlus 15 (CPH2745/2747/2749)SM88506.12.23android16-50
Xiaomi 17 (pudding)SM88506.12.23 / 6.12.69android16-5 / android16-60
OnePlus 13 (IN2060)SM87506.6.89android15-8-2
OPPO Pad 4 ProSM87506.6.89android15-8-2

오프셋 추출됨 (기기 테스트 대기 중)

실행 불가

pselect 스택 오버레이가 해제된 rt_mutex_waiter가 사용자 제어 가능한 stack_fds 영역(word 0–14) 내에 위치해야 합니다. 위치는 커널 버전이 아닌 컴파일러 PGO/LTO 프로파일에 의해 결정됩니다. 스택 레이아웃 참조.

6.1 실행 가능성 참고: OPLUS 6.1 커널은 PGO가 do_futex를 인라인화하여 일관되게 실행 불가능합니다. 그러나 일부 비-OPLUS 6.1 커널(vivo)은 표준 호출 체인을 유지하여 실행 가능합니다(vivo T4, X Fold3 Pro). 실행 가능성은 기기별로 확인해야 합니다.

익스플로잇 흐름

기기 기능에 따라 자동으로 선택되는 두 가지 루트 경로:

경로 A: UMH 루트 (권장, C ashmem 기기)

off_ashmem_misc_fops != 0 필요 (BSS에 정적 miscdevice가 있는 C ashmem).

root@kitploit:~
PI 쓰기 (mode=4)  →  miscdevice fops를 가짜 fops로 리다이렉트
                   →  configfs r/w → pipe physrw (1바이트 정밀 커널 r/w)
                   →  SELinux enforcing = 0 (단일 바이트, policycap 손상 없음)
                   →  UMH: system_unbound_wq에 work_struct 주입
                   →  루트 스크립트 → ksud late-load → KSU 설치

사용 가능: OnePlus 13, OPPO Pad 4 Pro, 5.10/6.1 C ashmem 기기. Rust ashmem(6.12 GKI)에서는 사용 불가 — 힙 할당 miscdevice.

경로 B: 직접 PI 쓰기 (폴백)

root@kitploit:~
쓰기 1 (mode=1)  →  SELinux enforcing = 0 (8바이트 쓰기, 인접 바이트 손상)
쓰기 2 (mode=2)  →  task->cred = init_cred (uid=0, 모든 capabilities)
루트 셸         →  ksud late-load → KSU → SELinux 정책 수정

W1+W2 이후, 익스플로잇은 SELinux 정책 바이너리의 config 필드를 패치하고(ANDROID_NETLINK_ROUTE + GETNEIGH에 대해 |= 0xC0000000), /sys/fs/selinux/load를 통해 재로드하여 네트워크 연결을 복원합니다.

부트스트랩 모드 (폰 단독)

root@kitploit:~
앱 (seccomp)  →  쓰기 1 → mini-adb TCP → adb shell: 전체 익스플로잇 → 루트

자동 부팅

부팅 시 실행 런처는 별도의 GhostLock Anchor 앱에서 제공됩니다.

스택 레이아웃 실행 가능성

NFDS=320에서 core_sys_select는 커널 스택에 256바이트 stack_fds 버퍼를 할당합니다:

root@kitploit:~
stack_fds:  0    5    10   14 | 15   20   25   29
            ├─in─┤─out─┤─ex──┤ ├res_in┤res_out┤res_ex┤
            ◄── USER CONTROLLED ──►│◄── KERNEL ZEROED ──►

익스플로잇은 fd_set 입력 비트맵에 가짜 대기자 필드(task, lock)를 배치합니다. 6.12 중첩 대기자(14 words)의 경우: 최대 실행 가능 대기자 word = 3. 5.10/6.1 컴팩트 대기자(10 words)의 경우: 최대 실행 가능 대기자 word = 7.

대기자 위치는 호출 체인 깊이에 따라 달라집니다:

kernel_phys_load

모든 커널 쓰기는 선형 맵 별칭을 사용합니다. 부트로더가 kernel_phys_load를 선택하며, 이는 SoC별로 다릅니다:

SoCkernel_phys_load
SM8845 (Ace 6T, 15T)0xa8000000
SM8750 (OnePlus 13, OPPO Pad 4 Pro)0xa8000000

잘못된 값은 조용히 실패합니다. 루팅된 기기에서 읽으세요:

root@kitploit:~
su -c 'grep -i "Kernel code" /proc/iomem'   # c7810000-... → 0xc7800000

런타임 시 재정의: KPHYS=0xc7800000 /data/local/tmp/a/e

PSELECT_SHIFT

root@kitploit:~
/data/local/tmp/a/e                        # 기본값 (shift=0)
PSELECT_SHIFT=-2 /data/local/tmp/a/e       # OnePlus 13 (6.6)

KIMAGE_TEXT_BASE

5.10 커널은 0xffffffc008000000을 사용합니다(VA_BITS=39, 6.x 기본값 0xffffffc080000000과 다름). 이는 기기 오프셋 항목의 kimage_text_base 필드를 통해 자동으로 처리됩니다.

빌드

root@kitploit:~
make NDK_ROOT=/path/to/android-ndk

또는 직접:

root@kitploit:~
NDK=/path/to/android-ndk
"$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android35-clang" \
  -O2 -Wall -Isrc/core -Isrc/devices -DTARGET_CONFIG_H=\"target.h\" \
  src/core/main.c src/core/util.c src/core/slide.c \
  src/core/fops.c src/core/pipe_physrw.c src/core/root.c \
  src/core/miniadb.c src/core/umh_root.c \
  -o ./ghostlock -fPIE -pie -pthread

전제 조건

ksud (KSU 설치에 필요)

GhostLock은 임시 루트를 제공합니다. KernelSU 설치에는 각 KMI 버전에 대한 kernelsu.ko를 번들하는 ksud가 필요합니다.

방법절차
ReSukiSU APK (권장)ReSukiSU 또는 이 포크 설치. 번들 포함.

설정

root@kitploit:~
adb shell mkdir -p /data/local/tmp/a
adb push ./ghostlock /data/local/tmp/a/e
adb shell chmod 755 /data/local/tmp/a/e
adb shell /data/local/tmp/a/e

부팅 완료 및 ADB 준비 후 실행하세요.

새 기기 추가

boot.img만 필요 — 루트나 기기 접근 권한이 필요 없습니다.

1. 커널 및 kallsyms 추출

전체 워크플로는 kallsyms 도구 가이드를 참조하거나:

root@kitploit:~
python tools/extract_target.py --kallsyms kallsyms.txt
python tools/extract_btf.py kernel

2. 실행 가능성 확인

커널 바이너리에서 futex_wait_requeue_pi를 대상으로 하는 모든 분기 명령을 검색하여 do_futex가 PGO 인라인화되었는지 확인하세요. __arm64_sys_futex가 이를 직접 호출하면(do_futex 우회), 해당 기기는 실행 불가능할 가능성이 높습니다.

3. 기기 항목 생성

추출된 오프셋으로 src/devices/<name>/offsets.h를 추가하고 src/devices/offsets.h에 포함시키세요. 적절한 구조체 오프셋 매크로를 사용하세요:

5.10/6.1 컴팩트 대기자 기기의 경우 .kimage_text_base=0xffffffc008000000ULL도 설정하세요.

파일

라이선스

승인된 보안 연구 및 교육 목적으로만 사용하세요.

도구 다운로드
기기SoC커널비고
OnePlus 15T (PLZ110)SM88456.12.38Ace 6T와 동일한 커널
OPPO Reno10 Pro+ (CPH2521)SM84755.10.2365.10 컴팩트 대기자, 대기자 word=0
Vivo X Fold3 Pro (PD2337)SM86506.1.1246.1 컴팩트 대기자, 대기자 word=3
Vivo T4SM86506.1.1456.1 컴팩트 대기자, 대기자 word=3
기기SoC커널근본 원인
OPPO Find X9 UltraSM87506.12.58PGO가 do_futex 제거 → 대기자 word=14
OnePlus 12SM86506.1.141PGO가 do_futex 인라인화 → 대기자 word=13/19
OnePlus 13R / Ace 5SM86506.1.xOPLUS 6.1: 대기자 word=13
realme RMX5070SM66506.1.141OPLUS 6.1: 대기자 word=13
OPPO Pad 5 (OPD2502)MT68786.1.134OPLUS 6.1: 대기자 word=13
Motorola Edge 60 FusionMT68786.1.145비-OPLUS 6.1: 동일 결과
iQOO Neo 10 CNSM86506.1.84do_futex 프레임 0xD0 → 대기자 word=-11
OPPO PKW110—5.15.180do_futex 프레임 0x140 → 대기자 word=-29
iQOO Z9 5G—5.15.178do_futex 프레임 너무 큼
CPH2763 (OPPO)—6.1.115OPLUS 6.1: PGO 인라인화, 대기자 word=24
패턴호출 체인실행 가능
android16-5 (6.12)sys_futex → do_futex → fwrpi✅ 대기자 word=2
android15-8 (6.6)sys_futex → do_futex → fwrpi✅ 대기자 word=2 (SHIFT=-2)
vivo 6.1sys_futex → do_futex → fwrpi✅ 대기자 word=3
OPLUS 6.1sys_futex → fwrpi (PGO 인라인화)❌ 대기자 word=13+
android16-6 (X9 Ultra)sys_futex → fwrpi (PGO 인라인화)❌ 대기자 word=14
5.10 OPLUSsys_futex → do_futex → fwrpi✅ 대기자 word=0
SM8650 (vivo T4, X Fold3 Pro)
0xa8000000
SM8850 (OnePlus 15, Xiaomi 17)0xc7800000
libksud.so
CI 릴리스ReSukiSU CI에서 다운로드
커널대기자 레이아웃매크로
6.12.x중첩 (14 words)STRUCT_OFFSETS_6_12
6.6.x중첩 (14 words)STRUCT_OFFSETS_6_6
6.1.x (vivo)컴팩트 (10 words)STRUCT_OFFSETS_6_1
5.10.x컴팩트 (10 words)STRUCT_OFFSETS_5_10
파일설명
src/core/main.c익스플로잇 진입점, W1/W2, UMH 경로, 부트스트랩, 루트 스크립트, SELinux 정책 수정
src/core/fops.cpselect 경로, PI 쓰기, CFI 단계, 컴팩트 대기자 지원
src/core/util.c힙 스프레이, KernelSnitch, 슬랩 드레인, 페이로드 설정
src/core/pipe_physrw.c파이프 버퍼 물리 메모리 r/w
src/core/umh_root.c워크큐 주입을 통한 UMH 루트
src/core/miniadb.c미니 ADB 클라이언트 (TCP + RSA 인증)
src/core/target.h메모리 레이아웃, 구조체 필드 기본값 (6.12)
src/core/runtime_struct_offsets.h기기별 구조체 필드 재정의
src/devices/offsets.h기기 오프셋 테이블 + STRUCT_OFFSETS_* 매크로
tools/extract_target.pykallsyms에서 오프셋 추출
tools/extract_btf.pyBTF에서 구조체 오프셋 추출
tools/kallsyms/종단간 kallsyms 복구 워크플로