Método de verificación

En esta página, se describe un método (con el mayor grado de confianza) para garantizar que puedas ejecutar una versión legítima de la imagen de Pixel en tu dispositivo Pixel. Esto implica descargar una imagen de fábrica en tu computadora y realizar una prueba de inclusión de registros en el artefacto descargado antes de actualizarlo en tu dispositivo.

Cómo verificar tu imagen de fábrica de Pixel

Requisitos previos a la verificación

Antes de continuar para verificar que el artefacto (firmware o APK) cumpla con la declaración, asegúrate de que las siguientes herramientas estén disponibles en una computadora conectada a la red. Según el objetivo de la verificación, es posible que no necesites todas.

Golang

La herramienta de verificación está escrita en Go. Para compilarla, instala Go 1.24 o una versión posterior desde el sitio de Go.

Android Debug Bridge (ADB)

ADB es una herramienta que se comunica con un dispositivo Android para inspeccionar la imagen o extraer APKs, disponible en el sitio web de Android SDK Platform Tools website.

Verificador de pruebas de inclusión

El verificador de pruebas de inclusión es un módulo de Go que consulta el registro de transparencia y muestra si un artefacto está incluido en el registro. Se publica en el repositorio de GitHub android-binary-transparency en https://github.com/android/android-binary-transparency/tree/main

Para clonar el repositorio avb de AOSP, haz lo siguiente:

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

Para clonar el repositorio de GitHub android-binary-transparency, haz lo siguiente:

computer:~$ git clone https://github.com/android/android-binary-transparency

AAPT2

AAPT2 (Android Asset Packaging Tool) es una herramienta de compilación que se usa para compilar y empaquetar los recursos de una app para Android. Se puede encontrar como una herramienta independiente en las Herramientas de compilación del SDK de Android 26.0.2 y versiones posteriores.

bundletool

bundletool es una herramienta que se usa para compilar un Android App Bundle (AAB). También se puede usar para verificar las firmas de código APK. Se puede descargar desde GitHub.

wget o curl

wget y curl son herramientas que se pueden usar para recuperar o descargar archivos de Internet. Asegúrate de tener instalada alguna de estas herramientas, ya que las secuencias de comandos de verificación pueden depender de ellas.

Avbtool

avbtool se usa para calcular el resumen de VBMeta de las imágenes de fábrica y la verificación de archivos binarios. Después de clonar el repositorio avb (como se muestra en la sección Verificador de pruebas de inclusión ), se puede encontrar avbtool.py en el directorio avb clonado. Debes agregar este directorio a tu variable de entorno $PATH.

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

Fbpacktool

fbpacktool es una secuencia de comandos de Python que se usa para desempaquetar componentes individuales en Pixel's bootloader.img. No lo necesitas si verificas APKs. Esta herramienta es importante porque permite que avbtool.py descubra las imágenes necesarias para la verificación.

Para usar esta herramienta, debes descargar las siguientes tres secuencias de comandos de Python en el directorio en el que se encuentra avbtool.py, hacer que fbpacktool.py sea ejecutable, y crear un vínculo simbólico llamado fbpacktool a fbpacktool.py para mayor comodidad.

Si tienes wget, haz lo siguiente:

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

Si tienes curl, haz lo siguiente:

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 ayuda a realizar varias operaciones criptográficas con la terminal en el flujo de trabajo de verificación. Asegúrate de que esté instalado en tu sistema. Para verificarlo en tu terminal, ejecuta el siguiente comando y asegúrate de que el resultado que se muestra no esté vacío:

computer:~$ which openssl
/usr/bin/openssl

Cómo construir la carga útil para la verificación

Para verificar la imagen que tienes en tu dispositivo o una descarga del sitio web de la imagen de fábrica de Pixel, primero debes construir la carga útil correspondiente a esa imagen a partir de la huella digital de compilación y el resumen de VBMeta. Hay dos opciones: manual o automática, como se describe a continuación.

  • Huella digital de compilación: Es un identificador de cadena de la imagen de fábrica.
    • Ejemplo: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
  • Resumen de VBMeta: Es un resumen criptográfico SHA-256 que une las diferentes partes de las imágenes de fábrica.
    • Ejemplo: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

