Google System Services APK Прозрачность Полная проверка

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

Процесс проверки

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

По сути, для проверки свойства защиты журналов прозрачности от подделки на дереве Меркла выполняются два вычисления: доказательство включения и доказательство согласованности. Первое доказывает, что журнал содержит запись, соответствующую определенной версии APK. Запись в журнале содержит хеш, который представляет собой дайджест SHA256 токена подписи кода в виде JSON Web Token (JWT), который можно получить из соответствующих APK. Второе доказывает, что при добавлении новых записей в дерево новая контрольная точка (криптографически) согласуется с предыдущей версией дерева.

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

Если вы хотите убедиться, что APK-файл, установленный на вашем устройстве, соответствует заявленным характеристикам, обратитесь к описанию ниже.

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

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

Как проверить наличие APK-файла в логе

Как уже упоминалось ранее, список поддерживаемых в настоящее время APK-файлов можно найти на странице «Обзор» .

Предварительные условия для проверки

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

Отладочный мост Android (ADB)

ADB — это инструмент для взаимодействия с устройством Android, доступный на веб-сайте Android SDK Platform Tools.

AAPT2

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

bundletool

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

Верификатор подтверждения включения

Это модуль на языке Go, который мы опубликовали в репозитории Git в рамках проекта Android Open Source Project (AOSP) под названием avb . Он способен запрашивать журнал прозрачности APK-файлов системных служб Google и выводить информацию о том, включен ли пакет в этот журнал. Пример использования можно найти в следующем разделе .

Для загрузки этого инструмента необходимо сначала клонировать репозиторий avb .

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

Исходный код верификатора можно найти в tools/transparency/verify в репозитории avb .

Создайте полезную нагрузку для проверки.

Чтобы убедиться, что извлеченный вами 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-файлу. Не забудьте дважды проверить, что вы проверяете их с помощью правильного сертификата открытого ключа. В противном случае, если все остальное в порядке, это означает, что подлинность подписи кода для проверяемого 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_system_apk

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

Вывод команды записывается в стандартный поток вывода (stdout):

  • OK. inclusion check success! Если код пакета включен в лог,
  • Если это не так, то FAILURE .