
TCL 50C721 (RTD1319 / Mali-G31) 루트 툴킷 — 자율 CVE-2022-22706 익스플로잇 체인
하나의 TCL Android TV 펌웨어에서 테더링 루트, SELinux Permissive, 광고 차단, 디블로트 및 자동 백업을 위한 전체 루트 익스플로잇 체인 및 포스트 루트 툴킷입니다. 이는 펌웨어 특정 리서치 및 툴링이며, 범용 TCL 루트 도구나 지원되는 설치 프로그램이 아닙니다.
| 항목 | 기록된 테스트 유닛 |
|---|---|
| TV | TCL QLED 50C721 / BeyondTV6 |
| 펌웨어 | V8-R51MT02-LF1V903, 빌드 AR10 |
| Android / 커널 | Android 11 / 4.14.198+ |
| SoC / GPU | Realtek RTD1319 / Mali-G31 (Bifrost, kbase r28p0) |
| 사용자 공간 | 32비트 ARMv7 |
| 보고된 보안 패치 | 2024-03-05 |
| 과거 결과 | uid=0인 ADB 셸; SELinux Permissive |
이 모델/펌웨어 조합만이 성공 결과가 기록되어 있습니다. 정확한 SoC 식별과 Mali 드라이버 리비전은 원본 기록에서 일관되지 않습니다. 호환성 제한을 참조하세요. 이 소스 릴리스를 준비하는 동안 새로운 루팅 테스트는 수행되지 않았습니다.
자율 루트 바이너리(auto_root.c)는 권한 없는 앱 컨텍스트에서 2초 이내에 uid=0을 달성합니다:
1단계 — CVE-2022-22706 (Mali GPU 페이지 캐시 쓰기): KBASE_IOCTL_MEM_IMPORT를 통해 libc.so의 __cxa_atexit 페이지에 대한 MAP_SHARED 매핑을 GPU 사용자 버퍼로 가져옵니다. mremap(MREMAP_FIXED)를 사용하여 파일 매핑을 교체합니다. 페이지 캐시의 __cxa_atexit 위에 112바이트 Thumb-2 셸코드를 씁니다 (디스크의 파일은 수정되지 않음 — dm-verity로 보호됨).
3단계 — 자연 트리거: 모든 새로운 C++ 프로세스는 CRT 초기화 중에 __cxa_atexit()를 호출하여 셸코드를 실행합니다. 권한 있는 도메인(audioserver, rtkm_scene)이 /dev/rtkmem을 통해 물리 페이지 0x1DE7000을 매핑하고 selinux_state.enforcing = 0을 씁니다.
4a단계 — 직접 자격 증명 수정: SELinux Permissive 상태에서 /dev/rtkmem을 통한 물리 메모리 읽기로 커널 task_struct 연결 리스트를 순회합니다. comm[]을 일치시켜 우리 프로세스를 찾고, cred 구조체를 uid=0 및 init_cred의 전체 권한으로 덮어씁니다. zygote의 BPF seccomp 필터를 우회하기 위해 TIF_SECCOMP를 지웁니다.
4b단계 — 시스템 강화: 광고 차단 hosts를 바인드 마운트하고, 텔레메트리 IP를 차단하는 iptables 규칙을 삭제하고, 28개의 블로트웨어 패키지를 비활성화하고, 부팅 지속성을 위해 APP_AUTO_START를 부여하고, 셸코드를 비활성화하고, SELinux를 Enforcing으로 다시 강제합니다.
두 개의 독립 실행형 프로그램(root_cve22706.c, libc_rtkmem_patch2.c)은 동일한 CVE-2022-22706 페이지 캐시 쓰기 프리미티브를 별도의 테더링 루트 단계로 구현하며, 수동 ADB 루팅 및 익스플로잇 원리의 이해에 유용합니다.
scripts/root.sh — ADB 자동화: TV에 연결하고, 두 독립 실행형 단계를 실행하고, 루트 + SELinux 상태를 검증합니다.scripts/post_root.sh — 강화 후 auto_root가 호출하는 포스트 루트 훅. 전체 기기 백업을 생성합니다: 사이드로드된 APK, 앱 데이터, WiFi 구성, 모든 설정, 패키지 목록. 최근 5개 백업으로 자동 정리됩니다.APK 또는 재현 가능한 APK 애플리케이션 프로젝트는 포함되지 않습니다. 여기에는 한 번 설치하면 자동 부팅되는 릴리스가 없습니다. 자율 루트 바이너리는 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 이미지를 플래싱하지 마십시오. 과거 두 차례의 시도에서 부트루프가 발생했으며, 영구 루트 방식이나 범용 복구 보장은 확립되지 않았습니다.
모든 원본 코드는 MIT입니다. 커널 발췌본(kernel/mem.c)은 GPL-2.0 라이선스와 저작권 고지를 유지합니다. 저작자 표시 및 업스트림 참조는 LICENSE와 provenance를 참조하십시오.