
Honor WIN RT (AAK-AN00) CVE-2026-43499 임시 루트 - 연구 노트
(전부 deepseek가 작성했고, 나는 아무것도 모름)
기기 Bootloader 영구 잠금(
ro.oem_unlock.supported비어 있음), fastboot 없음, 영구 su 없음, Magisk 없음. 유일하게 남은 길은 커널 취약점. 이 저장소는 「공격 가능한가」부터 「공격 후 얼마나 안정적인가」까지의 전체 과정을 기록한다.
성격: 임시 root, 재부팅 시 무효화.
이 저장소는 본인 소유 기기에서 수행한 보안 연구 과정을 기록한 것으로, 목적은 커널 PI 경쟁 상태의 원인과 안정성 경계를 이해하는 것이다.
유일하게 성공한 경로는:
CVE-2026-43499 (futex PI 경쟁 상태 write-what-where) + rt_sigreturn 캐리어
→ LD_PRELOAD로 shell 도메인 프로세스에 주입
→ 2단계: 먼저 SELinux Permissive로 전환, 그다음 task->real_cred / cred를 init_cred로 변경
→ uid=0(root) context=u:r:kernel:s0, 그리고 su 데몬 이식
하지만 진짜 기록할 가치가 있는 것은 「어떻게 root를 얻는가」가 아니다 —— root를 얻은 후에 벌어지는 일이다.
얻은 것은 안정적인 root가 아니라, 「언제든 폭발할 수 있는 상태」다.
exploit의 쓰기 원시 연산은 위조된
rt_mutex_waiter를 실제 futex PI 체인에 삽입하며, 이 waiter의 운반체는 이후 시스템 콜에 의해 재사용될 커널 스택 / 스프레이 페이지다. 따라서 root가 착지한 그 순간부터, 어떤 시스템 수준 스케줄링이나 우선순위 변동이든 그것을 밟을 수 있고, 곧바로 커널 panic 재부팅으로 이어진다. 이것은 버그가 아니라 이 공격 기법의 내재적 대가다 —— 자세한 내용은docs/03참조.
왜 커널 버전을 반드시 고정해야 하는가: 결함은 6.6.140에서 수정되었고, 본 기기는 6.6.118 < 6.6.140이므로 아직 남아 있다;
동시에 exploit의 모든 커널 심볼 주소와 「캐리어 기하학」이 이 하나의 build에 고정되어 있어, 커널이 바뀌면 오프셋 테이블이 즉시 무효가 되며, 일반적으로 롤백 불가하다.
┌─ 재료 ────────────────────────────────────────────────┐
│ boot.img + xbl_config.elf (기기 펌웨어에서 추출) │
│ ↓ 심볼 해석 │
│ target.h (커널 심볼 주소, kallsyms와 바이트 단위 대조 완료) │
│ ↓ 빌드 │
│ preload.so ──► 기기 측 /data/local/tmp/*.so │
└────────────────────────────────────────────────────────┘
↓ LD_PRELOAD 주입
┌──────────── 2단계 (반드시 두 개의 독립 프로세스) ────┐
│ 단계 A GW_SELINUX=1 → selinux_state.enforcing = 0 │
│ 단계 B GW_CHAIN=1 RTSIG_TASK_INIT=1 GW_SU=1 │
│ → task->real_cred ← &init_cred │
│ → task->cred ← &init_cred ("사전 배치 라이터" 프로세스가 수행)│
│ → setresuid(0,0,0) 정규화 │
│ → 내장 su + daemon 이식 │
└─────────────────────────────────────────────────────────────┘
↓
uid=0(root) context=u:r:kernel:s0
반드시 정확히 해야 하는 세 가지 (틀리면 멈추거나 곧바로 panic):
real_cred, 그다음 cred. 반대로 하면 순간적으로 완전 권한이 되어 스레드가 통제 불능이 된다.cred ≠ real_cred인 과도 상태가 존재한다. 이때 어떤 sched_setaffinity든 EPERM → 전체 라운드가 멈춘다.
정답은 첫 번째 쓰기 이전에 「사전 배치 라이터」 프로세스를 fork하는 것(자격 증명이 깨끗함), 부모 프로세스가 첫 번째 쓰기를, 라이터가 두 번째 쓰기를 수행하여, 누구도 과도 상태에서 syscall을 발행하지 않게 하는 것이다.alias(image) = PAGE_OFFSET | (image − KIMAGE_TEXT_BASE + Δ), 재부팅 간 안정적;
소위 "slide 단계"의 진짜 가치는 쓰기 원시 연산 자체 점검이지, KASLR 우회가 아니다.업스트림 프레임워크:
Linuxoid-cn/CVE-2026-43499-Poc-Analysis. 이것은 GhostLock이 아니다 —— GhostLock은 pselect 경로를 사용하며, 본 build의 waiter 착지 기하학과 일치하지 않는다, 자세한 내용은docs/06참조.
당신도 BL이 잠긴 기종을 공략하고 있다면, 먼저 root로 무엇을 할지 명확히 생각하라, 왜냐하면 이런 기종에서 root는 아마 겨우 십몇 분만 쓸 수 있는 창일 것이기 때문이다. 「root가 필요하고 재부팅을 넘어 유지되어야 하는」 작업을 목록으로 만들고, 한 번에 전부 실행한 뒤
reboot하여 깨끗한 상태로 돌아가라. 「부작용을 제거」하려 하지 마라 —— 그것은 기법 자체의 대가다.
| 항목 | 값 | 설명 |
|---|
| 기종 | 荣耀 WIN RT, 모델 AAK-AN00 | 통칭 「荣耀 WIN RT」 |
| SoC | 骁龙 8 至尊版 SM8750-AB | 荣耀 WIN(AAP-AN00, SM8850-AC)과 펌웨어 호환 불가 |
| 시스템 | Android 16 / MagicOS 10 | — |
| 커널 | 6.6.118-android15-8-gf17133276a57-abogki518694926-4k | ★ 필수 조건, 문자 단위 일치 |
| 커널 설정 | 4K pages, VA_BITS=39, CONFIG_FUTEX_PI=y | 캐리어 기하학의 전제 |
| 펌웨어 패키지 | .170 | .160 / .175 미검증 |
| Bootloader | 영구 잠금 | fastboot 없음 / 영구 su 없음 |
| 문서 | 내용 |
|---|
| 01 · 실현 가능성 분석 | 왜 rt_sigreturn 하나만 캐리어로 남았는가 |
| 02 · 권한 상승 체인과 성공 요소 | 쓰기 원시 연산, 6단계 체인, 사전 배치 라이터, 성공 판정 기준 |
| 03 · 안정성의 진짜 원인: PI 체인 잔류 | ★ 핵심. 네트워크 끊김이 아니라 panic; 크래시 지점 디스어셈블리 포함 |
| 04 · PC 불필요 채널: Shizuku | Shizuku의 rish로 adb를 대체하여 exploit 기동 |
| 05 · KernelSU의 late-load | LKM 활성화 방식과 그것이 가장 위험한 기폭 장치인 이유 |
| 06 · 막다른 길 목록 | 시도했지만 통하지 않은 경로, 다른 사람이 재시도하지 않도록 |
| 07 · 함정과 환경 | root 없이 panic 스택 확보, 스크립트 환경 함정 |
| tools/ | 재사용 가능한 스크립트 (비식별화 범용판) |
| 날짜 | 진행 |
|---|
| 09-08 | BL 영구 잠금, OEM 언락 채널 제거 확인 ⇒ 공식 경로 포기, 취약점 경로로 전환 |
| 09-09 | 제조사 A/S 펌웨어 라이브러리 공략, boot.img 확보, 커널과 심볼 추출 |
| 09-10 | 캐리어 탐색이 rt_sigreturn으로 수렴; 권한 상승 성공(20:14), uid=0 |
| 09-11 | PC 불필요 채널(Shizuku) 개통; KernelSU 활성화 가능; 「네트워크 끊김」의 진짜 원인 = PI 체인 잔류로 규정 |