На этой странице описаны различные методы обеспечения соответствия APK-файла, установленного на вашем устройстве Android, утверждению, сделанному в модели заявителя . Это включает в себя извлечение соответствующего APK с вашего устройства, проверку целостности его кода и выполнение проверки включения журнала для извлеченного артефакта.
Процесс проверки
Журнал прозрачности реализован с помощью дерева Меркла, состоящего из хешей. Листовой узел содержит данные, а родительский узел содержит хэш своих дочерних узлов.
По сути, на дереве Меркла выполняются два вычисления для проверки свойства защиты журналов прозрачности от несанкционированного доступа: доказательство включения и доказательство согласованности. Первое доказывает, что в журнале есть запись, соответствующая определенной версии APK. Запись журнала включает в себя хэш, который представляет собой дайджест SHA256 токена подписи кода в форме веб-токена JSON (JWT), который можно получить из соответствующих APK. Последнее доказывает, что когда в дерево добавляются новые записи, новая контрольная точка (криптографически) согласуется с предыдущей версией дерева.
Чтобы проверить защищенный APK, выполните проверку включения на основе проверенной контрольной точки. Обратите внимание, что мы планируем интегрировать этот журнал с общедоступной сетью-свидетелем, используя стандартизированный протокол свидетеля . Это обеспечит засвидетельствованную контрольную точку, гарантирующую согласованность журнала.
Если вы хотите убедиться, что APK, установленный на вашем устройстве, соответствует заявлению, изложенному в модели истца, обратитесь к описанию ниже.
Доказательство включения
Пользователь Android может проверить наличие защищенного APK на своем устройстве в журнале, сначала извлекая APK и соответствующие метаданные, а затем сравнивая перевычисленный корневой хэш с корневым хешем, содержащимся в опубликованной контрольной точке. Если они совпадают, то пользователь Android может быть уверен в некоторой защите, описанной в модели угроз.
Как проверить включение APK в журнал
Как описано ранее, список APK-файлов, которые в настоящее время распространяются на него, можно найти на странице «Обзор» .
Предварительные условия для проверки
Прежде чем приступить к проверке соответствия APK-файла, который вы только что извлекли со своего устройства, нашему заявлению, вам потребуются следующие инструменты, установив их с компьютера, подключенного к сети.
Мост отладки Android (ADB)
ADB
— это инструмент, взаимодействующий с устройством Android, доступный на веб-сайте Android SDK Platform Tools.
пакетный инструмент
bundletool
— это инструмент, который используется для создания пакета приложений Android (AAB). Его также можно использовать для преобразования AAB в APK-файлы, которые можно установить на устройства. Его можно скачать с GitHub .
Андрогард
Androguard — это набор инструментов, который используется для анализа APK. Его можно скачать и установить с сайта Androguard.
Верификатор доказательства включения
Это модуль Go, который мы опубликовали в репозитории git в рамках проекта Android с открытым исходным кодом (AOSP) под названием avb
. Он способен запрашивать журнал прозрачности APK Google System Services и выводить информацию о том, включен ли пакет в журнал. Пример того, как это используется, можно найти в следующем разделе .
Чтобы загрузить этот инструмент, вам необходимо сначала клонировать репозиторий 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, поскольку APK в конечном итоге представляет собой особый вид ZIP-файла.
computer:/tmp/testdir$ mkdir extracted && unzip contactkeys_candidate.apk -d extracted/
На этом этапе распаковываются все файлы, составляющие APK. Имя и версию пакета можно найти в манифесте APK, который обычно находится в файле AndroidManifest.xml
.
Однако полученный файл манифеста находится в двоичной форме, которая не читается человеком. Чтобы преобразовать двоичный XML в удобочитаемую форму, мы используем инструмент axml
из пакета androguard
(который необходимо установить в разделе «Предварительные требования »).
computer:/tmp/testdir$ androguard axml extracted/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1413" android:versionName="1.48.688082145" android:compileSdkVersion="35" android:compileSdkVersionCodename="VanillaIceCream" android:requiredSplitTypes="" android:splitTypes="" package="com.google.android.contactkeys" platformBuildVersionCode="35" platformBuildVersionName="VanillaIceCream">
Из приведенного выше вывода мы теперь можем быть уверены, что имя пакета этого 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 с открытым исходным кодом. Чтобы запустить его:
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
Верификатор использует соответствующую контрольную точку и содержимое журнала (находится в каталоге плиток ), чтобы проверить наличие полезных данных APK в журнале прозрачности и убедиться, что они действительно опубликованы Google.
Вывод команды записывается в стандартный вывод:
-
OK. inclusion check success!
если код пакета включен в журнал, -
FAILURE
если это не так.