
Набор инструментов для получения root на TCL 50C721 (RTD1319 / Mali-G31) — автономная цепочка эксплуатации CVE-2022-22706
Полная цепочка эксплойта для получения root и набор инструментов для работы после получения root для tethered root, SELinux Permissive, блокировки рекламы, удаления предустановленного ПО и автоматического резервного копирования на одной прошивке TCL Android TV. Это исследование и инструментарий, специфичные для конкретной прошивки, а не универсальный инструмент для получения root на TCL и не поддерживаемый установщик.
| Пункт | Зафиксированный тестовый экземпляр |
|---|---|
| Телевизор | TCL QLED 50C721 / BeyondTV6 |
| Прошивка | V8-R51MT02-LF1V903, сборка AR10 |
| Android / ядро | Android 11 / 4.14.198+ |
| SoC / GPU | Realtek RTD1319 / Mali-G31 (Bifrost, kbase r28p0) |
| Userspace | 32-битный ARMv7 |
| Заявленный патч безопасности | 2024-03-05 |
| Исторический результат | ADB shell с uid=0; SELinux Permissive |
Зафиксированный успешный результат есть только для этой комбинации модели и прошивки. Точная идентификация SoC и ревизия драйвера Mali в исходных записях противоречивы; см. ограничения совместимости. При подготовке этого исходного релиза свежий тест получения root не проводился.
Автономный бинарник для получения root (auto_root.c) достигает uid=0 из непривилегированного контекста приложения менее чем за 2 секунды:
Фаза 1 — CVE-2022-22706 (запись в page cache через Mali GPU): импортирует MAP_SHARED-отображение страницы __cxa_atexit из libc.so как пользовательский буфер GPU через KBASE_IOCTL_MEM_IMPORT. Использует mremap(MREMAP_FIXED) для замены файлового отображения. Записывает 112-байтный Thumb-2 шелл-код поверх __cxa_atexit в page cache (файл на диске не изменяется — защищён dm-verity).
Фаза 3 — Естественный триггер: каждый новый C++ процесс вызывает __cxa_atexit() во время инициализации CRT, исполняя шелл-код. Привилегированный домен (audioserver, rtkm_scene) отображает физическую страницу 0x1DE7000 через /dev/rtkmem и записывает selinux_state.enforcing = 0.
Фаза 4a — Прямое изменение учётных данных: при SELinux Permissive обходит связный список task_struct ядра через чтение физической памяти посредством /dev/rtkmem. Находит наш процесс по совпадению comm[], перезаписывает структуру cred значениями uid=0 и полными capabilities из init_cred. Очищает TIF_SECCOMP, чтобы обойти BPF-фильтр seccomp в zygote.
Фаза 4b — Усиление системы: bind-монтирует hosts-файл для блокировки рекламы, удаляет правила iptables, блокирующие IP-адреса телеметрии, отключает 28 пакетов предустановленного ПО, предоставляет APP_AUTO_START для сохранения после перезагрузки, деактивирует шелл-код, возвращает SELinux в режим Enforcing.
Две отдельные программы (root_cve22706.c, libc_rtkmem_patch2.c) реализуют тот же примитив записи в page cache через CVE-2022-22706 в виде отдельных этапов tethered root, полезных для ручного получения root через ADB и понимания примитива эксплойта.
scripts/root.sh — автоматизация ADB: подключается к телевизору, запускает оба отдельных этапа, проверяет состояние root и SELinux.scripts/post_root.sh — хук после получения root, вызываемый auto_root после усиления системы. Создаёт полные резервные копии устройства: установленные вручную APK, данные приложений, конфигурацию WiFi, все настройки, списки пакетов. Автоматически оставляет только 5 последних резервных копий.APK или воспроизводимый проект APK-приложения не включён; здесь нет релиза с установкой в один клик и автоматической загрузкой. Автономный бинарник для получения root предназначен для вызова из нативного кода APK, но обёртка APK не входит в этот релиз.
# 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>
Используйте только на оборудовании, которым вы владеете или которое вам явно разрешено проверять. Сначала изучите все файлы C и каждое предположение, специфичное для прошивки. Сохраните данные и независимо получите заведомо подходящий образ восстановления и процедуру. Не открывайте ADB для недоверенной сети. Перезагрузка удаляет энергозависимые патчи (page-cache, bind mounts, iptables), но отключения пакетов и APP_AUTO_START сохраняются.
Не прошивайте пропатченные образы boot или vbmeta на основе этого проекта. Две исторические попытки привели к bootloop; ни метод постоянного root, ни универсальная гарантия восстановления не были установлены.
MIT для всего оригинального кода. Фрагмент ядра (kernel/mem.c) сохраняет свою лицензию GPL-2.0 и уведомления об авторских правах. См. LICENSE и provenance для указания авторства и ссылок на исходные материалы.