
Toolkit di root per TCL 50C721 (RTD1319 / Mali-G31) — catena di exploit autonoma per CVE-2022-22706
Catena completa di exploit per il root e toolkit post-root per root vincolato (tethered), SELinux Permissive, blocco degli annunci, debloat e backup automatizzato su un firmware TCL Android TV. Si tratta di ricerca e strumenti specifici per un firmware, non di uno strumento universale per il root di TCL né di un installer supportato.
| Voce | Unità di test registrata |
|---|---|
| TV | TCL QLED 50C721 / BeyondTV6 |
| Firmware | V8-R51MT02-LF1V903, build AR10 |
| Android / kernel | Android 11 / 4.14.198+ |
| SoC / GPU | Realtek RTD1319 / Mali-G31 (Bifrost, kbase r28p0) |
| Userspace | ARMv7 a 32 bit |
| Patch di sicurezza dichiarata | 2024-03-05 |
| Risultato storico | Shell ADB con uid=0; SELinux Permissive |
Solo questa combinazione modello/firmware ha un risultato positivo registrato. L'identificazione esatta del SoC e la revisione del driver Mali sono incoerenti nei documenti originali; vedi limiti di compatibilità. Durante la preparazione di questa release del codice sorgente non è stato eseguito alcun nuovo test di rooting.
Il binario autonomo per il root (auto_root.c) ottiene uid=0 da un contesto applicativo non privilegiato in meno di 2 secondi:
Fase 1 — CVE-2022-22706 (scrittura nella page cache della GPU Mali): importa un mapping MAP_SHARED della pagina __cxa_atexit di libc.so come buffer utente GPU tramite KBASE_IOCTL_MEM_IMPORT. Usa mremap(MREMAP_FIXED) per sostituire il mapping del file. Scrive 112 byte di shellcode Thumb-2 sopra __cxa_atexit nella page cache (il file su disco resta inalterato — protetto da dm-verity).
Fase 3 — Trigger naturale: ogni nuovo processo C++ chiama __cxa_atexit() durante l'inizializzazione della CRT, eseguendo lo shellcode. Un dominio privilegiato (audioserver, rtkm_scene) mappa la pagina fisica 0x1DE7000 tramite /dev/rtkmem e scrive selinux_state.enforcing = 0.
Fase 4a — Modifica diretta delle credenziali: con SELinux Permissive, percorre la lista concatenata dei task_struct del kernel tramite letture della memoria fisica attraverso /dev/rtkmem. Individua il nostro processo confrontando comm[], sovrascrive la struct cred con uid=0 e le capability complete da init_cred. Cancella TIF_SECCOMP per aggirare il filtro seccomp BPF dello zygote.
Fase 4b — Hardening del sistema: esegue il bind-mount degli hosts per il blocco degli annunci, rimuove le regole iptables che bloccano gli IP di telemetria, disabilita 28 pacchetti bloatware, concede APP_AUTO_START per la persistenza all'avvio, disattiva lo shellcode e riporta SELinux a Enforcing.
I due programmi autonomi (root_cve22706.c, libc_rtkmem_patch2.c) implementano la stessa primitiva di scrittura nella page cache di CVE-2022-22706 come fasi separate di root vincolato, utili per il rooting manuale via ADB e per comprendere la primitiva dell'exploit.
scripts/root.sh — Automazione ADB: si connette alla TV, esegue entrambe le fasi autonome, verifica lo stato di root e di SELinux.scripts/post_root.sh — Hook post-root richiamato da auto_root dopo l'hardening. Crea backup completi del dispositivo: APK sideloaded, dati delle app, configurazione WiFi, tutte le impostazioni, elenchi dei pacchetti. Mantiene automaticamente solo i 5 backup più recenti.Non è incluso alcun APK né progetto applicativo APK riproducibile; qui non esiste una release installa-una-volta con avvio automatico. Il binario autonomo per il root è progettato per essere richiamato dal codice nativo di un APK, ma il wrapper APK non fa parte di questa release.
# 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>
Utilizzare solo su hardware di propria proprietà o per il quale si è esplicitamente autorizzati a effettuare valutazioni. Rivedere prima tutti i file C e ogni assunzione specifica del firmware. Preservare i dati e ottenere in modo indipendente un'immagine di ripristino e una procedura di ripristino note e corrispondenti. Non esporre ADB a una rete non attendibile. Il riavvio rimuove le patch volatili (page-cache, bind mount, iptables), ma le disabilitazioni dei pacchetti e APP_AUTO_START persistono.
Non eseguire il flash di immagini boot o vbmeta patchate basate su questo progetto. Due tentativi storici hanno causato bootloop; non è stato stabilito né un metodo di root persistente né una garanzia di ripristino universale.
MIT per tutto il codice originale. L'estratto del kernel (kernel/mem.c) mantiene la sua licenza GPL-2.0 e le note di copyright. Vedere LICENSE e provenance per l'attribuzione e i riferimenti upstream.