
أبحاث استغلال نواة تحقق صلاحيات root مؤقتة على Amazon Fire 7 (Fire OS 7.3.3.1) عبر ثغرة use-after-free في Mali kbase JIT بالمعرّف CVE-2022-38181، مع سلسلة استغلال تعتمد على الكتابة فوق modprobe_path.
مشروع بمساعدة الذكاء الاصطناعي. تم إنتاج هذا البحث وتطوير الاستغلال والتوثيق بمساعدة الذكاء الاصطناعي باستخدام النموذجين GLM-5.3 و DeepSeek V4.1 Flash.
بحث استغلال الجذر (root exploit) لجهاز Amazon Fire 7 الجيل التاسع (mustang, MT8163, Mali-T720) على البرنامج الثابت النهائي — Fire OS 7.3.3.1, PS7331.4463N, kernel 4.9.117 (built 2025-05-03, SPL 2024-08-01).
الهدف: LineageOS. مسار الـ bootloader ميت على هذه الوحدة (bootrom مُرقّع — preloader فقط عبر CMD short)، لذا المسار الوحيد المتبقي هو استغلال برمجي للنواة (kernel exploit).
nix-shell -p android-tools --run './run.sh' # add -p zig too if no zig
عند النجاح:```
/data/metrics/su id # run a command as root
/data/metrics/su # interactive root shell
يفوز reclaim بنحو إقلاع واحد من كل 3، والخسارة تؤدي إلى panic/إعادة تشغيل الجهاز اللوحي؛
run.sh ينتظر فقط إعادة التشغيل ويعيد المحاولة. يتم فرض SELinux إلى Permissive كجزء
من الاستغلال، لذا فإن root يعمل وقت التشغيل فقط — إعادة التشغيل تستعيد الوضع الأصلي
وتعيد تشغيل run.sh.
يتم تضمين st3 و su المبنيين مسبقًا (armv7 static)، لذا لا حاجة إلى toolchain
للتشغيل. ./run.sh --build يعيد بناءهما من poc/*.c إذا كان لديك zig.
GhostLock (أدناه) متوقف مؤقتًا: متغير rtmutex BUG_ON الخاص بـ MTK + عدم الكشف عن عنوان kernel من shell = طريق مسدود معماري على هذا البناء (الجلسات 2-4). تمت إعادة تشخيص kbase JIT UAF (كان "panic غير المشروط" في destroy-worker هو JIT_FREE deref، وفُقد السجل بسبب موت adbd في منتصف الـ panic) والمرحلة 2 الآن مُثبتة بالأوراكل — انظر قسم الجلسة 5.
rtmutex remove_waiter() futex-PI stack-UAF (إفصاح NebuSec 2026-07، الإصلاح 3bfdc63936dd
وصل 2026-04). النطاق المعرّض 2.6.39–7.1 → إصدارنا 4.9.117 (مايو 2025) متأثر.
تم التحقق على بنائنا الدقيق:
CONFIG_FUTEX=y، rtmutex مُجمّع، الخلل موجود حرفيًا:
rtmutex.c:1108-1111 يستخدم current->pi_lock/current->pi_blocked_on (يجب أن يكون
waiter->task)؛ موقع الاستدعاء المعطوب rtmutex.c:1723 (مسار خطأ rt_mutex_start_proxy_lock)WAIT_REQUEUE_PI/CMP_REQUEUE_PI)، لا device node،
لا شيء محمي بـ SELinux — العوائق القاتلة في مسار kbase غير موجودة هناsched_setattr → __sched_setscheduler → rt_mutex_adjust_pi(p) عند
sched/core.c:4706 — يعمل deref لـ pi_blocked_on القديم ✓futex.c:1975 يمرر this->rt_waiter،
المُعرّف في futex_wait_requeue_pi عند futex.c:2880) → waiter يطبع إطاره المحرر
عبر arm32 select (nr 142) fd_setsDEBUG_RT_MUTEXES معطّل
→ rt_mutex_waiter مضغوط بحجم 48 بايت (tree_entry@0، pi_tree_entry@0xc، task@0x18،
lock@0x1c، prio@0x20، deadline@0x28)modprobe_path @ 0xc111488c (السلسلة موجودة ذاتيًا في
vmlinux؛ KALLSYMS_ALL معطّل لذا رموز البيانات تحتاج هذه الحيلة) → exec binfmt غير معروف → root
script (setenforce 0، تعطيل OTA، su)refs/: NebuSec/CyberMeowfia (الأصلي)، GhostLock-5.10 (منفذ Fire OS 8،
trigger كامل لـ 32-bit ARM في src/exp32/)، ghostlock-...-4.19-k40 (منفذ Qualcomm 4.19 Android)exp32/main.crt_waiter مقابل منطقة do_sys_select fd_set — فك تجميع
vmlinux الخاص بنا (do_sys_select stack_fds مقابل إطار futex_wait_requeue_pi)، كشف
STAMP_NFDS/STAMP_WAITER_OFF كمعاملات قابلة للضبطFailed critical init step 3/dev/mali0 world-RW + SELinux gpu_device، kbase r26p0-01rel0selroot المكونة من حزمتين: تصفير selinux_state.enforcing،
إعادة كتابة fake entry إلى commit_creds(&init_cred). uid=0، SELinux Permissive.mustang، Fire OS 7.3.3.1 PS7331.4463N/00315758630404.9.117-g08fe75b-dirty، بُني السبت 3 مايو 01:25:15 UTC 2025 (Linaro GCC 6.3-2017.05)/dev/kb، /dev/dkb (أقسام النسخ الاحتياطي لنواة Amazon) root:drmrpc 0660 — مقفلةmali_kbase r26p0-01rel0 (Midgard، Mali-T720)، داخل نطاق NVD المتأثر r4p0–r31p0mali_kbase_mem.c:2721 kbase_jit_destroy_worker يحرر المنطقة، لا يمسح kctx->jit_alloc[id] أبدًاmali_kbase_softjobs.c:1270 kbase_jit_free_finish يعمل deref لـ jit_alloc[ids[j]] القديمmali_kbase_mem.c:3138 kbase_jit_backing_lost → مسار destroy (يُفعّل أثناء reclaim)0xc0008000 VA ثابت / 0x40080000 PA)ARM_SW_DOMAIN_PAN → ret2usr قابل للتطبيق؛ CONFIG_PANIC_ON_OOPS=y (المحاولات الفاشلة = إعادة تشغيل)SLAB_FREELIST_RANDOM/HARDENED، لا CONFIG_USER_NS/USERFAULTFD/NF_TABLESCONFIG_MODULES=y، لا STATIC_USERMODEHELPER → الكتابة فوق modprobe_path = root_IOC_TYPE 0x80)MEM_ALLOC بحجم 32 بايت (in يحتوي على 4 × u64 بما في ذلك extent)BASE_MEM_PROT_GPU_RD|WR (بتات 2|3)، وليس R|W القديمةmmap(fd, offset=3<<12, PROT_NONE)JOB_SUBMIT قيمة sizeof(base_jd_atom_v2) = 48 (base_jd_prio/base_jd_dep_type هي typedefs من نوع u8)MEM_JIT_INIT (nr 14، بنية v2)، alloc/free هي soft jobs عبر JOB_SUBMIT
(BASE_JD_REQ_SOFT_JIT_ALLOC=0x209، ...FREE=0x20a؛ jc=مؤشر مستخدم، nr_extres=العدد)info->gpu_alloc_addr (GPU VA يجب أن
تخصصه مسبقًا وتمرره)