
Toshiba/Amazon Fire TV(hazel)용 펌웨어 특정 임시 루트 익스플로잇으로, CVE-2026-43499를 사용합니다. ARM32 futex-PI UAF, 커널 주소 누출, mm_struct 재확보, 자격 증명 패치를 구현하여 ADB를 통해 UID 0을 획득합니다.
Toshiba/Amazon hazel Fire TV 플랫폼용 임시 루트 익스플로잇으로, CVE-2026-43499 기반입니다.
현재 익스플로잇은 다음 환경에서 테스트되었습니다:
| 기기 | Toshiba Fire TV (hazel) |
| Fire OS 빌드 | PS7716.5665N |
| 커널 | Linux 4.9.113 |
| 제품 모델 | AFTHA004 (C350) |
[!WARNING] 이 익스플로잇은 펌웨어 전용입니다. 커널 주소, 구조체 오프셋 및 재확보(reclaim) 체인의 일부는
PS7716.5665N에 맞게 보정되어 있습니다.포팅 또는 재보정 없이 다른 펌웨어나 기기에서 현재 빌드를 실행하지 마십시오.
힙 재확보 실패 시 패닉이 발생하여 TV가 재부팅될 수 있습니다. 루트는 임시적이며 재부팅 후 사라집니다. TV가 멈추면 전원을 껐다 켜면 됩니다.
이 익스플로잇은 CVE-2026-43499를 사용하여 일반 ADB 셸 환경에서 임시 UID 0을 획득합니다.
익스플로잇 체인은 다음을 포함합니다:
mm_struct 교차 캐시 재확보성공적으로 실행된 후, 익스플로잇은 루트 경로에 필요한 커널 객체를 유지하고 로컬 명령 데몬을 시작합니다.
SELinux는 Enforcing 상태로 유지됩니다. 루트 데몬을 통해 실행되는 명령은 shell SELinux 도메인과 이 펌웨어에서 사용 가능한 capability bounding set을 유지합니다.
hazel_root.c 메인 익스플로잇, 커널 읽기/쓰기 단계, 자격 증명 패치 및 루트 명령 클라이언트/서버hazel_reclaim.h 커널 주소 누출 및 mm_struct 교차 캐시 재확보아래 예시는 Linux 환경과 adb가 $PATH에 있다고 가정합니다.
NDK를 Android NDK r27d 디렉터리로 설정합니다:
export NDK=/path/to/android-ndk-r27d
그런 다음 컴파일합니다:
"$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/clang" \
--target=armv7a-linux-androideabi28 \
-O2 -g0 -Wall -Wextra -Wpedantic -fPIE -pie \
hazel_root.c -o hazel_root \
-pthread
ADB를 사용하여 TV에 연결합니다.
네트워크 ADB를 사용하는 경우:
adb connect <TV_IP>:5555
익스플로잇을 푸시합니다:
adb push hazel_root /data/local/tmp/hazel_root
adb shell chmod 755 /data/local/tmp/hazel_root
깨끗한 부팅 상태에서 시작합니다:
adb shell 'cd /data/local/tmp && ./hazel_root'
성공적인 실행은 다음과 유사한 출력으로 끝납니다:
[root] uid=0 euid=0 gid=0
[ROOT] uid=0 daemon pid=... socket=@hazel_root
재확보는 확률적입니다. 실패한 시도는 깨끗하게 실패하거나 패닉이 발생하여 TV가 재부팅될 수 있습니다.
TV가 재부팅되면 정상적으로 부팅되도록 두고 다시 시도하십시오.
익스플로잇이 성공하면 다른 복사본을 실행하지 마십시오. 익스플로잇 프로세스를 계속 실행 상태로 두십시오. 임시 루트 경로에 사용되는 커널 객체를 유지하기 때문입니다.
동일한 바이너리가 루트 데몬의 클라이언트 역할도 합니다:
adb shell 'cd /data/local/tmp && ./hazel_root --client id'
예를 들어:
adb shell 'cd /data/local/tmp && ./hazel_root --client getenforce'
adb shell 'cd /data/local/tmp && ./hazel_root --client cat /proc/self/status'
adb shell 'cd /data/local/tmp && ./hazel_root --client "id; uname -a"'
성공적인 루트 명령은 다음을 보고해야 합니다:
uid=0(root) gid=0(root) context=u:r:shell:s0
UID 0이 SELinux를 우회하지는 않는다는 점에 유의하십시오. SELinux는 Enforcing 상태로 유지됩니다.
disable_ota.sh를 푸시하고 루트 데몬을 통해 실행합니다:
adb push disable_ota.sh /data/local/tmp/disable_ota.sh
adb shell chmod 755 /data/local/tmp/disable_ota.sh
adb shell 'cd /data/local/tmp && ./hazel_root --client "sh /data/local/tmp/disable_ota.sh"'
이 스크립트는 Fire OS OTA 패키지 두 개를 모두 비활성화하고, 대기 중인 업데이터 상태를 지우며, 결과적인 Package Manager 상태를 검증합니다. TV를 재부팅하지는 않습니다.
disable_amazon_services.sh는 Arcus 원격 구성 프록시, ADEP 애플리케이션 차단 서비스, 자동 콘텐츠 인식(ACR) 및 테스트된 Hazel 펌웨어에 존재하는 전용 Amazon 메트릭 패키지를 비활성화합니다. ACR은 비활성화되고 저장된 데이터는 삭제되지만, 읽기 전용 시스템 APK는 삭제되지 않아 작업을 되돌릴 수 있습니다. 이 스크립트는 CrashManager나 저수준 로깅 패키지는 비활성화하지 않으므로, 익스플로잇 개발 또는 문제 해결 중에도 커널 패닉 및 Dropbox 진단 기능을 계속 사용할 수 있습니다.
스크립트를 푸시하고 루트 데몬을 통해 실행합니다:
adb push disable_amazon_services.sh /data/local/tmp/disable_amazon_services.sh
adb shell chmod 755 /data/local/tmp/disable_amazon_services.sh
adb shell 'cd /data/local/tmp && ./hazel_root --client "sh /data/local/tmp/disable_amazon_services.sh"'
아무것도 변경하지 않고 현재 상태를 확인합니다:
adb shell 'cd /data/local/tmp && ./hazel_root --client "sh /data/local/tmp/disable_amazon_services.sh status"'
필요한 경우 나중에 패키지를 복원합니다:
adb shell 'cd /data/local/tmp && ./hazel_root --client "sh /data/local/tmp/disable_amazon_services.sh restore"'
활성화 또는 비활성화된 패키지 상태는 일반적으로 재부팅 후에도 유지됩니다. 패키지를 복원해도 비활성화 과정에서 삭제된 패키지 데이터는 복원되지 않습니다.
TV를 재부팅합니다:
adb reboot
익스플로잇은 임시 커널 상태만 수정하므로 재부팅 후 루트는 사라집니다.
루트가 활성화된 동안 영구 Android 설정이나 데이터에 의도적으로 가한 변경 사항은 재부팅으로 되돌려지지 않을 수 있습니다.
현재 확인된 유일한 대상은 다음과 같습니다:
hazel
PS7716.5665N
Linux 4.9.113
ARM32
다른 TV도 hazel 기기 이름을 사용하는 것으로 보이지만, 코드네임을 공유한다고 해서 동일한 커널 빌드, 보드 또는 구조체 레이아웃을 공유한다는 의미는 아닙니다.
다른 hazel 기기와의 호환성을 가정하지 마십시오.
익스플로잇 포팅에 관심이 있다면 유용한 대상 정보는 다음과 같습니다:
adb shell getprop ro.product.model
adb shell getprop ro.product.device
adb shell getprop ro.product.board
adb shell getprop ro.build.version.incremental
adb shell uname -a
현재 소스에 하드코딩된 커널 주소와 구조체 오프셋은 각 대상 펌웨어에 대해 검증되어야 합니다.
이것은 이 Fire OS 빌드에서 사용되는 벤더 ARM32 Linux 4.9 커널에 대한 CVE-2026-43499 익스플로잇 체인의 펌웨어별 적용입니다.
Hazel 관련 작업은 다음을 포함합니다:
mm_struct SLUB/캐시 셰이핑따라서 현재 익스플로잇은 일반적인 CVE-2026-43499 PoC 또는 임의 Fire TV 펌웨어용 즉시 사용 가능한 익스플로잇으로 취급해서는 안 됩니다.
이 포트는 다음 공개 CVE-2026-43499 익스플로잇 구현을 연구하고 아이디어를 적용하여 개발되었습니다:
gitchw/ghostlock-cve-2026-43499 ARM32 futex-PI UAF 참조 및 대기자/소유자/소비자 체인.
NebuSec/CyberMeowfia IonStack 익스플로잇. 광범위한 위조 fops, 커널 읽기/쓰기 및 자격 증명 패치 설계 포함.
F-19-F/IonStackQuest3
ARM32 setsockopt(MCAST_JOIN_SOURCE_GROUP) 스택 스탬핑 및 동기화 참조.
R0rt1z2/GhostLock-5.10 Hazel 포트 교차 검증에 사용된 추가 ARM32 레이아웃 및 익스플로잇 기법.
개발 과정에서 AI 코딩 에이전트가 사용되었으며, 특히 크래시 및 디스어셈블리 데이터 분석, 대상별 커널 주소와 구조체 오프셋 위치 파악 및 교차 검증, 디버깅 및 코드 정리 지원에 활용되었습니다.
익스플로잇 자체는 대상 PS7716.5665N 기기에서 테스트되었으며, 릴리스 빌드에 사용된 대상별 값은 해당 펌웨어에 대해 검증되었습니다. AI 출력은 진실의 원천이 아닌 연구 보조 도구로 취급되었습니다.