На этой странице описаны различные методы, позволяющие убедиться в том, что установленный на вашем устройстве 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.