
CVE-2026-43499 (GhostLock) 기반 Linux 커널 권한 상승 exploit 시도 — Huawei Watch 4 Pro (MDS-AL00, armv7l)
이 프로젝트는 Huawei Watch 4 Pro (MDS-AL00, Snapdragon SW5100, HarmonyOS 4.3.0 AOSP 12) 기기를 대상으로 한 GhostLock 커널 취약점 exploit 시도이며, ARM 32-bit (armv7l) 아키텍처에 맞게 포팅되었습니다.
GhostLock (CVE-2026-43499)은 Linux 2.6.39부터 7.x까지 영향을 주는 커널 futex PI UAF 취약점입니다. 이 프로젝트의 목표는 Huawei 워치에서 완전한 권한 상승 체인을 완성하는 것입니다.
원본 저장소: MobiusM/CVE-2026-43499 (arm64 버전 PoC)
| 매개변수 | 값 |
|---|---|
| 디바이스 | Huawei Watch 4 Pro (MDS-AL00) |
| 커널 | 5.4.161-perf (ARM32 armv7l) |
| 시스템 | HarmonyOS 4.3.0 (AOSP 12) |
| CPU | Snapdragon SW5100 |
| SELinux | Enforcing (CONFIG_SECURITY_SELINUX_DEVELOP=n) |
| KASLR | 비활성화 |
| MMU | CONFIG_STRICT_KERNEL_RWX=y |
| 스택 | NX (커널 스택 실행 불가) |
| mmap(0) | Huawei 추가 차단 (-EINVAL, 비표준 -EACCES) |
kernel 5.4.161 ARM32에서 FUTEX_CMP_REQUEUE_PI가 EDEADLK를 트리거한 후, PI 체인 순회는 두 번째 rb_erase를 수행하지 않습니다. GhostLock 64가 의존하는 UAF → 두 번째 rb_erase로 UAF 페이지에 쓰는 체인 exploit은 이 커널에서 완전히 무효화됩니다.
모든 8-iov writev 스프레이 변종이 실패했습니다: sc[0] after = e3a0002a (셸코드 페이지가 기록되지 않음).
ghostlock64의 8-iov writev 스프레이는 커널 스택의 iovstack[8] 배열이 rt_mutex_waiter 구조체와 겹치는 것에 의존합니다. 이 커널에서는:
clear_refs_operations.write를 성공적으로 덮어쓰지 못함sched_setattr은 PI 체인 순회를 성공적으로 트리거할 수 있지만(success=1600+ 검증됨), rb_erase가 조작하는 것은 OWNER 스레드의 pi_tree_entry(kmalloc 힙의 task_struct에 위치)이며, waiter 스레드의 스택 데이터(fd_set writev 데이터)가 아닙니다.
따라서 pselect + sched_setattr 경로로도 쓸 값을 제어할 수 없습니다.
mmap(0, ..., MAP_FIXED, ...)는 -EINVAL을 반환하며, 표준 Linux의 -EACCES가 아님CONFIG_SECURITY_SELINUX_DEVELOP=n → selinux_state.enforcing 필드가 존재하지 않음mremap → ENOSYScommit_creds: 0xC0140390
prepare_kernel_cred: 0xC014059C
proc_clear_refs_ops: 0xC0CAF280 (.write @ +12 = 0xC0CAF28C)
mmap_min_addr: 0xC12E8568
dac_mmap_min_addr: 0xC123C734
selinux_hooks[mmap]: 0xC0F64E1C
| 저장소 | 디바이스 | 커널 | 아키텍처 |
|---|---|---|---|
| x-spy/CVE-2026-43499-popsicle | Xiaomi 17 Pro Max |
두 저장소 모두 pselect() + sched_setattr로 PI 체인을 트리거하고 physmap 직접 쓰기를 사용하며, ARM64의 direct map 메커니즘에 의존합니다. ARM32에는 direct map이 없고, 이 커널의 PI 체인 동작도 다릅니다.
CVE-2026-43499-armv7/
├── config/
│ └── kernel.config # 设备内核 .config (5.4.161-perf)
├── scripts/
│ ├── ghostlock_all.sh # 批量测试脚本
│ └── ghostlock_check.sh # 检测脚本
├── src/
│ ├── ghostlock64.c # 原始 8-iov 双 erase PoC (基础框架)
│ ├── ghostlock5-33.c # 早期迭代版本 (ghostlock5 ~ ghostlock33)
│ ├── ghostlock63.c # ghostlock 6.x 3-iov 变种
│ ├── g62_*.c # 3-iov 变种 (不同目标地址)
│ ├── g62_8e.c # 8-iov 精确喷溅 (最终版)
│ ├── g62_scan.c # 多 iov 偏移扫描
│ ├── g62_self.c # waiter 自触发 EDEADLK 测试
│ ├── g62_pispray.c # EDEADLK + slab spray + sched_setattr
│ ├── g62_rand.c # 写 randomize_va_space 测试
│ ├── gsu_v19.c # 8-iov + sched_setattr 触发
│ ├── gl_pselect*.c # pselect + sched_setattr 测试
│ ├── gl_scan.c # fd_set 偏移扫描
│ ├── sc64.c # shellcode payload
│ ├── trigger*.c # 原始触发 PoC (验证漏洞存在)
│ ├── ghostlock_root.c # 早期 root 尝试
│ └── test_*.c # 编译/运行测试
├── README.md
├── ghostlock64 # 8-iov 双 erase PoC 二进制
├── ghostlock63 # ghostlock 6.x 3-iov 二进制
├── g62_* # 3-iov 变种二进制
├── gl_* # pselect 测试二进制
├── gsu # sc-page hijack 变种
├── sc64 # shellcode
├── trigger* # 原始触发 PoC 二进制
└── test_* # 测试二进制
이 커널 버전 (5.4.161 ARM32)의 PI 체인 구현은 GhostLock의 이중 rb_erase 임의 쓰기 기술을 지원하지 않습니다. 알려진 모든 CVE-2026-43499 exploit 경로가 이 디바이스에서 차단되었습니다. 계속하려면 새로운 쓰기 프리미티브나 다른 취약점을 발견해야 합니다.
화웨이, 너 때문에 엿먹었네. deepseek V4 Pro 30RMB 토큰을 다 태워버렸어.
| 단계 | 상태 | 설명 |
|---|
| GhostLock FUTEX PI 트리거 | ✅ 검증 성공 | FUTEX_CMP_REQUEUE_PI가 EDEADLK (-35) 반환 |
| PI 체인 순회 트리거 | ✅ 검증 성공 | sched_setattr이 PI chain walk 트리거 |
| 두 번째 rb_erase | ❌ 핵심 차단 | 이 커널의 PI 체인 구현은 두 번째 rb_erase를 수행하지 않음 |
| iovstack 정렬 | ❌ 차단됨 | 8-iov writev 스프레이는 rt_mutex_waiter와 겹치지 않음 |
| mmap(0) 우회 | ❌ 차단됨 | Huawei 커널의 추가 검사 (-EINVAL) |
| fops hijack | ❌ 차단됨 | 제어 가능한 임의 쓰기 프리미티브 없음 |
| cred 덮어쓰기 | ❌ 차단됨 | 위 차단 지점에 의해 제한됨 |
| 권한 상승 완료 | ❌ | 미구현 |
| 경로 | 결과 | 원인 |
|---|
| ghostlock64 8-iov writev → FLPI | ❌ | 두 번째 rb_erase 미발생 |
| ghostlock64 + sched_setattr | ❌ | 위와 동일, PI 체인이 UAF 페이지에 도달하지 않음 |
| g62 3-iov | ❌ | 쓸 수는 있지만 값이 스택 주소이며, 스택 NX로 실행 불가 |
| pselect + sched_setattr | ❌ | rb_erase가 owner의 힙 데이터를 조작함 |
| waiter 자체 FLPI 두 번째 | ❌ | EDEADLK 빠른 경로, 스택을 읽지 않음 |
| iov 오프셋 스캔 (22 레이아웃) | ❌ | 전부 겹치지 않음 |
| mm(0) / mremap 우회 | ❌ | -EINVAL / ENOSYS |
| selinux hook 클리어 | ❌ | enforcing 필드가 존재하지 않음 |
| 6.12.23 |
| ARM64 |
| pubglite55/oppo-ghostlock | OPPO Find N2 | 5.10.236 | ARM64 |