Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
cve-2025-21479_iqooneo8 — CVE-2025-21479(Adreno KGSL)를 대상으로 한 iQOO Neo8(SM8475)용 로컬 루트 익스플로잇 - 물리 메모리 읽기/쓰기, SELinux 비활성화, 루트 셸 실행 | Kitploit
도구/GitHubGitHub/qingizi7/cve-2025-21479_iqooneo8
Android SecurityPrivilege EscalationExploit FrameworksExploitationReverse EngineeringMobile SecurityHardware & IoT SecurityPayload DevelopmentBinary Exploitation
GitHubqingizi7/cve-2025-21479_iqooneo8

cve-2025-21479_iqooneo8

CVE-2025-21479(Adreno KGSL)를 대상으로 한 iQOO Neo8(SM8475)용 로컬 루트 익스플로잇 - 물리 메모리 읽기/쓰기, SELinux 비활성화, 루트 셸 실행

324일 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기

CVE-2025-21479 — Qualcomm Adreno GPU 권한 상승 취약점 익스플로잇(SM8475 / iQOO Neo8)

CVE-2025-21479에 대한 로컬 권한 상승 실험 코드로, vivo V2301A(iQOO Neo8 / PD2301, Snapdragon 8+ Gen 1 / SM8475, Adreno A730, Android 14, GKI 커널 5.10)의 Qualcomm Adreno GPU(KGSL)를 대상으로 합니다.

원리적으로 이 익스플로잇은 KGSL의 CP_SMMU_TABLE_UPDATE 명령으로 GPU의 SMMU를 구동해 임의 물리 메모리 읽기/쓰기 능력을 확보하고, 이를 통해 SELinux를 끄고 커널 심볼을 찾아 root 셸을 획득합니다. 전 과정에서 플래싱이 필요 없으며, Bootloader 언락에도 의존하지 않습니다.

직접 소유하거나 권한을 부여받은 기기에서만 보안 연구를 수행하세요.


동작 방식

  1. GPU 물리 메모리 프리미티브. Adreno A730(eureka_panther) 마이크로코드의 접근 검사(and $12, 0x3)에 결함이 있어 Self-Draw-State(SDS) 패킷을 RingBuffer(RB)로 오판합니다. 따라서 사용자 공간에서 위조된 CP_SMMU_TABLE_UPDATE를 SDS 블록에 넣어 제출하면 GPU의 TTBR0를 덮어써 GPU 페이지 테이블이 임의의 물리 페이지를 가리키게 됩니다. 이후 GPU는 임의의 물리 메모리를 읽고 쓸 수 있습니다.
  2. 안정화된 읽기/쓰기. stabilize_rw로 매핑을 2MB 자체 매핑 영역으로 강화해 대량의 빠른 읽기(fast_pread_bytes 등)를 지원합니다.
  3. SELinux 끄기. 물리 메모리에서 selinux_state.enforcing 필드를 0으로 클리어합니다. 그다음 고정 물리 베이스 주소 0xA8000000에서 커널 이미지를 덤프하고(기본 상한 43MB), SM8475에는 물리 KASLR이 없으므로 원시 덤프에서 kallsyms 구조를 직접 파싱합니다(엔디언 자동 인식). 따라서 가상 KASLR도 영향을 주지 않습니다.
  4. root 페이로드. AArch64 셸코드(prepare_kernel_cred(0) → commit_creds(), seccomp 비활성화 포함)로 __do_sys_capset를 패치합니다. fork된 자식 프로세스가 capset()을 호출하면 → uid 0이 되고 → 덮어쓴 커널 코드를 복원한 뒤 → 자식 프로세스가 u:r:shell:s0 도메인으로 지정한 명령(기본값 sh)을 다시 실행합니다. 커널 코드는 최종적으로 실행 전과 바이트 단위로 일치합니다.

테스트 기기

전체 기기 정보는 device_info.txt를 참조하세요.

저장소 구조

root@kitploit:~
├── source/
│   ├── cheese.c            # 漏洞利用主程序(include 了下面两个文件)
│   ├── kallsyms_lookup.c   # 针对原始内核映像的 kallsyms 解析器
│   └── adrenaline.h        # KGSL ioctl / 命令定义(作者 hawkes)
├── exploit                 # 预编译 arm64 二进制(动态链接,minSdk 21,
│                           #  NDK r30-beta2)
├── device_info.txt         # 用于调参的目标设备信息
└── README.md

참고: cheese.c는 kallsyms_lookup.c와 adrenaline.h를 #include하므로, 컴파일할 때 세 파일이 같은 디렉터리에 있어야 합니다.

빌드

비교적 최신 Android NDK(r25+)면 충분합니다. 예시:

root@kitploit:~
# 静态链接(自包含、任意 API 等级可运行;体积较大)
aarch64-linux-android34-clang -o cheese source/cheese.c -static

# 动态链接(体积小,依赖设备自带的 libc;API 等级需匹配设备)
aarch64-linux-android34-clang -o exploit_dyn source/cheese.c
# 若要兼容 API 21+ 设备,请改用 aarch64-linux-android21-clang

사용 방법

root@kitploit:~
adb push exploit /data/local/tmp/

adb shell
chmod +x /data/local/tmp/exploit
/data/local/tmp/exploit

상세 튜토리얼은 여기를 클릭(원클릭 도구 포함)

