На этой странице описано, как проверить, соответствует ли установленный на вашем устройстве Android APK-файл или APEX-файл заявлениям, указанным в модели заявителя . Процесс включает в себя извлечение APK-файла с вашего устройства и выполнение проверки включения журнала для извлеченного артефакта.
Процесс проверки
Журнал прозрачности реализован с помощью дерева Меркла, состоящего из хешей. Листовой узел содержит данные, а родительский узел — хеш своих дочерних узлов.
Два основных вычисления подтверждают свойство защиты журналов прозрачности от несанкционированного изменения: доказательство включения и доказательство согласованности. Доказательство включения подтверждает наличие записи в журнале для конкретной версии APK. Эта запись содержит хеш, который представляет собой дайджест SHA256 файла APK, установленного на устройстве. Доказательство согласованности гарантирует, что при добавлении новых записей новая контрольная точка остается криптографически согласованной с предыдущими версиями дерева (или что дерево не было изменено). В этом руководстве мы сосредоточимся на процессе вычисления доказательства включения, полагаясь на свидетелей для непрерывного выполнения проверки согласованности по отношению к последним контрольным точкам.
Для проверки защищенного APK-файла выполните доказательство включения на основе засвидетельствованной контрольной точки. Обратите внимание, что мы планируем интегрировать этот журнал с общедоступной сетью свидетелей, используя стандартизированный протокол свидетелей . Эта интеграция обеспечит наличие засвидетельствованных контрольных точек, гарантирующих согласованность журнала.
Чтобы убедиться, что приложения Google на вашем устройстве соответствуют заявлениям, сделанным в модели заявителя, выполните следующие шаги.
Доказательство инклюзивности
Вы можете убедиться, что защищенный APK-файл на вашем устройстве присутствует в журнале, извлекая APK-файл, вычисляя его хеш и используя подтверждение включения, чтобы проверить, существует ли этот хеш в опубликованной контрольной точке. Успешное подтверждение включения обеспечивает защиту от рисков, описанных в модели угроз, подтверждая, что приложение является легитимным приложением Google.
Как проверить наличие APK-файла в логе
Любое приложение, заявляющее о том, что оно является собственным приложением Google, может быть проверено по этому журналу.
Предварительные условия для проверки
Перед проверкой извлеченного APK-файла необходимо установить на компьютер следующие инструменты:
Отладочный мост Android (ADB)
ADB — это инструмент для взаимодействия с устройством Android, доступный на веб-сайте Android SDK Platform Tools.
AAPT2
AAPT2 (Android Asset Packaging Tool) — это инструмент сборки, используемый для компиляции и упаковки ресурсов Android-приложения. Он доступен как отдельный инструмент в Android SDK Build Tools 26.0.2 и выше.
Golang
Инструмент проверки написан на языке Go. Для его сборки установите Go версии 1.17 или более поздней с сайта Go .
Верификатор подтверждения включения
Мы опубликовали модуль Go под названием verifier в репозитории android-binary-transparency на GitHub . Этот инструмент запрашивает журнал прозрачности APK-файлов от Google, чтобы проверить, включен ли пакет.
Для использования этого инструмента сначала клонируйте репозиторий на свой локальный компьютер:
git clone https://github.com/android/android-binary-transparency
Исходный код верификатора можно найти в репозитории android-binary-transparency .
Создайте полезную нагрузку для проверки.
Для проверки извлеченного APK-файла необходимо сформировать полезную нагрузку журнала, используя информацию, полученную из самого APK-файла.
Перед началом работы включите отладку по USB на вашем устройстве, чтобы разрешить подключение adb .
Далее найдите установленный APK-файл на вашем устройстве. В этом руководстве в качестве рабочего примера используется APK-файл сервисов Google Play ( com.google.android.gms ).
adb shell pm path com.google.android.gms
В результате вы должны увидеть примерно следующий вывод:
computer:~$ adb shell pm path com.google.android.gms
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/base.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_CronetDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteLoader_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteModulesA_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteModulesC_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_GoogleCertificates_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_MapsDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_MeasurementDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_config.en.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_config.xxhdpi.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_maps_core_dynamite_ondemand.apk
Этот вывод указывает на то, что на вашем устройстве установлен один базовый APK-файл и несколько разделенных APK-файлов для com.google.android.gms . Точное количество разделенных APK-файлов зависит от конфигурации вашего устройства. Каждый разделенный APK-файл имеет то же имя пакета и код версии, что и базовый APK-файл.
Загрузите указанные APK-файлы со своего Android-устройства на компьютер, используя следующую команду (обратите внимание, что фактические пути к файлам могут отличаться):
mkdir -p /tmp/testdir/gms && cd /tmp/testdir/gms && \
adb shell pm path com.google.android.gms | cut -d':' -f2 | tr -d '\r' | xargs -n1 adb pull
Для проверки имени пакета и версии загруженных APK-файлов необходимо изучить их манифест ( AndroidManifest.xml ).
Поскольку манифест внутри APK-файла имеет бинарный формат, используйте инструмент aapt2 (установленный на этапе подготовки необходимых компонентов ), чтобы извлечь и прочитать информацию непосредственно из APK-файла:
computer:/tmp/testdir/gms$ aapt2 dump badging ./base.apk
package: name='com.google.android.gms' versionCode='260834035' versionName='26.08.34 (260400-876566425)' platformBuildVersionName='Baklava' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='Baklava'
minSdkVersion:'35'
targetSdkVersion:'36'
...
Этот шаг следует повторять до тех пор, пока вы не учтете все разделенные APK-файлы, установленные на вашем устройстве.
Полученные данные подтверждают, что имя пакета APK — com.google.android.gms , а номер версии ( versionCode ) — 260834035 .
Далее вычислите криптографический хеш каждого APK-файла:
computer:/tmp/testdir/gms$ sha256sum *.apk
66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a base.apk
c20754aee886cc55a9de91ee15c623c59d94ad22b7e435a1a48afc43cf1a106c split_config.en.apk
68c09b63a1262e0d34020c139bc77deff3c32bd2b01177abac64790a62fb3be6 split_config.xxhdpi.apk
cd746820c27babd855fa5daea6fabcdf7b44abf3060bc547adc4219212410af0 split_CronetDynamite_installtime.apk
512ee48b60fdb0787a17f84a7dc448fdbf885b2b86a9cb50525d4c22d561b0f1 split_DynamiteLoader_installtime.apk
9e0c74bdc75c50c80d4e2e580a7eda6b8391423ab1161645f41ec6cadc07d678 split_DynamiteModulesA_installtime.apk
955780ac01f59b98bd9be12968f3824ad71b762620f7bf223c569c1a6ab7056c split_DynamiteModulesC_installtime.apk
34c4a2e32d31554d55fc1519e2cfc3ed5027a090fb29b54cfc99f42d1da43bc5 split_GoogleCertificates_installtime.apk
475e18dde92472cde9d8300c082b6dc269613db03398bcd9d1987dff3e68f7b5 split_maps_core_dynamite_ondemand.apk
f83faf40f08bc13f4879302e01c08c863ca2304b4b4e7c9eaf8cd1e869bb6573 split_MapsDynamite_installtime.apk
ec6d854ddda6cd1ba2ba7af2d9fdf4f28c5c78be8713c64521c785429296738c split_MeasurementDynamite_installtime.apk
Теперь у вас есть вся необходимая информация для создания полезной нагрузки лога, отформатированной, как описано в разделе «Содержание лога» . В качестве примера выберем один хеш из результатов (вам следует проверить хеш каждого разделенного APK-файла), и полезная нагрузка лога будет выглядеть следующим образом:
66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a
SHA256(APK)
com.google.android.gms
260834035
Убедитесь, что в конце файла добавлен символ новой строки. Сохраните это содержимое в файл, например, payload.txt , чтобы использовать его позже с инструментом verifier .
Проверка наличия посылки (подтверждение наличия)
После создания полезной нагрузки вы можете проверить, включен ли пакет в журнал прозрачности. Соберите инструмент подтверждения включения из репозитория android-binary-transparency который вы клонировали ранее:
go build cmd/verifier/verifier.go
В результате в указанной директории должен появиться исполняемый файл с именем verifier . Запустите verifier, указав путь к вашей полезной нагрузке и тип журнала:
computer:android-binary-transparency$ PAYLOAD_PATH=PATH_TO_PAYLOAD_DIR/payload.txt
computer:android-binary-transparency$ ./verifier --payload_path=${PAYLOAD_PATH} --log_type=google_1p_apk
Верификатор использует содержимое контрольной точки и журнала (из каталога tile ), чтобы проверить, находится ли полезная нагрузка вашего APK-файла в журнале прозрачности, подтверждая, что он был опубликован Google.
Команда выводит результат в стандартный поток ошибок :
-
OK. inclusion check success!Если пакет включен в лог. - Если это не так, то
FAILURE.
Автоматическая проверка всех пакетов на устройстве
Учитывая количество приложений Google, которые могут быть предустановлены на вашем устройстве, перечисление каждого приложения и выполнение проверок на соответствие требованиям по отдельности может быть утомительным.
Мы предлагаем еще один автоматизированный инструмент под названием Uraniborg , который может обнаруживать и измерять все установленные на вашем устройстве пакеты. Он передает свои результаты непосредственно в инструмент verifier , позволяя вам за один шаг обнаружить и проверить прозрачность всех приложений на вашем устройстве.
Для использования этого автоматизированного процесса убедитесь, что ваше устройство Android подключено к компьютеру через ADB . Исходный код Uraniborg также включен в репозиторий android-binary-transparency .
Запустите скрипт automate_observation.py , расположенный в каталоге scripts/python :
python3 automate_observation.py --pull-all-apks --perform_inclusion_proof_check --verifier_path <path_to_verifier_executable>
После завершения выполнения скрипта вы должны увидеть примерно такой вывод:
INFO:automate_observation.py:main(858): SUCCESS! Hubble was successfully deployed and executed on connected device ABCDEFGHN01234.
INFO:automate_observation.py:main(860): Hubble output files can be found at: /Users/user/home/src/android-binary-transparency/uraniborg/scripts/python/results/google/lynx/lynx:16/BP4A.260105.004.E1/14587043:user/release-keys/001
Перейдите в указанный скриптом выходной каталог. Внутри найдите файл packages_with_inclusion_proof_signal.txt . В этом файле перечислены все установленные пакеты, а также поле inclusion_proof_verified значение которого может быть true или false . Значение true означает, что пакет был криптографически проверен на соответствие журналу прозрачности, подтверждая его соответствие утверждениям журнала.