
Исследование эксплойта ядра, достигающее временного root на Amazon Fire 7 (Fire OS 7.3.3.1) через use-after-free в JIT Mali kbase CVE-2022-38181, с цепочкой перезаписи modprobe_path.
Проект с использованием ИИ. Это исследование, разработка эксплойта и документация были выполнены с помощью ИИ с использованием моделей GLM-5.3 и DeepSeek V4.1 Flash.
Исследование root-эксплойта для Amazon Fire 7 9-го поколения (mustang, MT8163, Mali-T720) на финальной прошивке — Fire OS 7.3.3.1, PS7331.4463N, ядро 4.9.117 (сборка 2025-05-03, SPL 2024-08-01).
Цель: LineageOS. Путь через загрузчик на этом устройстве мёртв (пропатченный bootrom — только preloader через замыкание CMD), поэтому единственный оставшийся маршрут — программный эксплойт ядра.
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 происходит примерно 1 загрузка из 3, а проигрыш приводит к панике/перезагрузке планшета;
run.sh просто ждёт перезагрузки и повторяет попытку. SELinux принудительно переводится в Permissive
в рамках эксплойта, поэтому root доступен только во время выполнения — перезагрузка восстанавливает
стоковое состояние, и вы снова запускаете run.sh.
Предсобранные st3 и su (armv7 static) закоммичены, поэтому для запуска тулчейн не нужен.
./run.sh --build пересобирает их из poc/*.c, если у вас есть zig.
GhostLock (ниже) отложен: вариант MTK с BUG_ON rtmutex + отсутствие раскрытия адресов ядра из шелла = архитектурный тупик на этой сборке (сессии 2-4). kbase JIT UAF был передиагностирован (паника destroy-worker «безусловная паника» была разыменованием JIT_FREE, лог потерян из-за смерти adbd посреди паники), и этап 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), без узла устройства,
ничего не ограничено SELinux — фатальных препятствий пути kbase здесь не существуетsched_setattr → __sched_setscheduler → rt_mutex_adjust_pi(p) в
sched/core.c:4706 — разыменовывает устаревший pi_blocked_on ✓futex.c:1975 передаёт this->rt_waiter,
объявленный в futex_wait_requeue_pi в futex.c:2880) → ожидающий штампует свой собственный освобождённый фрейм
через arm32 select (nr 142) fd_setsDEBUG_RT_MUTEXES выключен
→ компактный 48-байтовый rt_mutex_waiter (tree_entry@0, pi_tree_entry@0xc, task@0x18,
lock@0x1c, prio@0x20, deadline@0x28)modprobe_path @ 0xc111488c (строка самоопределяется в
vmlinux; KALLSYMS_ALL выключен, поэтому символы данных требуют этого трюка) → exec неизвестного binfmt → root-скрипт
(setenforce 0, отключение OTA, su)refs/: NebuSec/CyberMeowfia (оригинал), GhostLock-5.10 (порт для Fire OS 8,
полный 32-битный ARM-триггер в src/exp32/), ghostlock-...-4.19-k40 (порт для Qualcomm 4.19 Android)exp32/main.crt_waiter относительно области fd_set do_sys_select — дизассемблировать
наш 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 из 2 пакетов: обнуление selinux_state.enforcing, перезапись
фейковой записи на commit_creds(&init_cred). uid=0, SELinux Permissive.mustang, Fire OS 7.3.3.1 PS7331.4463N/00315758630404.9.117-g08fe75b-dirty, собрано Sat May 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 разыменовывает устаревший jit_alloc[ids[j]]mali_kbase_mem.c:3138 kbase_jit_backing_lost → путь destroy (срабатывает во время reclaim)0xc0008000 / PA 0x40080000)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