
An Android HW Attestation demo
Этот репозиторий сопровождает статью Quarkslab об аппаратной Android Key Attestation и создан для её иллюстрации.
Это небольшой сквозной proof of concept, демонстрирующий простой обход: аналитик на рутованном телефоне обходит проверку аппаратной аттестации бэкендом, ретранслируя аттестацию на второе, чистое устройство. Ничего не подделывается. Подлинная цепочка аттестации, созданная немодифицированным устройством и привязанная к собственному nonce бэкенда, пересылается вместо отклонённой цепочки рутованного устройства.
Область применения и этика. Это учебный материал для исследований в области безопасности. Здесь используется обычный HTTP и намеренно отключены проверки безопасности (повсюду пометки «demo only»). Запускайте его на своих собственных устройствах и своём собственном бэкенде, в доверенной локальной сети.
Аттестация Keystore рутованного устройства сообщает о разблокированном загрузчике, поэтому бэкенд отклоняет её. Вместо атаки на криптографию аналитик перехватывает вызов аттестации в самом приложении и подменяет цепочку на полученную в реальном времени с чистого устройства для того же самого challenge.
Хук заменяет KeystoreAttestation.generateAttestedKey(challenge) в
демо-приложении и никогда не вызывает локальный Keystore, поэтому цепочка рутованного устройства
никогда не создаётся. Ретранслированная цепочка подлинна и проходит проверки бэкенда на verified boot
и аппаратную защиту.
У каждого компонента есть собственный README с полными подробностями; этот файл связывает их воедино.
frida-server 17.16.4 и установленным
демо-приложением.backend/requirements.txt)../gradlew assembleDebug).instrumentation/_agent.js) сохранён в репозитории, так что пересборка
необязательна.Поднимайте компоненты в следующем порядке.
Бэкенд. На машине, доступной с обоих устройств:
cd backend
pip install -r requirements.txt
python3 attestation_backend.py # слушает на 0.0.0.0:8080
Чистое устройство. Соберите и установите приложение сервера аттестации, затем откройте его,
нажмите START SERVER и запишите показанный URL, например http://192.168.1.42:8080.
Рутованное устройство. Запустите frida-server, соберите и установите демо-приложение, откройте
его и введите адрес бэкенда (host:port).
Оба приложения собираются из Android Studio или из командной строки с помощью Gradle
wrapper (./gradlew assembleDebug, JDK 17-21); подробности — в README каждого приложения.
Ретрансляция. На рабочей станции:
cd instrumentation
python3 control.py --host <clean-device-ip> --port 8080
Контроллер запускает демо-приложение, устанавливает хук, затем возобновляет его.
Запуск. Нажмите RUN ATTESTATION в демо-приложении. Бэкенд возвращает valid: ретранслированная цепочка сообщает о заблокированном загрузчике.
Отрицательный контроль. Остановите control.py и снова нажмите .
Теперь демо-приложение отправляет собственную цепочку рутованного устройства, и бэкенд отклоняет
её. Это та проверка, которую обходит ретрансляция.
Пересборка агента (только если вы изменяете agent/agent.ts):
cd instrumentation
nvm use # Node 22 из .nvmrc
npm install
npm run build # перегенерирует _agent.js
apps/
QuarkslabAttestationDemo/ целевое клиентское приложение (проект Android Studio)
QuarkslabAttestationServer/ оракул аттестации на чистом устройстве (проект Android Studio)
instrumentation/ агент Frida + контроллер ретрансляции
backend/ Python-валидатор аттестации
LICENSE MIT
Copyright 2026 Quarkslab. Лицензия MIT. См. LICENSE.
Этот репозиторий иллюстрирует статью Quarkslab.
| Компонент | Путь | Роль | Где запускается |
|---|
| Демо-клиент | apps/QuarkslabAttestationDemo/ | Целевое приложение. Запрашивает nonce, выполняет аттестацию, отправляет цепочку бэкенду. Перехватывается Frida. | Рутованное аналитическое устройство |
| Сервер аттестации | apps/QuarkslabAttestationServer/ | Оракул аттестации. Создаёт подлинную цепочку для заданного nonce. Ничего не проверяет. | Чистое, немодифицированное устройство |
| Инструментирование | instrumentation/ | Агент Frida (хук) плюс контроллер, который ретранслирует nonce на чистое устройство. | Рабочая станция аналитика + рутованное устройство |
| Бэкенд | backend/ | Проверяющая сторона. Выдаёт nonce и проверяет цепочки аттестации. | Любая машина, доступная с устройств |