Construcción manual de la carga útil

Para generar manualmente la carga útil para la verificación, debes crear un archivo de texto file, payload.txt que contenga la huella digital de compilación en una línea y, luego, el resumen de VBMeta en la siguiente línea, con una línea nueva vacía (consulta la sección Contenido del registro para obtener el formato exacto).

Después de seguir los pasos del sitio web de la imagen de fábrica, el contenido del archivo payload.txt debería verse de la siguiente manera:

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Cómo extraer el resumen de VBMeta y la huella digital de compilación del sitio web de la imagen de fábrica de Pixel

Cuando descargues una imagen de fábrica de sitio web de la imagen de fábrica de Pixel, deberás descomprimir el archivo descargado, lo que creará otra carpeta en su lugar. Navega a la carpeta recién creada y descomprime el archivo image-*.zip asociado para obtener archivos *.img individuales. Estos archivos binarios son imágenes de partición. Asegúrate de que exista un archivo vbmeta.img entre los archivos img. Deberías ver algo como esto:

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

Puedes extraer la huella digital de compilación y calcular el resumen de VBMeta de todos los archivos descargados.

Después de que avbtool.py esté disponible para tu $PATH, puedes ejecutar los siguientes comandos desde tu terminal para extraer la huella digital de compilación y calcular el resumen de VBMeta de la imagen de fábrica que acabas de descargar:

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
Verificación manual de la imagen de fábrica descargada

Para verificar correctamente la imagen de fábrica descargada, deberás descargar fbpacktool.py y otros dos archivos de Python de los que depende (fbpack.py y packedstruct.py) para desempaquetar los componentes en bootloader.img, ya que se describen individualmente en la estructura VBMeta. Una vez que tengas el desempaquetador, podrás usar fbpacktool.py para desempaquetar la imagen del cargador de arranque. Por ejemplo:

computer:dir_containing_unzipped_images$ python3 fbpacktool.py unpack bootloader-oriole-slider-1.0-7683913.img

Deberías poder ver archivos .img adicionales que aparecen en ese directorio. Ahora, puedes continuar usando avbtool.py para verificar manualmente que coincidan las firmas de las distintas particiones.

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

Si no ves ningún mensaje de error o falla, significa que el VBMeta de la imagen descargada se verificó correctamente.

Construcción automática de la carga útil

Para tu comodidad, también proporcionamos una secuencia de comandos de Python que puedes usar. Con esta herramienta, en lugar de recuperar y descomprimir archivos de forma manual, solo debes especificar la URL de la imagen de fábrica.

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.

Si ejecutas el comando anterior, se descargará el paquete de imágenes de fábrica, se descomprimirá y se verificarán las firmas de las particiones firmadas. Si la verificación se realiza correctamente, se creará un archivo nuevo llamado payload.txt, y su contenido debería verse de manera similar a lo siguiente:

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

Después de que se cree correctamente payload.txt, puedes iniciar los pasos de verificación de inclusión de imágenes.

Cómo verificar la inclusión de imágenes (prueba de inclusión)

Una vez que hayas construido tu carga útil, configura una variable de shell (p.ej., $PAYLOAD_PATH) para que apunte a la ruta de acceso a la carga útil.

Se publicó una herramienta de prueba de inclusión en el avb repositorio dentro del Proyecto de código abierto de Android. Para ejecutarla, haz lo siguiente:

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

El verificador usa el punto de control y el contenido del registro (que se encuentra en el directorio de mosaicos) para verificar que la carga útil de la imagen esté en el registro de transparencia, es decir, que la publique Google.

El resultado del comando se escribe en stdout:

  • OK. inclusion check success! si la imagen está incluida en el registro
  • FAILURE si no lo está