Полная проверка прозрачности приложения для продуктов Google

На этой странице рассказывается, как проверить, соответствует ли APK- или APEX-файл, установленный на вашем устройстве Android, утверждениям, сделанным в модели заявителя. Для этого нужно извлечь APK-файл с устройства и проверить его на наличие в журнале.

Процедура проверки

Журнал прозрачности реализован с помощью дерева Меркла, состоящего из хешей. Листовой узел содержит данные, а родительский узел – хеш дочерних узлов.

Для проверки целостности журналов прозрачности используются два основных вычисления: доказательство включения и доказательство согласованности. Доказательство включения подтверждает, что в журнале есть запись для определенной версии APK. Эта запись в журнале содержит хеш – дайджест SHA256 APK-файла, установленного на устройстве. Проверка согласованности гарантирует, что при добавлении новых записей новая контрольная точка остается криптографически согласованной с предыдущими версиями дерева (или что дерево не было подделано). В этом руководстве мы сосредоточимся на процессе вычисления доказательства включения, а свидетели будут непрерывно выполнять доказательство согласованности с последними контрольными точками.

Чтобы проверить защищенный APK-файл, предоставьте доказательство включения в контрольную точку. Обратите внимание, что мы планируем интегрировать этот журнал с общедоступной сетью свидетелей, используя стандартизированный протокол свидетеля. Благодаря этой интеграции в журнале будут контрольные точки, гарантирующие его целостность.

Чтобы убедиться, что приложения Google на вашем устройстве соответствуют заявлениям, сделанным в модели заявителя, выполните следующие действия.

Доказательство включения

Вы можете проверить, есть ли в журнале APK-файл, который находится на вашем устройстве. Для этого извлеките APK-файл, рассчитайте его хеш и с помощью подтверждения включения проверьте, есть ли этот хеш в опубликованной контрольной точке. Успешное подтверждение включения гарантирует защиту от рисков, описанных в модели угроз, и подтверждает, что приложение является легитимным приложением Google.

Как проверить, включен ли APK в журнал

Любое приложение, которое заявляет, что оно является приложением Google, можно проверить по этому журналу.

Что нужно, чтобы получить статус YouTube Live Verified

Прежде чем проверять, соответствует ли объект (встроенное ПО или APK) заявлению, убедитесь, что на компьютере, подключенном к сети, доступны следующие инструменты: В зависимости от того, что вы хотите подтвердить, вам могут понадобиться не все документы.

Golang

Инструмент проверки написан на языке Go. Чтобы создать его, установите Go 1.24 или более позднюю версию с сайта Go.

Android Debug Bridge (ADB)

ADB – это инструмент, который взаимодействует с устройством Android, чтобы проверить образ или извлечь APK-файлы. Он доступен на сайте Android SDK Platform Tools.

Inclusion Proof verifier

Верификатор доказательства включения – это модуль Go, который запрашивает журнал прозрачности и сообщает, включен ли в него артефакт. Он опубликован в хранилище GitHub android-binary-transparency по адресу https://github.com/android/android-binary-transparency/tree/main.

Чтобы клонировать хранилище AOSP avb:

computer:~$ git clone https://android.googlesource.com/platform/external/avb

Чтобы клонировать репозиторий android-binary-transparency на GitHub:

computer:~$ git clone https://github.com/android/android-binary-transparency

AAPT2

AAPT2 (Android Asset Packaging Tool) – это инструмент сборки, который используется для компиляции и упаковки ресурсов приложения Android. Его можно найти в Android SDK Build Tools версии 26.0.2 и выше как отдельный инструмент.

bundletool

bundletool – это инструмент для создания наборов Android App Bundle (AAB). Его также можно использовать для проверки подписей кода APK. Его можно скачать с сайта GitHub.

wget или curl;

wget и curl – это инструменты, которые можно использовать для получения или скачивания файлов из интернета. Убедитесь, что у вас установлен один из этих инструментов, так как скрипты проверки могут зависеть от них.

Avbtool

avbtool используется для вычисления дайджеста VBMeta заводских образов и проверки двоичных файлов. После клонирования репозитория avb (как показано в разделе "Проверка доказательства включения") файл avbtool.py можно найти в клонированном каталоге avb. Добавьте этот каталог в переменную среды $PATH.

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

Fbpacktool

fbpacktool – это скрипт Python, который используется для распаковки отдельных компонентов в bootloader.img Pixel. Если вы проверяете APK-файлы, это не требуется. Этот инструмент важен, потому что он позволяет avbtool.py находить изображения, необходимые для проверки.

Для работы fbpacktool требуется Python 3.6 или более поздней версии и пакет PyYAML (например, python3 -m pip install pyyaml).

Чтобы использовать этот инструмент, скачайте следующие шесть скриптов Python в каталог, где находится avbtool.py, сделайте fbpacktool.py исполняемым файлом и для удобства создайте символическую ссылку с именем fbpacktool на fbpacktool.py.

Если у вас wget:

computer:dir_to_avbtool$ wget https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool

Если у вас curl:

computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool

OpenSSL

openssl помогает выполнять различные криптографические операции с помощью терминала в рабочем процессе проверки. Убедитесь, что он установлен в вашей системе. Чтобы проверить, так ли это, выполните в терминале следующую команду и убедитесь, что возвращенный результат не пустой:

computer:~$ which openssl
/usr/bin/openssl

Как создать полезную нагрузку для проверки

Чтобы проверить извлеченный 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

Этот вывод указывает, что на вашем устройстве для приложения com.google.android.gms установлены один базовый APK-файл и несколько раздельных APK-файлов. Точное количество раздельных 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. Запустите средство проверки, указав путь к полезной нагрузке и тип журнала:

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

Проверяющий использует контрольную точку и содержимое журнала (из каталога фрагментов), чтобы узнать, есть ли полезная нагрузка APK в журнале прозрачности. Если да, то APK был опубликован Google.

Результат выполнения команды выводится в stderr:

  • 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 означает, что пакет был криптографически проверен по журналу прозрачности и соответствует его требованиям.