Página de detalles técnicos de transparencia binaria de Pixel

El registro de transparencia binaria de Pixel aprovecha la tecnología de registro de transparencia.

La utilidad de los registros de transparencia se demostró con el Certificado de transparencia, un protocolo de Internet que requiere que las autoridades certificadoras publiquen los certificados que emiten en registros de transparencia de certificados públicos. Este proceso redujo en gran medida la emisión incorrecta de certificados, lo que aumentó la seguridad de Internet. Muchos operadores de registros de transparencia de certificados se basan en una implementación de registros de transparencia que se encuentra en transparency.dev.

Los registros de transparencia se implementan con árboles Merkle. En esta página, se supone que tienes conocimientos generales sobre los árboles Merkle y la transparencia binaria. Consulta Estructuras de datos verificables para obtener una descripción general de los árboles Merkle y la página de destino para obtener una descripción general de la transparencia binaria.

Implementación de registros

El registro de transparencia binaria de Pixel se implementa como un árbol Merkle basado en mosaicos. La raíz del contenido de los mosaicos se publica en https://developers.google.com/android/binary_transparency/tile. Nota: Esta no es una página web normal. Las entradas de registro que se encuentran en sus subdirectorios se deben leer de forma programática con la biblioteca SumDB TLog de Golang y no a través de un navegador.

Consulta Contenido de los registros para obtener una descripción de lo que contienen las entradas.

El hash raíz del árbol Merkle de un registro, que se encuentra en un punto de control, se publica en https://developers.google.com/android/binary_transparency/checkpoint.txt. Se presenta en el formato de punto de control. Las hojas de este árbol Merkle se publican en https://developers.google.com/android/binary_transparency/image_info.txt. La firma del punto de control se puede verificar con la siguiente clave pública:

-----BEGIN CERTIFICATE-----
MIICPDCCAeOgAwIBAgIVAPooxISw/nFF/dPwmCUaV36Z4s3hMAoGCCqGSM49BAMCMHQxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYD
VQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAgFw0y
MTA3MTkyMjQxNDFaGA8yMDUxMDcxOTIyNDE0MVowdDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNh
bGlmb3JuaWExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC0dvb2dsZSBJbmMuMRAw
DgYDVQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRyb2lkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD
QgAEU83uXNUiTYE53c2TfdWmqpW20bBXy4KEf5Ff8dV8GLKlVAXKHyjw3Lp9J3E0yCRJ/39XKeuA
AMF7KzSvhD248KNQME4wDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUHRpvuNkzjtBY213BWgUyWWHm
3VYwHwYDVR0jBBgwFoAUHRpvuNkzjtBY213BWgUyWWHm3VYwCgYIKoZIzj0EAwIDRwAwRAIgZsZb
CNBXRkCKLS+LG/41VWj1cTszt9QCdJQNuy7aT94CIDPgn7v5b1ykBVUTuLgRSofxAzHg9R4dg1oA
7tTFAuDg
-----END CERTIFICATE-----

El proceso de verificación lee el punto de control y los mosaicos que contienen las entradas de registro del registro.

Proceso de verificación

Un registro de transparencia se implementa con un árbol Merkle que consta de hashes. Un nodo hoja contiene datos, y un nodo superior contiene el hash de sus elementos secundarios.

Se realizan dos cálculos en el árbol Merkle para verificar la propiedad de evidencia de manipulación de los registros de transparencia: la prueba de inclusión y la prueba de coherencia. La primera demuestra que el registro incluye una entrada correspondiente a una versión de imagen, es decir, la entrada de registro incluye el resumen de VBMeta, un hash que representa las imágenes del SO, que se puede mostrar desde un dispositivo. La segunda demuestra que, cuando se agregan entradas nuevas al árbol, el nuevo punto de control es coherente con la versión anterior del árbol.

Para verificar tu imagen de Pixel, realiza la prueba de inclusión. Realizar el cálculo de la prueba de coherencia es opcional, ya que terceros lo hacen de forma continua.

Si quieres familiarizarte con los conceptos de verificación en la transparencia binaria de Pixel, puedes seguir las instrucciones que se indican a continuación para usar la imagen que se ejecuta en tu dispositivo Pixel. Si quieres ejecutar el firmware de Pixel con el mayor grado de confianza, consulta el proceso de verificación en Verificación completa de la transparencia binaria de Pixel.

Requisitos previos a la verificación

Antes de continuar para verificar que el artefacto (firmware o APK) esté de acuerdo con la reclamación, asegúrate de que las siguientes herramientas estén disponibles en una computadora conectada a la red. Según el objetivo de 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 Herramientas de la plataforma del SDK de Android.

Verificador de prueba de inclusión

El verificador de prueba 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 Herramientas de compilación del SDK de Android versión 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 prueba 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 donde 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

Prueba de inclusión

Un propietario de Pixel puede verificar que su imagen esté en el registro. Para ello, primero debe extraer los metadatos pertinentes y, luego, comparar el hash raíz recalculado con el hash raíz que se encuentra en el punto de control publicado. Si coinciden, el propietario de Pixel puede tener la certeza de que cuenta con algunas protecciones que se ejemplifican en el Modelo de amenazas.

Para verificar que la imagen de un dispositivo Pixel esté en el registro de transparencia, conéctate al dispositivo con adb y, luego, ejecuta los siguientes comandos:

FINGERPRINT=$(adb shell getprop ro.build.fingerprint)
VBMETA_DIGEST=$(adb shell getprop ro.boot.vbmeta.digest)
LOG_ENTRY="${FINGERPRINT}\n${VBMETA_DIGEST}\n"
PAYLOAD_PATH="/tmp/log_payload.txt"
echo -e $LOG_ENTRY >> $PAYLOAD_PATH

cd avb/tools/transparency/verify/
go build cmd/verifier/verifier.go
./verifier --payload_path=$PAYLOAD_PATH

La primera estrofa recupera los metadatos de un dispositivo Pixel en el formato de una entrada de registro y los guarda en /tmp/log_payload.txt.

La segunda estrofa ejecuta el verificador de prueba de inclusión publicado en el repositorio de Android Verified Boot. Esta herramienta calcula el hash de la entrada de registro candidata, recupera los otros hashes necesarios para volver a calcular el punto de control del registro y lo compara con el punto de control publicado por el registro.

El resultado del comando se escribe en stdout:

  • OK si la imagen está incluida en el registro
  • FAILURE si no lo está

Prueba de coherencia (opcional)

Como Google lanza periódicamente versiones nuevas de la imagen de fábrica de Pixel, el registro de transparencia crece de forma continua. Un testigo verifica que el árbol crezca de una manera coherente con sus hojas anteriores. El testigo realiza un seguimiento del hash raíz del árbol y calcula el siguiente hash raíz candidato solicitando los nuevos hashes de hojas del árbol. Para que un registro de transparencia sea evidente de manipulación, se debe verificar continuamente su coherencia.

El comportamiento de solo anexar del registro de transparencia es verificado de forma activa por terceros, por lo que la mayoría de los usuarios no necesitan hacerlo por su cuenta, pero cualquier persona puede supervisar la coherencia del registro. Google publicó una implementación de código abierto de un testigo en este repositorio de GitHub. Es necesario usar la configuración específica del registro de transparencia binaria de Pixel (PixelBT).