
Exploit local root pour CVE-2025-21479 (Adreno KGSL) sur iQOO Neo8 (SM8475) - accès r/w à la mémoire physique, désactive SELinux, ouvre un shell root
Code d'exploitation pour l'élévation de privilèges locale ciblant CVE-2025-21479, sur le GPU Qualcomm Adreno (KGSL) du vivo V2301A (iQOO Neo8 / PD2301, Snapdragon 8+ Gen 1 / SM8475, Adreno A730, Android 14, noyau GKI 5.10).
En principe, l'exploitation de la vulnérabilité pilote le SMMU du GPU via la commande CP_SMMU_TABLE_UPDATE de KGSL,
obtenant ainsi une capacité de lecture et écriture arbitraires en mémoire physique, puis désactive SELinux, localise les symboles du noyau et obtient un
shell root — le tout sans flasher l'appareil, ni dépendre du déverrouillage du Bootloader.
Recherche de sécurité limitée aux appareils que vous possédez ou pour lesquels vous disposez d'une autorisation.
and $12, 0x3) est défectueuse et identifie à tort un paquet Self-Draw-State (SDS) comme un
RingBuffer (RB). Ainsi, en soumettant un faux CP_SMMU_TABLE_UPDATE dans un bloc SDS depuis l'espace utilisateur,
il est possible d'écraser le TTBR0 du GPU, faisant pointer la table de pages du GPU vers une page physique arbitraire — dès lors, le GPU
peut lire et écrire n'importe quelle mémoire physique.stabilize_rw, le mapping est consolidé en une zone auto-mappée de 2 Mo,
permettant des lectures rapides en masse (fast_pread_bytes, etc.).selinux_state.enforcing est mis à zéro dans la mémoire physique.
Ensuite, l'image du noyau est extraite depuis l'adresse physique fixe 0xA8000000 (limite par défaut de 43 Mo) —
SM8475 n'a pas de KASLR physique — et les structures kallsyms sont analysées directement depuis le dump brut
(détection automatique du boutisme), de sorte que le KASLR virtuel n'a pas non plus d'effet.prepare_kernel_cred(0) →
commit_creds(), et désactivation de seccomp) est utilisé pour patcher __do_sys_capset. Le processus enfant issu du fork
appelle capset() → devient uid 0 → restaure le code noyau écrasé → le processus enfant réexécute la commande que vous spécifiez
dans le domaine u:r:shell:s0 (par défaut sh). Le code noyau finit par être
identique octet pour octet à ce qu'il était avant l'exécution.| Modèle | vivo V2301A (iQOO Neo8, nom de code PD2301, carte mère taro) |
| SoC | SM8475 (Snapdragon 8+ Gen 1) + Adreno 730 |
| Android | 14 (UP1A.231005.007, SDK 34, qssi-user) |
| Noyau | 5.10.198-gki-gfb2f5774872c |
| SELinux | Enforcing (désactivé à l'exécution par cet outil) |
Les informations complètes sur l'appareil se trouvent dans 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
Remarque : cheese.c fait un #include de kallsyms_lookup.c et adrenaline.h,
lors de la compilation, les trois fichiers doivent être placés dans le même répertoire.
N'importe quel Android NDK relativement récent (r25+) convient, exemple :
# 静态链接(自包含、任意 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 的 shell,且本会话的 SELinux 已被关闭。进程在完成提权后会重新执行 argv[1..](缺省为 sh)。每次运行会有一段倒计时("pte wait 3 second")和 43 MB 内核读取进度("Read X / 43 MB")。

| Variable | Rôle |
|---|---|
CHEESE_PHYADDR=<phys> | Force l'adresse physique de base du noyau (contourne la table de détection intégrée gPhyAddrs). |
CHEESE_ATTEMPT=<n> | Utilise gPhyAddrs[n] au lieu de gPhyAddrs[0] ; après un échec d'initialisation du GPU, maybe_retry incrémente automatiquement la tentative. |
CHEESE_SWAPPER_PG_DIR_OFF=<off> | Contourne le scan de swapper_pg_dir et utilise directement cet offset absolu. |
CHEESE_READ_FULL_KERNEL=1 | Lit l'image complète du noyau (la limite de lecture par défaut est DEFAULT_KERNEL_SIZE_MB = 43 MB). |
CHEESE_KALLSYMS_MAX_MB=<MB> | Remplace la limite de lecture de kallsyms. |
CHEESE_FORCE_MANUAL_PATCHFINDER=1 | Force l'utilisation du patchfinder manuel en secours (init_cred, prepare_kernel_cred). |
CHEESE_SKIP_GPU=1 | Ignore la phase de lecture/écriture GPU (uniquement pour le débogage). |
CHEESE_NO_RETRY=1 | Quitte directement après un échec, sans réessayer avec une autre adresse. |
En raison du mécanisme particulier des modèles vivo, il est nécessaire de le désactiver sur l'iQOO Neo8 pour maintenir la stabilité des permissions root (le principe précis n'est pas détaillé ici. Il peut ne pas être universel pour d'autres modèles vivo et versions de noyau ; il faut extraire vr.ko soi-même puis l'analyser par rétro-ingénierie). Avant d'exécuter les opérations suivantes, assurez-vous d'abord que la session shell actuelle a obtenu les permissions 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
Ensuite, si un redémarrage à froid du téléphone fait perdre les permissions root, il suffit de relancer l'exploit puis d'exécuter le jailbreak
$(find /data/app -type f -name "libksud.so" | grep resukisu) late-load --kmi android12-5.10
Les constantes liées à l'appareil se trouvent en haut de source/cheese.c :
KERNEL_PHYS_BASE — adresse physique de base du noyau (par défaut 0xA8000000, SM8475)IDMAP_PG_DIR_OFFSET — décalage de idmap_pg_dir (par défaut 0x245a000)selinux_state_offset — décalage utilisé pour localiser selinux_state (par défaut
0x729030, adresse physique réelle = adresse physique de idmap_pg_dir + ce décalage)gPhyAddrs[] — adresses physiques de base candidates essayées successivementDEFAULT_KERNEL_SIZE_MB — valeur de repli / limite supérieure pour la lecture du noyauPrérequis : GPU de la série Adreno A730/A7xx (firmware affecté) et système de l'appareil sans le correctif de sécurité publié par Qualcomm en juin 2025, noyau dont les kallsyms sont analysables dans le dump physique, et absence de KASLR physique.