Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

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

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 비활성화, 루트 셸 실행

631071개월 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

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

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를 통해 매핑을 2 MB 자기 매핑 영역으로 강화하여 대량 고속 읽기(fast_pread_bytes 등)를 지원한다.
  3. SELinux 비활성화. 물리 메모리에서 selinux_state.enforcing 필드를 0으로 만든다. 이어서 고정 물리 베이스 주소 0xA8000000에서 커널 이미지를 덤프하고(기본 상한 43 MB)—— 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)을 다시 실행한다. 커널 코드는 최종적으로 실행 전과 바이트 단위로 동일하다.

테스트 기기

모델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(런타임에 이 도구로 비활성화됨)

전체 기기 정보는 device_info.txt를 참조하십시오.

저장소 구조

├── 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 이상)이면 모두 가능하며, 예시는 다음과 같습니다:

# 静态链接(自包含、任意 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

사용 방법

#推送exploit
adb push exploit /data/local/tmp/

#运行exploit
adb shell
chmod +x /data/local/tmp/exploit
/data/local/tmp/exploit

상세 튜토리얼 보기 (안에 원클릭 도구가 있음)

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

환경 변수

변수역할
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 = 43 MB).
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실패 시 바로 종료하고 번호를 바꿔 재시도하지 않습니다.

vr.ko 비활성화

vivo 기종의 특수한 메커니즘 때문에 iQOO Neo8에서는 이를 비활성화해야 root 권한이 안정적으로 유지됩니다(구체적인 원리는 여기서 설명하지 않습니다. 다른 vivo 기종 및 커널 버전에는 통용되지 않을 수 있으므로 vr.ko를 직접 추출한 후 리버싱 분석해야 합니다). 다음 작업을 실행하기 전에 현재 셸 세션이 이미 root 권한을 획득했는지 먼저 확인하십시오.

#备份原始apanic

dd if="$(readlink -f /dev/block/by-name/apanic)" of=/sdcard/apanic_full.bin
#adb shell内执行
adb pull /sdcard/apanic_full.bin ./
#主机端执行

#禁用vr.ko(风险自行评估)
printf '\370\037\000\000\000\000\000\000\000\000\000\000' | dd of=$(readlink -f /dev/block/by-name/apanic) bs=1 seek=$(( $(blockdev --getsize64 /dev/block/by-name/apanic) - 65472 )) conv=notrunc && sync

之后如果冷重启手机导致root权限失效,只需重跑exploit再执行越狱

ReSukiSU 탈옥(root 권한 지속화)

$(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(영향받는 펌웨어)이며, 기기 시스템에 퀄컴이 2025년 6월에 발표한 보안 패치가 설치되지 않았고, 물리 덤프에서 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 취약점 익스플로잇의 저자m/
  • cheese / cheese-cake 오픈소스 계보 — SDS/TTBR0 기술, 커널 덤프 기반 kallsyms 파싱
  • hawkes — 2020년의 adrenaline.h KGSL 헤더 파일, ioctl 인터페이스 정의 제공
  • 酷安@renil — 이 취약점을 iQOO Neo8에서 재현한 연구 (vk.ko 리버스 엔지니어링 분석)

이 저장소는 zhuowei/cheese를 기반으로 개조되었습니다 (원본 저장소에는 라이선스가 없음) 취약점의 전체 원리는 cheese 저장소 및 취약점 공지를 참조하세요.

  • 酷安@TNTHe — 제 쿨안 계정

면책 조항

이 저장소는 교육 및 보안 연구 목적으로만 사용되며, 본인이 소유하거나 권한을 부여받은 기기에서만 사용하십시오. 저자는 어떠한 남용 행위에 대해서도 책임지지 않습니다. 이 도구를 사용하면 보증이 무효화되거나 관련 서비스 약관을 위반할 수 있습니다.

도구 다운로드