Плагин AutoRepro Gradle создан на основе тестовой среды Android Trade Federation и предназначен для проверки всех устройств Android на наличие уязвимостей, описанных в бюллетене безопасности Android . Эти тесты предназначены исключительно для исправлений, связанных или которые будут связаны с распространенными уязвимостями и угрозами (CVE).
Этот плагин позволяет разрабатывать тесты Tradefed вне исходного кода Android, используя Android Studio или стандартный Android SDK. Он включает в себя все необходимые утилиты для сборки и запуска тестов Tradefed.
В основном он используется для автоматической отправки воспроизводимых прототипов в рамках программы вознаграждения за обнаружение уязвимостей в Android .
Просмотрите примеры и шаблоны AutoRepro
Предварительные требования
Инструкции предназначены для 64-битного ПК под управлением Linux.
- Android Studio Ladybug или более поздняя версия — также может быть установлена через менеджер пакетов вашего дистрибутива.
- Инструменты платформы Android SDK (
adb,fastboot) — необходимо установить и добавить в переменную$PATH(то есть, вы должны иметь возможность запускатьadbиз командной строки). Самый простой способ установить инструменты платформы — использовать менеджер пакетов вашего дистрибутива.- Если вы используете менеджер SDK Android Studio вместо отдельных инструментов платформы, не забудьте добавить каталог
platform-toolsиз SDK в переменную$PATHдля разработки из командной строки.
- Если вы используете менеджер SDK Android Studio вместо отдельных инструментов платформы, не забудьте добавить каталог
- AAPT2 . — Также может быть установлен с помощью менеджера пакетов вашего дистрибутива.
- Java JDK 21 или более поздняя версия — совместима с Android SDK и Gradle.
Начните использовать Android Studio
После извлечения примера или шаблона откройте каталог в Android Studio как существующий проект и дождитесь завершения синхронизации Gradle. В Android Studio доступно несколько предварительно настроенных конфигураций запуска.
Задачи Gradle:
-
assembleSubmissionSources- Собирает исходные файлы для архива с результатами обработки. -
assembleSubmissionZip- Собирает архив с файлом для загрузки. -
copyInvocationResultsToSubmission— Копирует результаты предыдущих вызовов Tradefed в каталог исходных файлов для автоматической проверки, чтобы упростить процесс анализа. Обратите внимание, что он содержит журналы как с хоста, так и с устройства; проверьте содержимое до или после выполнения этой операции.
Настройки запуска Android Studio для вызова функции AutoRepro:
-
autorepro_nonroot_arm64 -
autorepro_nonroot_x86_64 -
autorepro_root_arm64 -
autorepro_root_x86_64
Настройки лаунчера имеют вид autorepro_{device_root}_{device_arch} . Как правило, предпочтительнее использовать версию без root-прав, поскольку уязвимости, требующие root-доступа, менее серьезны. Однако использование root-прав для выполнения настройки или очистки может быть допустимо, если это четко задокументировано и общепринято как допустимое состояние без root-прав. Например, допустимо использовать root-права для имитации отправки текстовых сообщений на устройство, чтобы избежать необходимости использования второго устройства и нескольких SIM-карт.
Эти действия запустят Tradefed для вашего тестирования. Tradefed ожидает подключения действительного устройства, поэтому убедитесь, что оно подключено и разрешена отладка ADB.
Интеграция с агентами кодирования
Пример и шаблоны предоставляют контекстный файл AGENTS.md , совместимый с Gemini в Android Studio, Gemini CLI и другими агентами для разработки кода. Он содержит информацию о структуре отправки заданий и инструкции по использованию AutoRepro. Вы можете использовать его для:
- Автоматически запустите AutoRepro для вашего устройства.
- Проведите проверку кода существующей заявки на предмет изменений, которые могут ускорить принятие вашего отчета.
- Помогите структурировать новый прототип, используя информацию об уязвимости.
Напишите тест AutoRepro.
Тест AutoRepro состоит из трех частей и трех соответствующих плагинов Gradle:
- Плагин Gradle
id("com.android.security.autorepro.javahosttest")это единственный тест Tradefed на стороне хоста, взаимодействующий с устройством через ADB. В примере он используется в каталогеsubmission/hostTest/. -
id("com.android.security.autorepro.apptest")это APK-файл приложения или сервиса, который устанавливается на устройство с помощьюadb installи запускается тестом на стороне хоста. Приложение или сервис также может содержать собственный набор утверждений JUnit, которые передаются исполнителю на стороне хоста. В примере он используется в каталогеsubmission/appTest/и . - Плагин Gradle
id("com.android.security.autorepro.ndktest")— необязательный прототип атаки на основе NDK, который устанавливается на устройство черезadb pushи выполняется тестом на стороне хоста. В примере он используется в каталогеsubmission/ndkTest/.
Типичный алгоритм автоматического воспроизведения ошибок обычно следует одному из двух сценариев:
Приложение для инструментального тестирования:
- Тестирование на стороне хоста загружает на устройство APK-файл, содержащий инструментированное приложение или сервис.
- Тест на стороне хоста запускает тесты JUnit на стороне устройства, которые входят в состав APK-файла и запускаются с помощью функции
runDeviceTest(). - Тесты JUnit на стороне устройства отслеживают нажатия кнопок и наблюдают за работой приложения с помощью UIAutomator, или иным образом обращаются к API Android, выявляя уязвимости безопасности.
- Результаты успешного или неудачного выполнения тестов JUnit на стороне устройства возвращаются в тест на стороне хоста, который может быть использован для определения того, пройден ли тест или нет. Сообщение об ошибке должно содержать подробную информацию о причинах сбоя утверждения, а также любые конкретные объекты, значения, исключения, трассировки стека или другие артефакты, подтверждающие уязвимость.
NDK-прототип:
- Тест на стороне хоста запускает исполняемый файл Linux на устройстве.
- Встроенная программа завершается с ошибкой или возвращает определенный код завершения.
- Тест на стороне хоста проверяет наличие сбоев, анализирует трассировку стека logcat или ищет конкретный код завершения, чтобы определить, была ли атака успешной. Сообщение об ошибке должно содержать подробную информацию о причинах сбоя проверки, а также любые конкретные структуры, значения, трассировки стека или другие артефакты, подтверждающие уязвимость.
Также возможно сочетание двух подходов (например, запуск нативной программы совместно с тестами на стороне устройства). Доступны и другие фреймворки для инструментирования, такие как frida-inject . Более подробную информацию см. в справочной документации Security Test Suite и справочной документации Tradefed .
Структурирование возможности подтверждения концепции
Качественный PoC должен не просто выявлять ошибку, но и предоставлять проверяемые доказательства того, что была нарушена граница безопасности. Для достижения этой цели PoC могут следовать определенной трехэтапной схеме «провал-затем-успех»:
- Подготовка: Подготовьте устройство, установив необходимые приложения, загрузив файлы и убедившись, что устройство находится в требуемом состоянии непосредственно перед эксплойтом. (Использование root-прав для настройки разрешено, если это оправдано и соответствует реальному состоянию конечного пользователя).
- Подтвердите наличие уязвимости: Прежде чем активировать уязвимость, попробуйте выполнить целевое действие и убедитесь, что оно не удалось . Например, если эксплойт позволяет читать защищенный файл, вы должны сначала попытаться прочитать его и убедиться, что получили ошибку «Доступ запрещен».
- Инициирование и проверка: активируйте уязвимость, затем немедленно повторите действие из шага 2. На уязвимом устройстве это действие должно теперь пройти успешно. Для проверки необходимо использовать утверждение, которое не проходит на уязвимом устройстве, с сообщением, начинающимся с точного префикса
AUTOREPRO_VULNERABILITY_PROVEN:Это сообщение должно содержать краткое описание уязвимости и любые захваченные артефакты (такие как утечка данных или неожиданные состояния), чтобы однозначно доказать успешность эксплойта.
Пример:
@Test
public void testPoc() throws Exception {
// 1. Setup: Prepare the device.
setup();
// 2. Prove the Boundary: Assert the resource is protected BEFORE the exploit.
// This passes on all devices (safe or vulnerable) before the trigger runs.
assertDeviceIsSecure();
// 3. Trigger & Verify: Execute the exploit logic, then immediately repeat
// the action from Step 2. On a vulnerable device, this action should now
// succeed, causing assertDeviceIsSecure() to fail with an
// AUTOREPRO_VULNERABILITY_PROVEN message.
triggerExploit();
assertDeviceIsSecure();
}
private void assertDeviceIsSecure() {
try {
String content = readProtectedFile();
// Where possible, put the content in the assertion message.
// Start the assertion message with "AUTOREPRO_VULNERABILITY_PROVEN:".
Assert.fail("AUTOREPRO_VULNERABILITY_PROVEN: Successfully read protected file. Content: '" + content + "'");
} catch (ThisVulnSpecificException e) {
Log.i(TAG, "protected against reading protected file", e);
}
}
Для демонстрации моей концепции атаки не требуется тестовое приложение или исполняемый файл.
Для большинства тестов не потребуется одновременно и приложение для устройства, и исполняемый файл.
Если ваш тест не предполагает использования какой-либо функции, удалите ненужные подкаталоги Gradle.
В качестве экспериментального варианта атаки я использую второе приложение или сервис.
Добавьте столько подпроектов Gradle с плагинами AutoRepro, сколько вам нужно.
Отправьте тест AutoRepro
Чтобы включить результаты тестирования вашего устройства в заявку:
- При желании можно запустить задачу
cleanGradle, чтобы удалить все старые результаты выполнения тестов. - Запустите соответствующую конфигурацию AutoRepro, чтобы использовать Tradefed для тестирования и собрать журналы и результаты.
- Запустите задачу
copyInvocationResultsToSubmission, чтобы скопировать журналы и результаты в каталог источников отправки.
Запустите assembleSubmissionZip , чтобы создать файл submission/build/autorepro-submission.zip . Загрузите этот файл вместе с вашим отчетом в программу вознаграждения за обнаружение уязвимостей Android. Убедитесь, что вложение соответствует шаблону *autorepro-submission*.zip и загружено вместе с первоначальным отчетом. Загрузка отчетов с опозданием повлияет на нашу возможность должным образом рассмотреть ваш отчет.