성공하면 uid=0 셸을 얻게 되며, 이 세션의 SELinux는 꺼진 상태입니다. 프로세스는 권한 상승을 완료한 후 argv[1..](기본값 sh)을 다시 실행합니다. 실행할 때마다 카운트다운("pte wait 3 second")과 43MB 커널 읽기 진행률("Read X / 43 MB")이 표시됩니다. 권한 상승 성공, uid=0

환경 변수

ReSukiSU 루팅

root@kitploit:~
$(find /data/app -type f -name "libksud.so" | grep resukisu) late-load --kmi android12-5.10

다른 기기로 포팅

기기 관련 상수는 source/cheese.c 상단에 있습니다:

  • KERNEL_PHYS_BASE — 커널 물리 베이스 주소(기본값 0xA8000000, SM8475)
  • IDMAP_PG_DIR_OFFSET — idmap_pg_dir 오프셋(기본값 0x245a000)
  • selinux_state_offset — selinux_state를 찾는 데 사용하는 오프셋(기본값 0x729030, 실제 물리 주소 = idmap_pg_dir 물리 주소 + 해당 오프셋)
  • gPhyAddrs[] — 순서대로 시도할 후보 물리 베이스 주소
  • DEFAULT_KERNEL_SIZE_MB — 커널 읽기의 폴백 값 / 상한

전제 조건: Adreno A730/A7xx 시리즈 GPU(영향을 받는 펌웨어), 물리 덤프에서 kallsyms를 파싱할 수 있는 커널, 그리고 물리 KASLR이 없어야 합니다.

자주 묻는 질문

  • can't get GPU r/w — GPU 초기화 실패입니다. 먼저 기다려 보고, 그래도 안 되면 CHEESE_ATTEMPT=1..n을 시도하거나 CHEESE_PHYADDR을 직접 지정하세요. 단일 시도를 디버깅할 때는 CHEESE_NO_RETRY=1을 추가하세요.
  • kallsyms 파싱 실패 — 먼저 CHEESE_READ_FULL_KERNEL=1로 전체 이미지를 읽어 보고(CHEESE_KALLSYMS_MAX_MB로 상한 확장), 그래도 안 되면 CHEESE_FORCE_MANUAL_PATCHFINDER=1을 고려하세요.
  • 이 도구는 어떤 내용도 플래시하거나 영구 저장하지 않습니다. 커널 코드와 페이지 테이블은 종료 전에 복원되며, 재부팅 후 기기는 실행 전과 완전히 동일합니다.

감사의 말

  • @zhuowei — CVE-2025-21479 연구자이자 이 도구의 기반이 된 오픈소스 cheese 익스플로잇의 작성자
  • cheese / cheese-cake 오픈소스 계보 — SDS/TTBR0 기술, 커널 덤프 기반 kallsyms 파싱
  • hawkes — 2020년의 adrenaline.h KGSL 헤더 파일로 ioctl 인터페이스 정의 제공
  • 쿠안@renil — iQOO Neo8에서 이 취약점을 재현한 연구

zhuowei/cheese를 기반으로 개조함(원본 저장소에는 라이선스가 없음). 전체 원리는 취약점 공고를 참조하세요.

  • 쿠안@TNTHe — 제 쿠안 계정

면책 조항

이 저장소는 교육 및 보안 연구 목적으로만 제공됩니다. 직접 소유하거나 권한을 부여받은 기기에서만 사용하세요. 작성자는 어떠한 오용 행위에도 책임을 지지 않습니다. 이 도구를 사용하면 보증이 무효화되거나 관련 서비스 약관을 위반할 수 있습니다.

도구 다운로드
모델vivo V2301A(iQOO Neo8, 코드명 PD2301, 메인보드 taro)
SoCSM8475(Snapdragon 8+ Gen 1) + Adreno 730
Android14(UP1A.231005.007, SDK 34, qssi-user)
커널5.10.198-gki-gfb2f5774872c
SELinuxEnforcing(실행 중에 본 도구로 해제됨)
변수기능
CHEESE_PHYADDR=<phys>커널 물리 베이스 주소를 강제로 지정합니다(내장 gPhyAddrs 탐색 테이블 건너뜀).
CHEESE_ATTEMPT=<n>gPhyAddrs[0] 대신 gPhyAddrs[n]을 사용합니다. GPU 초기화 실패 시 maybe_retry가 번호를 자동으로 올려 재시도합니다.
CHEESE_SWAPPER_PG_DIR_OFF=<off>swapper_pg_dir 스캔을 건너뛰고 해당 절대 오프셋을 직접 사용합니다.
CHEESE_READ_FULL_KERNEL=1전체 커널 이미지를 읽습니다(기본 읽기 상한은 DEFAULT_KERNEL_SIZE_MB = 43MB).
CHEESE_KALLSYMS_MAX_MB=<MB>kallsyms 읽기 상한을 재정의합니다.
CHEESE_FORCE_MANUAL_PATCHFINDER=1수동 patchfinder 폴백을 강제합니다(init_cred, prepare_kernel_cred).
CHEESE_SKIP_GPU=1GPU 읽기/쓰기 단계를 건너뜁니다(디버그 전용).
CHEESE_NO_RETRY=1실패 시 번호를 바꿔 재시도하지 않고 바로 종료합니다.