
Escalade de privilèges du noyau en mémoire pour Lenovo Legion Y700 2023 (TB320FC) exploitant CVE-2025-21479, une faille SMMU du GPU Qualcomm Adreno, avec la gestion root ReSukiSU.
English | 简体中文
Élévation de privilèges du noyau en mémoire pour le Lenovo Legion Y700 2023 (TB320FC), exploitant CVE-2025-21479 (vulnérabilité SMMU du GPU Qualcomm Adreno), avec une gestion complète du root fournie par ReSukiSU.
Pas de déverrouillage du bootloader. Pas de flash. Pas de PC requis pour l'activation.
⚠️ Pour la recherche en sécurité autorisée sur des appareils que vous possédez. Voir Avertissement.
Tous les offsets et comportements de ce projet sont ajustés pour l'appareil suivant. Ne vous attendez pas à ce qu'il fonctionne sur d'autres modèles/ROMs sans réajustement (voir exploit/device_info.txt).
| Modèle | Lenovo Legion Y700 2023 (TB320FC) / TB320FC_PRC |
| SoC | Qualcomm SM8475 (Snapdragon 8+ Gen 1, Adreno 730) |
| Système | ZUXOS 1.1.350 / Android 15 (SDK 35) |
| Build | AQ3A.240812.002 (TB320FC_CN_OPEN_USER_Q00031.0_V_ZUXOS_1.1.350_ST_250418) |
| Noyau | 5.10.209-android12-9-gef44381c3e04-ab50 |
| Correctif de sécurité | 2025-03-05 |
| Bootloader | Verrouillé (ce projet ne le déverrouille pas) |
Vérifié fonctionnel en date de 2026-09 sur le firmware ci-dessus.
| Capacité | Implémentation |
|---|---|
| Élévation de privilèges | exploit cheese : bug KGSL SMMU → lecture/écriture physique arbitraire via le GPU → root en mémoire (uid 0 + toutes les capacités) |
| Gestion du root | ReSukiSU (fork de KernelSU) en mode late-load charge kernelsu.ko ; su fourni par un hook dans le noyau (u:r:ksu:s0) |
| SELinux | Restauré en Enforcing après activation (les règles de politique ReSukiSU restent appliquées) |
| UX en un geste | APK RootActivator avec exploit + ksud intégrés ; un seul geste après le démarrage |
| Auto-récupération (optionnelle) | Chaîne d'auto-réparation déclenchée au démarrage : déclencheur adaptatif conditionné par la charge → cheese → pipeline root → hosts/Vector optionnels. Désactivée par défaut (com.poc.roottool.CONFIG) |
| Modules Xposed | Pris en charge via NeoZygisk (injection ptrace du zygote) + Vector |
| Persistance | Aucune par conception (en mémoire) : réactiver après chaque redémarrage (~3-4 min ; ou activer la chaîne d'auto-récupération) |
| RootActivator (activé) | ReSukiSU (fonctionnel, 2 modules) |
|---|---|
![]() | ![]() |
Gauche : RootActivator après activation réussie — SELinux Enforcing, kernelsu chargé, su disponible.
Droite : gestionnaire ReSukiSU — mode LKM fonctionnel avec 2 modules (NeoZygisk + Vector).
RootActivator APK
│
├─ libcheese.so ── KGSL SMMU exploit (CVE-2025-21479)
│ 1. Adreno 730 microcode access-check flaw (SDS packet mistaken for RingBuffer)
│ 2. Fake CP_SMMU_TABLE_UPDATE overwrites GPU TTBR0 → arbitrary physical R/W
│ 3. Zero selinux_state.enforcing; dump kernel from fixed PA 0xA8000000,
│ parse kallsyms from the raw image (SM8475 has no physical KASLR)
│ 4. Patch __do_sys_capset with an escalation shellcode
│ (prepare_kernel_cred(0) + commit_creds + clear TIF_SECCOMP);
│ forked child calls capset() → uid 0 + full caps
│
└─ libksud.so (ReSukiSU) ── late-load mode
1. kernelsu.ko loaded from ksud's embedded assets with manual relocation
(does not rely on kernel symbol exports)
2. install → /data/adb/ksu (ksud/busybox/bootctl)
3. su channel online: /system/bin/su → kernel hook redirect → u:r:ksu:s0
4. setenforce 1 — Enforcing restored, policy rules already injected by the ko
Points d'ingénierie notables
insmod kernelsu.ko échoue. Le chargement tardif de ReSukiSU résout les symboles lui-même et se charge correctement.Compilez depuis les sources (voir Compilation) ou récupérez l'APK depuis la page GitHub Releases (non stocké dans le dépôt).
Téléchargez depuis ReSukiSU Releases et installez l'APK du gestionnaire.
su -c 'sh /data/adb/modules/zygisksu/post-fs-data.sh'
Le dépôt contient le PoC (l'exploit) et son activateur en un clic. Les couches d'appareil personnalisées (scripts de débloat, module privacy-hosts, outillage de portée Xposed, assistants de bring-up) sont conservées hors de l'arbre dans une archive privée séparée — elles ne font délibérément pas partie de ce dépôt. Détails : docs/ARCHITECTURE.md.