
Pixel 기기에서 루트 권한을 얻는 데 도움이 되는 CVE 연구 및 익스플로잇
권한 없는 adb shell에서 잠긴 부트로더의 순정 Google Pixel을 커널 CVE를 이용해 루팅한다 — 언락도, 플래싱도, 벤더의 도움도 필요 없다.
사용자 공간에서 도달 가능한 커널 버그가 단명하는 읽기/쓰기 프리미티브를 만들어낸다. 그 프리미티브는 실행 중인 GKI 커널에 KernelSU 모듈을 늦은 로딩(late-loading)하는 데 소비되고, 그 후 이미 설치되어 있는 KernelSU 매니저에게 root가 넘겨진다. 어떤 파티션에도 기록하지 않으므로 재부팅이 곧 제거다. 모든 것은 호스트에서 adb를 통해 단일 실행 파일 ./pixel-ksu-root로 실행된다.
| CVE | 버그 | 현재 상황 |
|---|---|---|
| CVE-2026-43499 — GhostLock | futex PI 순회가 remove_waiter()가 매달아 둔 채로 남긴 rt_mutex_waiter를 따라가며, pselect(2)가 다시 점유한 스택 슬롯에서 읽어낸다 | 루팅 성공, 하드웨어 검증 완료; default 레시피이므로 그냥 실행하면 이것이 선택된다 |
| CVE-2026-43049 — FFWheel | hidpp_probe()가 포스 피드백 초기화 전에 입력 디바이스를 공개하고 hid_hw_stop() 없이 오류를 반환하여, 해제된 struct uhid_device가 /dev/input/eventN을 통해 계속 도달 가능하다 | 루팅 성공, 하드웨어 검증 완료; 권한 없는 셸에서 임의 커널 읽기/쓰기로 이어지는 use-after-free, 그 후 자신의 cred를 제자리에서 덮어쓴다 |
| CVE-2026-93189 — Joyride | hid_hw_stop()이 입력이 멈추기를 기다리지 않아, 실패한 probe가 다른 프로세서에서 hidraw_report_event()가 여전히 쓰고 있는 struct hidraw를 해제한다 | 후보 후속작; 해제로 가는 경로는 권한 없는 셸에서 /dev/uhid를 통해 하드웨어에서 검증되었고, 위의 두 체인을 모두 막은 빌드에서도 열려 있다 |
| CVE-2026-46242 — BadEpoll | __ep_remove()가 file->f_ep를 지우고도 파일을 계속 사용하여, 동시 실행되는 __fput()이 여전히 쓰고 있는 eventpoll을 해제한다 | 부분적; 읽기와 쓰기 체인 모두 끝까지 실행되지만, 슬랩 경계를 넘는 전달이 미해결이다 |
| CVE-2026-56945 — RogueWave | bigo_iommu_fault_handler()가 호출자에 대한 문서화된 잘못된 가정 위에서 드라이버 전역 인스턴스 목록을 잠금 없이 순회한다 | 공개된 AMediaCodec API를 통해 권한 없이 도달 가능; fault handler 자체는 아직 진입하지 못했다 |
| CVE-2026-56914 — DirtyDock | gcip_iommu_mapping_unmap_buffer()가 잠금 변형 대신 잠금 없는 set_page_dirty()로 pinned DMA 페이지를 dirty 처리하여, 백킹 메모리의 해제와 경쟁한다 | 끝까지 트리거 가능하지만 디바이스 노드가 권한으로 제한됨; 두 가지 경쟁 전략이 반증되었고, 타이밍은 아직 잡지 못했다 |
| CVE-2026-64468 — Frostbind | binder_free_transaction()이 참조를 보유하지 않고 t->to_proc를 역참조한다 | 추적 중; 취약한 읽기는 실행되지만 베어 메탈에서 경쟁에서 진다 |
| CVE-2026-64469 — Frostwalk | 같은 함수 안의 Frostbind의 형제 버그: binder_free_transaction()의 잠금 없는 읽기가 binder_thread_release()가 다른 스레드의 transaction_stack을 순회하는 것과 경쟁한다 | 추적 중; 해제와 순회 모두 도달 가능함이 확인되었고, 메커니즘에 root 의존성이 없다 — Shizuku가 하는 방식으로 앱 프로세스에 도달한다; verify-read 없는 회수 시도(flood + pin)는 아직 성공하지 못했다 — 쓰기의 실제 대상이 여전히 구별되지 않는다 |
| CVE-2026-64560 — Zombietick | 프로세스 전역 POSIX CPU 타이머가 여전히 큐에 있는 상태에서 해제된다. 왜냐하면 posix_cpu_timer_del()이 de_thread()가 ->sighand를 null로 만든 후 조기 반환하기 때문이다 | 추적 중; KASLR 단계는 성공하지만 브리지 디스크립터가 검증되지 않는다 |
| CVE-2026-49881 — Telecom | Telecom이 호출자가 제공한 컴포넌트 이름을 신뢰하고 CONTEXT_INCLUDE_CODE로 로드하여, 미끼 앱이 system_server 내부에서 임의의 Java를 실행한다 | 연구 단계; 커널 버그가 아닌 사용자 공간 도메인 피벗으로, domainprobe/와 짝을 이룬다 |
| P0 465827985 — StackJump | stack-clash 보호 없이 빌드된 네이티브 코드가 큰 프레임으로 system_server 스레드의 가드 페이지를 넘어선다 | 오버플로는 재현되어 binder 스레드를 안정적으로 크래시시킨다; 리포터의 스프레이 기반 쓰기는 그렇지 않아, 실현된 프리미티브는 크래시 툼스톤의 읽기다 — 해당 프로세스에 대한 완전한 ASLR 무력화 |
| CVE-2026-28594 — SealSlip | 봉인되지 않은 memfd가 ashmem이 예상되는 곳에서 허용되어, 소비자가 보유하는 동안 크기가 변경 가능하게 유지된다 | 권한 없는 호출자에게는 서비스 거부만 가능하며 SELinux로 제한됨; 계측을 위해 유지 |
| CVE-2026-28662 — CookieJar | Wi-Fi Direct 쿠키가 하한 검사만 있는 고정 버퍼로 복사되어 wpa_supplicant 힙을 오버플로한다 | 문서화됨, 추적하지 않음; 후보 첫 단계 |
| CVE-2026-43284 — DirtyFrag | esp_input()이 제자리에서 복호화하여, 시퀀스 워드 저장이 해시 검사 전에 프래그먼트가 고정한 페이지 캐시 페이지에 기록된다 | 종료됨; 패치되지 않았지만 어떤 권한에서도 익스플로잇 불가. 왜냐하면 skb_orphan_frags_rx()가 먼저 프래그먼트를 복사하기 때문이다 |