
Boîte à outils de root pour TCL 50C721 (RTD1319 / Mali-G31) — chaîne d'exploitation autonome CVE-2022-22706
Chaîne d'exploitation root complète et boîte à outils post-root pour le root attaché (tethered root), SELinux Permissive, le blocage des publicités, le débloat et la sauvegarde automatisée sur un firmware TCL Android TV. Il s'agit de recherche et d'outillage spécifiques à un firmware, et non d'un outil de root TCL universel ni d'un installateur pris en charge.
| Élément | Unité de test enregistrée |
|---|---|
| TV | TCL QLED 50C721 / BeyondTV6 |
| Firmware | V8-R51MT02-LF1V903, build AR10 |
| Android / noyau | Android 11 / 4.14.198+ |
| SoC / GPU | Realtek RTD1319 / Mali-G31 (Bifrost, kbase r28p0) |
| Espace utilisateur | ARMv7 32 bits |
| Correctif de sécurité signalé | 2024-03-05 |
| Résultat historique | Shell ADB avec uid=0 ; SELinux Permissive |
Seule cette combinaison modèle/firmware dispose d'un résultat réussi enregistré. L'identification exacte du SoC et la révision du pilote Mali sont incohérentes dans les enregistrements d'origine ; voir limites de compatibilité. Aucun nouveau test de root n'a été effectué lors de la préparation de cette version source.
Le binaire root autonome (auto_root.c) obtient uid=0 depuis un contexte d'application non privilégié en moins de 2 secondes :
Phase 1 — CVE-2022-22706 (écriture dans le page-cache du GPU Mali) : importe un mapping MAP_SHARED de la page __cxa_atexit de libc.so en tant que tampon utilisateur GPU via KBASE_IOCTL_MEM_IMPORT. Utilise mremap(MREMAP_FIXED) pour remplacer le mapping de fichier. Écrit 112 octets de shellcode Thumb-2 par-dessus __cxa_atexit dans le page-cache (fichier sur disque non modifié — protégé par dm-verity).
Phase 3 — Déclenchement naturel : chaque nouveau processus C++ appelle __cxa_atexit() lors de l'initialisation CRT, exécutant ainsi le shellcode. Un domaine privilégié (audioserver, rtkm_scene) mappe la page physique 0x1DE7000 via /dev/rtkmem et écrit selinux_state.enforcing = 0.
Phase 4a — Modification directe des identifiants : avec SELinux Permissive, parcourt la liste chaînée task_struct du noyau via des lectures de mémoire physique à travers /dev/rtkmem. Trouve notre processus en faisant correspondre comm[], écrase la structure cred avec uid=0 et les capacités complètes issues de init_cred. Efface TIF_SECCOMP pour contourner le filtre seccomp BPF du zygote.
Phase 4b — Durcissement du système : monte par bind-mount des fichiers hosts de blocage des publicités, supprime les règles iptables bloquant les IP de télémétrie, désactive 28 paquets bloatware, accorde APP_AUTO_START pour la persistance au démarrage, désactive le shellcode, rétablit SELinux en mode Enforcing.
Les deux programmes autonomes (root_cve22706.c, libc_rtkmem_patch2.c) implémentent la même primitive d'écriture dans le page-cache CVE-2022-22706 en tant qu'étapes de root attaché distinctes, utiles pour le root manuel via ADB et pour comprendre la primitive d'exploitation.
scripts/root.sh — Automatisation ADB : se connecte à la TV, exécute les deux étapes autonomes, vérifie l'état root + SELinux.scripts/post_root.sh — Hook post-root appelé par auto_root après le durcissement. Crée des sauvegardes complètes de l'appareil : APK sideloadés, données d'application, configuration WiFi, tous les paramètres, listes de paquets. Élagage automatique vers les 5 sauvegardes les plus récentes.Aucun APK ni projet d'application APK reproductible n'est inclus ; il n'y a pas ici de version installable une fois avec démarrage automatique. Le binaire root autonome est conçu pour être appelé depuis le code natif d'un APK, mais l'enveloppe APK ne fait pas partie de cette version.
# Build (requires Android NDK)
cd exploit && make
# Push to TV
adb connect <TV_IP>:5555
adb push bin/auto_root /data/local/tmp/
adb push bin/root_cve22706 /data/local/tmp/
adb push bin/libc_rtkmem_patch2 /data/local/tmp/
# Option A: Run the autonomous chain (includes hardening + backup)
adb shell /data/local/tmp/auto_root
# Option B: Manual two-stage root via script
bash scripts/root.sh <TV_IP>
À utiliser uniquement sur du matériel que vous possédez ou que vous êtes explicitement autorisé à évaluer. Examinez d'abord tous les fichiers C et chaque hypothèse spécifique au firmware. Préservez les données et obtenez indépendamment une image de récupération compatible connue ainsi que la procédure associée. N'exposez pas ADB à un réseau non fiable. Le redémarrage supprime les correctifs volatils (page-cache, montages bind, iptables), mais les désactivations de paquets et APP_AUTO_START persistent.
Ne flashez pas d'images boot ou vbmeta corrigées basées sur ce projet. Deux tentatives historiques ont provoqué des bootloops ; ni une méthode de root persistant ni une garantie de récupération universelle n'ont été établies.
MIT pour tout le code original. L'extrait du noyau (kernel/mem.c) conserve sa licence GPL-2.0 et ses mentions de copyright. Voir LICENSE et provenance pour l'attribution et les références amont.