
Kit de ferramentas de root para TCL 50C721 (RTD1319 / Mali-G31) — cadeia de exploração autónoma CVE-2022-22706
Cadeia completa de exploit de root e toolkit pós-root para root vinculado (tethered), SELinux Permissive, bloqueio de anúncios, debloat e backup automatizado em um firmware de TCL Android TV. Trata-se de pesquisa e ferramental específicos de firmware, não de uma ferramenta universal de root para TCL nem de um instalador suportado.
| Item | Unidade de teste registrada |
|---|---|
| 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 | 32-bit ARMv7 |
| Patch de segurança reportado | 2024-03-05 |
| Resultado histórico | Shell ADB com uid=0; SELinux Permissive |
Apenas esta combinação de modelo/firmware possui um resultado bem-sucedido registrado. A identificação exata do SoC e a revisão do driver Mali são inconsistentes nos registros originais; consulte limites de compatibilidade. Nenhum teste de root novo foi realizado durante a preparação desta versão do código-fonte.
O binário autônomo de root (auto_root.c) obtém uid=0 a partir de um contexto de app sem privilégios em menos de 2 segundos:
Fase 1 — CVE-2022-22706 (escrita no page cache da GPU Mali): Importa um mapeamento MAP_SHARED da página __cxa_atexit da libc.so como buffer de usuário da GPU via KBASE_IOCTL_MEM_IMPORT. Usa mremap(MREMAP_FIXED) para substituir o mapeamento do arquivo. Escreve shellcode Thumb-2 de 112 bytes sobre __cxa_atexit no page cache (arquivo em disco inalterado — protegido por dm-verity).
Fase 3 — Gatilho natural: Todo novo processo C++ chama __cxa_atexit() durante a inicialização do CRT, executando o shellcode. Um domínio privilegiado (audioserver, rtkm_scene) mapeia a página física 0x1DE7000 via /dev/rtkmem e escreve selinux_state.enforcing = 0.
Fase 4a — Modificação direta de credenciais: Com o SELinux em Permissive, percorre a lista encadeada de task_struct do kernel por meio de leituras de memória física via /dev/rtkmem. Localiza nosso processo comparando comm[], sobrescreve a struct cred com uid=0 e capacidades completas a partir de init_cred. Limpa TIF_SECCOMP para contornar o filtro seccomp BPF do zygote.
Fase 4b — Endurecimento do sistema: Faz bind-mount de hosts de bloqueio de anúncios, remove regras iptables que bloqueiam IPs de telemetria, desativa 28 pacotes de bloatware, concede APP_AUTO_START para persistência no boot, desativa o shellcode e reativa o SELinux para Enforcing.
Os dois programas autônomos (root_cve22706.c, libc_rtkmem_patch2.c) implementam a mesma primitiva de escrita no page cache da CVE-2022-22706 como estágios separados de root vinculado, úteis para root manual via ADB e para compreender a primitiva do exploit.
scripts/root.sh — Automação ADB: conecta à TV, executa ambos os estágios autônomos, verifica o estado de root + SELinux.scripts/post_root.sh — Hook pós-root chamado pelo auto_root após o endurecimento. Cria backups completos do dispositivo: APKs instalados por sideload, dados de apps, configuração de WiFi, todas as configurações, listas de pacotes. Remove automaticamente, mantendo apenas os 5 backups mais recentes.Nenhum APK ou projeto de aplicação APK reproduzível está incluído; não há aqui uma versão de instalação única com boot automático. O binário autônomo de root foi projetado para ser chamado a partir do código nativo de um APK, mas o wrapper APK não faz parte desta versão.
# 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>
Use apenas em hardware que você possui ou está explicitamente autorizado a avaliar. Revise todos os arquivos C e cada suposição específica de firmware primeiro. Preserve os dados e obtenha de forma independente uma imagem de recuperação compatível conhecida e o procedimento correspondente. Não exponha o ADB a uma rede não confiável. A reinicialização remove os patches voláteis (page-cache, bind mounts, iptables), mas as desativações de pacotes e APP_AUTO_START persistem.
Não grave imagens de boot ou vbmeta modificadas com base neste projeto. Duas tentativas históricas resultaram em bootloop; nem um método de root persistente nem uma garantia universal de recuperação foram estabelecidos.
MIT para todo o código original. O trecho do kernel (kernel/mem.c) mantém sua licença GPL-2.0 e avisos de copyright. Consulte LICENSE e provenance para atribuição e referências upstream.