На этой странице описаны различные способы убедиться, что APK, установленный на вашем устройстве Android, соответствует утверждению, сделанному в модели заявителя. Для этого нужно извлечь APK-файл с устройства, проверить целостность его кода и выполнить проверку включения в журнал для извлеченного артефакта.
Процесс проверки
Журнал прозрачности реализован с помощью дерева Меркла, состоящего из хешей. Листовой узел содержит данные, а родительский узел – хеш своих дочерних узлов.
Для проверки защиты от несанкционированного доступа в журналах прозрачности на дереве Меркла выполняются два вычисления: доказательство включения и доказательство согласованности. Первое подтверждает, что в журнале есть запись, соответствующая определенной версии APK-файла. Запись в журнале содержит хеш, который представляет собой дайджест SHA256 токена подписи кода в виде веб-токена JSON (JWT). Его можно получить из соответствующих APK-файлов. Последнее доказывает, что при добавлении новых записей в дерево новая контрольная точка (криптографически) согласуется с предыдущей версией дерева.
Чтобы проверить APK-файл, выполните тест на включение на основе контрольной точки. Обратите внимание, что мы планируем интегрировать этот журнал с общедоступной сетью свидетелей, используя стандартизированный протокол свидетелей. Это позволит создать контрольную точку, которая гарантирует согласованность журнала.
Если вы хотите убедиться, что APK-файл на вашем устройстве соответствует заявлению, сделанному в модели заявителя, ознакомьтесь с информацией ниже.
Доказательство включения
Пользователь Android может проверить, есть ли в журнале APK-файл, который находится на его устройстве. Для этого нужно извлечь APK-файл и его метаданные, а затем сравнить пересчитанный корневой хеш с корневым хешем, который содержится в опубликованной контрольной точке. Если они совпадают, то пользователь Android может быть уверен в наличии некоторых средств защиты, описанных в модели угроз.
Как проверить, включен ли APK в журнал
Как уже говорилось, список APK-файлов, которые сейчас защищены, можно найти на обзорной странице.
Что нужно, чтобы получить статус YouTube Live Verified
Прежде чем проверять, соответствует ли объект (встроенное ПО или APK) заявлению, убедитесь, что на компьютере, подключенном к сети, доступны следующие инструменты: В зависимости от цели проверки вам могут понадобиться не все из них.
Golang
Инструмент проверки написан на языке Go. Чтобы собрать его, установите Go 1.24 или более поздней версии с сайта Go.
Android Debug Bridge (ADB)
ADB – это инструмент, который взаимодействует с устройством Android для проверки образа или извлечения APK-файлов. Он доступен на сайте Android SDK Platform Tools.
Проверка доказательства включения
Проверяющий доказательства включения – это модуль 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
Чтобы клонировать хранилище GitHub android-binary-transparency:
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-файла.
Прежде всего убедитесь, что на вашем устройстве можно использовать adb. Для этого включите отладку по ADB.
Затем найдите, где на устройстве установлен APK-файл. В качестве примера мы будем использовать APK-файл Android System Key Verifier (com.google.android.contactkeys).
computer:~$ adb shell pm list packages -f | grep contactkeys
package:/data/app/~~i5WYSO4PuAAv798-eHdM7A==/com.google.android.contactkeys-PQCKjnn7xDqjeVhcUDibBA==/base.apk=com.google.android.contactkeys
Если APK-файл Android System Key Verifier установлен на вашем устройстве, команда выше вернет путь к нему. В противном случае вы не увидите никаких выходных данных.
Затем скачайте APK-файл с устройства Android на компьютер, используя следующую команду (обратите внимание, что фактическое местоположение и название APK-файла на устройстве могут отличаться):
computer:~$ mkdir -p /tmp/testdir && cd /tmp/testdir
computer:/tmp/testdir$ adb pull /data/app/~~i5WYSO4PuAAv798-eHdM7A==/com.google.android.contactkeys-PQCKjnn7xDqjeVhcUDibBA==/base.apk ./contactkeys_candidate.apk
Чтобы получить и проверить название пакета скачанного APK-файла, сначала распакуйте его. APK-файл – это особый вид ZIP-файла.
computer:/tmp/testdir$ mkdir extracted && unzip contactkeys_candidate.apk -d extracted/
На этом этапе распаковываются все файлы, из которых состоит APK. Название и версию пакета можно найти в манифесте APK-файла, который обычно называется AndroidManifest.xml.
Однако полученный файл манифеста имеет двоичную форму, которая не является удобочитаемой.
Чтобы преобразовать двоичный XML-файл в человекочитаемый формат, мы используем инструмент aapt2, установленный ранее (как требуется в разделе Предварительные требования).
computer:/tmp/testdir$ aapt2 dump badging ./contactkeys_candidate.apk
package: name='com.google.android.contactkeys' versionCode='7805' versionName='1.219.791156583' platformBuildVersionName='Baklava' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='Baklava'
Из приведенных выше данных видно, что название пакета этого APK-файла – com.google.android.contactkeys, а номер версии (versionCode) – 1413.
Теперь мы найдем подпись прозрачности кода в APK. Это должен быть файл с названием code_transparency_signed.jwt, который находится в папке META-INF среди других файлов, извлеченных из APK.
computer:/tmp/testdir$ sha256sum extracted/META-INF/code_transparency_signed.jwt
1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11 code_transparency_signed.jwt
Теперь у нас есть все данные, необходимые для создания полезной нагрузки журнала в соответствии с форматом, описанным в разделе Содержимое журнала. В этом примере соответствующая полезная нагрузка журнала должна выглядеть следующим образом:
1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11
SHA256(Signed Code Transparency JWT)
com.google.android.contactkeys
1143
Также обратите внимание на символ новой строки после версии пакета.
Вы можете сохранить контент в файл, например payload.txt. Это пригодится при последующем тестировании доказательства включения.
Проверка подлинности подписи кода APK
Теперь нужно проверить подлинность токена подписи кода, встроенного в APK. Для этого мы используем bundletool и открытый ключ из пары ключей, которая использовалась для подписи. Они публикуются в каждом разделе соответствующих APK. Предположим, что вы сохранили сертификат открытого ключа (например, для Android System Key Verifier) в файле с названием signing_cert_pubkey.pem. Чтобы проверить подпись кода, следуйте инструкциям ниже.
Сначала создайте ZIP-архив и добавьте в него APK-файл.
computer:/tmp/testdir$ zip -u test.zip contactkeys_candidate.apk
zip warning: test.zip not found or empty
adding: contactkeys_candidate.apk (deflated 58%)
computer:/tmp/testdir$ file test.zip
test.zip: Zip archive data, at least v2.0 to extract, compression method=deflate
Теперь мы можем использовать команду check-transparency инструмента bundletool, чтобы проверить, совпадает ли цифровая подпись кода, встроенная в APK-файл, с опубликованной.
computer:/tmp/testdir$ java -jar BUNDLETOOL_INSTALL_PATH/bundletool-all-version.jar check-transparency \
--mode=apk \
--apk-zip=test.zip \
--transparency-key-certificate=signing_cert_pubkey.pem
APK signature is valid. SHA-256 fingerprint of the apk signing key certificate (must be compared with the developer's public key manually): D9 E1 73 5B 2A 39 51 27 3A 87 35 B7 66 9E F1 9E F5 3A F1 C1 27 5C BA 31 39 3C 18 40 8B 03 79 D0
Code transparency signature verified for the provided code transparency key certificate.
Code transparency verified: code related file contents match the code transparency file.
Убедитесь, что в выходных данных команды указано, что подпись прозрачности кода и прозрачность кода подтверждены.
Если они не совпадают, например вы видите результат Code transparency verification failed because the provided public key
certificate does not match the transparency file, это означает, что целостность кода APK-файла может быть нарушена и доверять ему нельзя.
Убедитесь, что вы проверяете их с помощью правильного сертификата открытого ключа.
Если все остальные проверки пройдены, это означает, что подлинность подписи кода для проверяемого APK подтверждена.
Проверка включения пакета (доказательство включения)
Используя полезную нагрузку, созданную ранее, вы можете проверить, включен ли пакет в журнал прозрачности.
Инструмент для проверки включения опубликован в avb хранилище Android Open Source Project. Чтобы запустить его, выполните следующие действия:
computer:external/avb/tools/transparency/verify$ PAYLOAD_PATH=PATH_TO_PAYLOAD_DIR/payload.txt
computer:external/avb/tools/transparency/verify$ go build cmd/verifier/verifier.go
computer:external/avb/tools/transparency/verify$ ./verifier --payload_path=${PAYLOAD_PATH} --log_type=google_1p_code
Валидатор использует соответствующую контрольную точку и содержимое журнала (находится в каталоге фрагментов), чтобы проверить, есть ли полезная нагрузка APK в журнале прозрачности. Это позволяет убедиться, что приложение действительно опубликовано Google.
Выходные данные команды записываются в stdout:
OK. inclusion check success!, если код пакета включен в журнал;FAILURE, если нет.