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 Pixel. Isso envolve fazer o download de uma imagem de fábrica no computador e realizar uma prova de inclusão de registro no artefato baixado antes de atualizar o dispositivo.

Como verificar a imagem de fábrica do Pixel

Pré-requisitos para verificação

Antes de verificar se a imagem de fábrica que você acabou de fazer o download está de acordo com nossa reivindicação, faça o seguinte em um computador conectado à rede.

Golang

A ferramenta de verificação é escrita em Go. Para criá-la, instale o Go 1.17 ou mais recente no site do Go.

wget ou curl

wget e curl são ferramentas que podem ser usadas para extrair ou fazer o download de arquivos da Internet. Verifique se uma dessas ferramentas está instalada no seu sistema, porque o restante deste guia e o script que fornecemos dependem de uma delas estar presente.

Avbtool

O avbtool é usado para calcular o resumo do VBMeta das imagens de fábrica e a verificação de binários.

É possível fazer o download dele no repositório do AOSP usando o comando abaixo e encontrar mais detalhes na documentação vinculada.

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

Depois de clonar esse repositório, avbtool.py pode ser encontrado no diretório de repositório avb clonado. Além disso, adicione esse diretório à sua variável de ambiente $PATH.

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

Verificador de prova de inclusão

O verificador de prova de inclusão é um módulo Go que consulta o registro de transparência de imagens do Pixel Factory e informa se uma imagem está incluída no registro.

Depois de clonar o repositório AVB acima, o código-fonte do verificador é encontrado em tools/transparency/verify/

Fbpacktool

O fbpacktool é um script Python usado para descompactar componentes individuais no bootloader.img do Pixel. Essa ferramenta é importante para permitir que o avbtool.py descubra as imagens necessárias para a verificação.

Para usar essa ferramenta, faça o download dos três scripts do Python a seguir no diretório em que o avbtool.py está localizado, torne o fbpacktool.py executável e crie um link simbólico chamado fbpacktool para fbpacktool.py para conveniência.

Se você tiver wget, poderá emitir o seguinte comando para fazer o download dos três scripts:

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, poderá emitir os seguintes comandos para fazer o download dos três scripts:

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

Você também precisa de uma ferramenta chamada openssl para realizar várias operações criptográficas usando o terminal no fluxo de verificação. Verifique se ele está instalado no seu sistema. Para verificar o terminal, emita o comando a seguir e verifique se o resultado retornado não está vazio. Exemplo:

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

Criar o payload para verificação

Para verificar a imagem que você tem no dispositivo ou um download do site de imagem do Pixel Factory, primeiro construa o payload correspondente a essa imagem usando a impressão digital do build e o resumo 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 VBMeta: um resumo criptográfico SHA-256 que vincula os diferentes fragmentos das imagens de fábrica.
    • Exemplo: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

Criação manual de payload

Para gerar manualmente o payload para verificação, é necessário criar um arquivo de texto, payload.txt, que contenha a impressão digital do build em uma linha e o resumo do VBMeta na próxima linha, com uma nova linha vazia. Consulte a seção "Conteúdo do registro" para saber o formato exato.

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

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

Ao fazer o download de uma imagem de fábrica do site de imagens de fábrica do Pixel, é necessário descompactar o arquivo salvo, o que cria outra pasta no local. 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ções. Verifique se há um arquivo vbmeta.img entre os arquivos img. Você verá algo como:

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

É possível extrair a impressão digital do build e calcular o resumo do VBMeta de todos os arquivos salvos.

Depois que o avbtool.py for disponibilizado para o $PATH, será possível 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 você acabou de fazer o download:

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 transferida por download

Para verificar corretamente a imagem de fábrica transferida por download, você precisa fazer o download de fbpacktool.py e de dois outros arquivos Python de que ele depende (fbpack.py e packedstruct.py) para descompactar os componentes em bootloader.img, já que eles são descritos individualmente na estrutura VBMeta. Depois de ter o descompactador, é possível usar o fbpacktool.py para descompactar a imagem do carregador de inicialização. Exemplo:

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

Você vai notar que outros arquivos .img vão aparecer 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 receber nenhuma mensagem de erro ou falha, isso significa que o VBMeta da imagem transferida por download foi verificado.

Criação automática de payload

Para sua conveniência, também disponibilizamos 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 fazer o download do pacote de imagem de fábrica, descompactar o pacote e verificar as assinaturas das partições assinadas. Após a verificação bem-sucedida, um novo arquivo chamado payload.txt será criado, 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.

Como verificar a inclusão de imagens (Inclusion Proof)

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 repositório avb do 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 checkpoint 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.