Método de verificação

Esta página descreve um método (com o maior grau de confiança) para garantir que você possa executar uma versão legítima da imagem do Pixel no seu dispositivo. Isso envolve o download de uma imagem de fábrica no computador e a realização de uma prova de inclusão de registro no artefato baixado antes de fazer o flash no dispositivo.

Como verificar a imagem de fábrica do Pixel

Pré-requisitos de verificação

Antes de prosseguir para verificar se o artefato (firmware ou APK) está de acordo com a reivindicação, verifique se as seguintes ferramentas estão disponíveis em um computador conectado à rede. Dependendo do destino da verificação, talvez você não precise de todas elas.

Golang

A ferramenta de verificação é escrita em Go. Para criar, instale o Go 1.24 ou mais recente no site do Go.

Android Debug Bridge

ADB é uma ferramenta que se comunica com um dispositivo Android para inspecionar a imagem ou extrair APKs, disponível no Android SDK Platform Tools website.

Verificador de prova de inclusão

O verificador de prova de inclusão é um módulo Go que consulta o registro de transparência e informa se um artefato está incluído no registro. Ele é publicado no repositório android-binary-transparency do GitHub em https://github.com/android/android-binary-transparency/tree/main

Para clonar o repositório avb do AOSP:

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

Para clonar o repositório android-binary-transparency do GitHub:

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

AAPT2

O AAPT2 (Android Asset Packaging Tool) é uma ferramenta de build usada para compilar e empacotar recursos de um app Android. Ele pode ser encontrado como uma ferramenta independente no Android SDK Build Tools versão 26.0.2 e mais recentes.

bundletool

O bundletool é uma ferramenta usada para criar um Android App Bundle (AAB). Ele também pode ser usado para verificar assinaturas de código APK. Ele pode ser baixado do GitHub.

wget ou curl

wget e curl são ferramentas que podem ser usadas para recuperar ou baixar arquivos da Internet. Verifique se uma dessas ferramentas está instalada, porque os scripts de verificação podem depender delas.

Avbtool

avbtool é usado para calcular o resumo do VBMeta das imagens de fábrica e a verificação de binários. Depois de clonar o repositório avb (conforme mostrado na seção Verificador de prova de inclusão ), avbtool.py pode ser encontrado no diretório avb clonado. Adicione esse diretório à variável de ambiente $PATH.

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

Fbpacktool

fbpacktool é um script Python usado para descompactar componentes individuais no bootloader.img. Você não precisa disso se estiver verificando APKs. Essa ferramenta é importante porque permite que avbtool.py descubra as imagens necessárias para a verificação.

Para usar essa ferramenta, baixe os três scripts Python a seguir para o diretório em que avbtool.py está, torne fbpacktool.py executável, e crie um link simbólico chamado fbpacktool para fbpacktool.py para facilitar.

Se você tiver 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

Se você tiver 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 ajuda a realizar várias operações criptográficas usando o terminal no fluxo de trabalho de verificação. Verifique se ele está instalado no seu sistema. Você pode verificar no terminal executando o comando a seguir e conferindo se o resultado retornado não está vazio:

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

Criar o payload para verificação

Para verificar a imagem no seu dispositivo ou um download do site da imagem de fábrica do Pixel, primeiro crie o payload correspondente a essa imagem na impressão digital do build e no resumo do VBMeta. Há duas opções, manual ou automática, conforme descrito abaixo.

  • Impressão digital do build: um identificador de string da imagem de fábrica
    • Exemplo: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
  • Resumo do VBMeta: um resumo criptográfico SHA-256 que une as diferentes partes das imagens de fábrica
    • Exemplo: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

Criação manual de payload

Para gerar manualmente o payload para verificação, crie um arquivo de texto , payload.txt que contenha a impressão digital do build em uma linha e o resumo do VBMeta na linha seguinte, com uma nova linha vazia (consulte a seção Conteúdo do registro para o formato exato).

Depois de seguir as etapas do site da imagem de fábrica, o conteúdo do arquivo payload.txt será assim:

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Extrair o resumo do VBMeta e a impressão digital do build do site da imagem de fábrica do Pixel

Ao baixar uma imagem de fábrica do site da imagem de fábrica do Pixel, você precisará descompactar o arquivo baixado, o que criará outra pasta no lugar. Navegue até a pasta recém-criada e descompacte o arquivo image-*.zip associado para receber arquivos *.img individuais. Esses binários são imagens de partição. Verifique se um arquivo vbmeta.img existe entre os arquivos img. Você vai conferir algo parecido com:

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

Você pode extrair a impressão digital do build e calcular o resumo do VBMeta de todos os arquivos baixados.

Depois que avbtool.py estiver disponível para seu $PATH, você poderá emitir os comandos a seguir no terminal para extrair a impressão digital do build e calcular o resumo do VBMeta da imagem de fábrica que acabou de baixar:

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
Verificação manual da imagem de fábrica baixada

Para verificar corretamente a imagem de fábrica baixada, você precisará baixar fbpacktool.py e outros dois arquivos Python dos quais ele depende (fbpack.py e packedstruct.py) para descompactar os componentes em bootloader.img, conforme descrito individualmente na estrutura VBMeta. Depois de ter o descompactador, você pode usar o fbpacktool.py para descompactar a imagem do carregador de inicialização. Por exemplo:

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

Você poderá ver outros arquivos .img aparecendo nesse diretório. Agora, você pode usar avbtool.py para verificar manualmente se as assinaturas das várias partições correspondem.

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

Se você não encontrar mensagens de erro ou falha, isso significa que o VBMeta da imagem baixada foi verificado.

Criação automática de payload

Para sua conveniência, também fornecemos um script Python que você pode usar. Com essa ferramenta, em vez de buscar e descompactar arquivos manualmente, você só precisa especificar o URL da imagem 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.

A execução do comando acima vai baixar o pacote de imagem de fábrica, descompactar o pacote e verificar as assinaturas das partições assinadas. Após a verificação, ele vai criar um novo arquivo chamado payload.txt, e o conteúdo dele será semelhante ao abaixo:

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

Depois que o payload.txt for criado, você poderá iniciar as etapas de verificação da inclusão de imagens.

Verificar a inclusão de imagens (prova de inclusão)

Depois de criar o payload, defina uma variável de shell (por exemplo, $PAYLOAD_PATH) para apontar para o caminho do payload.

Uma ferramenta de prova de inclusão foi publicada no avb repositório no Android Open Source Project. Para executar:

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

O verificador usa o ponto de verificação e o conteúdo do registro (encontrado no diretório de blocos) para verificar se o payload da imagem está no registro de transparência, ou seja, se ele foi publicado pelo Google.

A saída do comando é gravada em stdout:

  • OK. inclusion check success! se a imagem estiver incluída no registro,
  • FAILURE se não estiver.