На этой странице описан метод (с наибольшей степенью достоверности), позволяющий гарантировать возможность запуска легитимной версии образа Pixel на вашем устройстве Pixel. Он включает в себя загрузку заводского образа на ваш компьютер и проверку включения логов загруженного файла перед его прошивкой на устройство.
Как проверить образ Pixel Factory
Предварительные условия проверки
Прежде чем приступать к проверке соответствия артефакта (прошивки или APK-файла) заявленным характеристикам, убедитесь, что на компьютере, подключенном к сети, доступны следующие инструменты. В зависимости от цели проверки, вам могут не понадобиться все из них.
Golang
Инструмент проверки написан на языке Go. Для его сборки установите Go версии 1.24 или более поздней с сайта Go .
Отладочный мост Android (ADB)
ADB — это инструмент, который взаимодействует с устройством Android для проверки образа или извлечения APK-файлов; его можно найти на веб-сайте Android SDK Platform Tools.
Верификатор подтверждения включения
Модуль проверки наличия артефакта в логе — это модуль Go, который запрашивает информацию из лога прозрачности и выводит, включен ли артефакт в лог. Он опубликован в репозитории android-binary-transparency на GitHub по адресу 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-приложения (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 обнаруживать необходимые образы для проверки.
Для использования этого инструмента вам следует загрузить следующие три скрипта Python в каталог, где находится ваш файл avbtool.py , сделать файл fbpacktool.py исполняемым и для удобства создать символическую ссылку с именем fbpacktool на файл fbpacktool.py .
Если у вас установлен wget :
computer:dir_to_avbtool$ wget https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool
Если у вас curl :
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.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
Создайте полезную нагрузку для проверки.
Для проверки образа, находящегося на вашем устройстве или загруженного с веб-сайта Pixel Factory Image, необходимо сначала сформировать полезную нагрузку, соответствующую этому образу, на основе Build Fingerprint и VBMeta Digest. Доступны два варианта: ручной или автоматический, как описано ниже.
- Отпечаток сборки: строковый идентификатор образа фабрики.
- Пример:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
- Пример:
- VBMeta Digest: криптографический дайджест SHA-256, связывающий различные части образов фабрики воедино.
- Пример:
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
- Пример:
Ручное конструирование полезной нагрузки
Для ручной генерации полезной нагрузки для проверки необходимо создать текстовый файл payload.txt , содержащий отпечаток сборки на одной строке, а затем дайджест VBMeta на следующей строке с пустым переносом строки (точный формат см. в разделе «Содержимое журнала» ).
После выполнения инструкций с сайта Factory Image содержимое файла payload.txt должно выглядеть следующим образом:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Извлечение дайджеста VBMet и отпечатка сборки с веб-сайта Pixel Factory Image.
При загрузке заводского образа с сайта Pixel Factory Image вам потребуется распаковать загруженный файл, в результате чего будет создана новая папка. Перейдите в эту папку и распакуйте соответствующий image-*.zip , чтобы получить отдельные файлы *.img . Эти бинарные файлы представляют собой образы разделов. Убедитесь, что среди файлов img есть файл vbmeta.img . Вы должны увидеть что-то подобное:
computer:oriole-sd1a.210817.015.a4$ unzip image-oriole-sd1a.210817.015.a4.zip
Archive: image-oriole-sd1a.210817.015.a4.zip
inflating: android-info.txt
inflating: boot.img
inflating: vendor_boot.img
inflating: system.img
inflating: vendor.img
inflating: product.img
inflating: system_ext.img
inflating: system_other.img
inflating: dtbo.img
inflating: vbmeta_system.img
inflating: vbmeta.img
inflating: super_empty.img
Вы можете извлечь отпечаток сборки и вычислить дайджест VBMeta из всех загруженных файлов.
После того, как avbtool.py будет добавлен в переменную $PATH , вы можете выполнить следующие команды в терминале, чтобы извлечь отпечаток сборки и вычислить дайджест VBMeta образа фабрики, который вы только что загрузили:
computer:dir_containing_unzipped_factory_image~$ grep -a 'ro\..*build\.fingerprint=google/.*/release-keys' system.img | cut -f2 -d'='
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
computer:dir_containing_unzipped_factory_image$ avbtool.py calculate_vbmeta_digest --image vbmeta.img
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Ручная проверка загруженного образа заводской конфигурации.
Для корректной проверки загруженного образа фабрики вам потребуется загрузить fbpacktool.py и два других файла Python, от которых он зависит ( fbpack.py и packedstruct.py ), чтобы распаковать компоненты из bootloader.img , поскольку они описаны в структуре VBMeta. После загрузки распаковщика вы можете использовать fbpacktool.py для распаковки образа загрузчика. Например:
computer:dir_containing_unzipped_images$ python3 fbpacktool.py unpack bootloader-oriole-slider-1.0-7683913.img
В этой директории должны появиться дополнительные файлы .img. Теперь вы можете использовать avbtool.py для ручной проверки соответствия сигнатур различных разделов.
computer:dir_containing_unzipped_images$ avbtool.py verify_image --image vbmeta.img --follow_chain_partitions
Verifying image vbmeta.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta.img
vbmeta_system: Chained but ROLLBACK_SLOT (which is 1) and KEY (which has sha1 df529646b7225015196a714006346f0768b87fcf) not specified
--
Verifying image vbmeta_system.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta_system.img
product: Successfully verified sha256 hashtree of product.img for image of 2700468224 bytes
system: Successfully verified sha256 hashtree of system.img for image of 878493696 bytes
system_ext: Successfully verified sha256 hashtree of system_ext.img for image of 251334656 bytes
vbmeta_vendor: Chained but ROLLBACK_SLOT (which is 3) and KEY (which has sha1 85322346680a860c091fa14a64cef1fe4a3ffe31) not specified
--
Verifying image vbmeta_vendor.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta_vendor.img
vendor: Successfully verified sha256 hashtree of vendor.img for image of 472940544 bytes
boot: Chained but ROLLBACK_SLOT (which is 2) and KEY (which has sha1 85322346680a860c091fa14a64cef1fe4a3ffe31) not specified
--
Verifying image boot.img using embedded public key
vbmeta: Successfully verified footer and SHA256_RSA4096 vbmeta struct in boot.img
boot: Successfully verified sha256 hash of boot.img for image of 24481792 bytes
abl: Successfully verified sha256 hash of abl.img for image of 1744896 bytes
bl1: Successfully verified sha256 hash of bl1.img for image of 12288 bytes
bl2: Successfully verified sha256 hash of bl2.img for image of 544768 bytes
bl31: Successfully verified sha256 hash of bl31.img for image of 86016 bytes
dtbo: Successfully verified sha256 hash of dtbo.img for image of 2152234 bytes
gsa: Successfully verified sha256 hash of gsa.img for image of 262144 bytes
ldfw: Successfully verified sha256 hash of ldfw.img for image of 4096000 bytes
pbl: Successfully verified sha256 hash of pbl.img for image of 49152 bytes
tzsw: Successfully verified sha256 hash of tzsw.img for image of 4304896 bytes
vendor_boot: Successfully verified sha256 hash of vendor_boot.img for image of 25718784 bytes
vendor_dlkm: Successfully verified sha256 hashtree of vendor_dlkm.img for image of 54505472 bytes
Если вы не видите никаких сообщений об ошибках или сбоях, это означает, что VBMet-файл загруженного образа успешно проверен.
Автоматическое конструирование полезной нагрузки
Для вашего удобства мы также предоставили скрипт на Python, который вы можете использовать. С помощью этого инструмента вам не нужно вручную загружать и распаковывать файлы, достаточно указать URL-адрес образа заводской сборки.
computer:dir_to_avb_repo/tools/transparency$ python3 ./pixel_factory_image_verify.py https://dl.google.com/dl/android/aosp/oriole-sd1a.210817.015.a4-factory-074b7f51.zip
Fetching file from: https://dl.google.com/dl/android/aosp/oriole-sd1a.210817.015.a4-factory-074b7f51.zip
Successfully downloaded file.
Successfully unpacked factory image.
Successfully unpacked factory image partitions.
Successfully unpacked bootloader image.
Successfully verified VBmeta.
Successfully extracted build fingerprint.
Successfully calculated VBMeta Digest.
The build fingerprint for factory image is: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
The VBMeta Digest for factory image is: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
A corresponding "payload.txt" file has been created.
Выполнение указанной выше команды загрузит заводской образ пакета, распакует его и проверит подписи подписанных разделов. В случае успешной проверки будет создан новый файл с именем payload.txt , содержимое которого должно выглядеть примерно так:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
После успешного создания файла payload.txt вы можете приступить к проверке включения изображений .
Проверка наличия изображения (подтверждение наличия изображения)
После того, как вы сформировали полезную нагрузку, установите переменную оболочки (например $PAYLOAD_PATH ), указывающую путь к полезной нагрузке.
В репозитории avb проекта Android Open Source Project опубликован инструмент для проверки включения. Чтобы запустить его:
computer:external/avb/tools/transparency/verify$ PAYLOAD_PATH=../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=pixel
Верификатор использует контрольную точку и содержимое журнала (находящиеся в каталоге tile ), чтобы проверить, что ваше изображение содержится в журнале прозрачности, то есть опубликовано Google.
Вывод команды записывается в стандартный поток вывода (stdout):
-
OK. inclusion check success!Если изображение включено в лог, - Если это не так, то
FAILURE.