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
- Exemplo:
- Resumo VBMeta: um resumo criptográfico SHA-256 que vincula os diferentes
fragmentos das imagens de fábrica.
- Exemplo:
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
- Exemplo:
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
.