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 registro en el artefacto descargado antes de escribirlo en la memoria flash de tu dispositivo.
Cómo verificar la imagen de fábrica de tu Pixel
Requisitos previos para la verificación
Antes de verificar que la imagen de fábrica que acabas de descargar cumpla con nuestro reclamo, deberás hacer lo siguiente desde una computadora conectada a la red.
Golang
La herramienta de verificación está escrita en Go. Para compilarla, instala Go 1.17 o una versión posterior desde el sitio de Go.
wget o curl
wget y curl son herramientas que se pueden usar para recuperar o descargar archivos de Internet. Asegúrate de tener cualquiera de estas herramientas instalada en tu sistema, ya que el resto de esta guía y la secuencia de comandos que proporcionamos dependen de que una de ellas esté presente.
Avbtool
avbtool se usa para calcular el resumen de VBMeta de las imágenes de fábrica y verificar los objetos binarios.
Puedes descargarlo del repositorio de AOSP con el siguiente comando y encontrar más detalles en la documentación vinculada.
computer:~$ git clone https://android.googlesource.com/platform/external/avb
Después de clonar ese repositorio, avbtool.py
se puede encontrar en el directorio del repositorio avb
clonado. Además, debes agregar este directorio a la variable de entorno $PATH
.
computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL
Verificador de prueba de inclusión
El verificador de prueba de inclusión es un módulo Go que consulta el registro de transparencia de las imágenes de Pixel Factory y muestra si se incluye una imagen en el registro.
Después de clonar el repositorio de AVB anterior, el código fuente del verificador se encuentra en tools/transparency/verify/
.
Fbpacktool
fbpacktool es una secuencia de comandos de Python que se usa para descomprimir componentes individuales en bootloader.img
de Pixel. Esta herramienta es importante para permitir 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 tu avbtool.py
, hacer que fbpacktool.py
sea ejecutable y crear un symlink llamado fbpacktool
a fbpacktool.py
para mayor comodidad.
Si tienes wget
, puedes emitir el siguiente comando para descargar las tres
secuencias de comandos:
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
, puedes emitir los siguientes comandos para descargar las tres
secuencias de comandos:
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
También necesitas una herramienta llamada openssl para 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 verificar tu terminal, emite el siguiente comando y asegúrate de que el resultado que se muestra no esté vacío. Por ejemplo:
computer:~$ which openssl
/usr/bin/openssl
Construye la carga útil para la verificación
Para verificar la imagen que tienes en tu dispositivo o una descarga del sitio web de Pixel Factory Image, primero debes crear la carga útil correspondiente a esa imagen a partir de la huella digital de compilación y el resumen de VBMeta. Existen 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
- Ejemplo:
- Resumen de VBMeta: Es un resumen criptográfico SHA-256 que une las diferentes partes de las imágenes de fábrica.
- Ejemplo:
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
- Ejemplo:
Construcción manual de la carga útil
Para generar manualmente la carga útil para la verificación, debes crear un archivo de texto, 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 de registro para conocer 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
Extrae el resumen de VBMeta y la huella digital de compilación del sitio web de la imagen de fábrica del Pixel
Cuando descargues una imagen de fábrica del sitio web de Imágenes de fábrica de Pixel, deberás descomprimir el archivo descargado, lo que creará otra carpeta. Navega a la carpeta recién creada y descomprime el archivo image-*.zip
asociado para obtener archivos *.img
individuales. Estos objetos binarios son imágenes de partición. Asegúrate de que exista un archivo vbmeta.img
entre los archivos img.
Debería 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 emitir los siguientes comandos desde la 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 descomprimir los componentes en bootloader.img
, como se describe de forma individual en la estructura de VBMeta. Una vez que tengas el desempaquetador, puedes usar fbpacktool.py
para descomprimir la imagen del bootloader. Por ejemplo:
computer:dir_containing_unzipped_images$ python3 fbpacktool.py unpack bootloader-oriole-slider-1.0-7683913.img
Deberías ver archivos .img adicionales en ese directorio.
Ahora, puedes usar avbtool.py
para verificar de forma manual que las firmas
de las distintas particiones coincidan.
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 es correcta, se creará un archivo nuevo llamado payload.txt
, y su contenido debería ser similar al siguiente:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Una vez que se cree correctamente el archivo payload.txt, puedes comenzar los pasos de verificación de inclusión de imágenes.
Verifica la inclusión de imágenes (prueba de inclusión)
Una vez que hayas creado la carga útil, establece 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 repositorio avb
dentro del Proyecto de código abierto de Android. Para ejecutarlo, 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 tarjetas) para verificar que la carga útil de tu imagen esté en el registro de transparencia, es decir, que Google la haya publicado.
El resultado del comando se escribe en stdout:
OK. inclusion check success!
si la imagen se incluye en el registroFAILURE
si no lo es.