O registro de transparência binária do Pixel usa a tecnologia de registro de transparência.
A utilidade dos registros de transparência foi comprovada com a Transparência dos certificados, um protocolo da Internet que exige que as autoridades de certificação publiquem os certificados emitidos em registros públicos de Transparência dos certificados. Esse processo reduziu muito a emissão incorreta de certificados, aumentando a segurança da Internet. Muitos operadores de registros de Transparência dos certificados dependem de uma implementação de registros de transparência encontrados em transparency.dev (link em inglês).
Os registros de transparência são implementados com árvores Merkle. Esta página pressupõe conhecimento geral sobre árvores de Merkle e transparência binária. Consulte Estruturas de dados verificáveis para uma visão geral das árvores de Merkle e a página de destino para uma visão geral da transparência binária.
Implementação de registros
O registro de transparência binária do Pixel é implementado como uma árvore Merkle baseada em blocos. A raiz
do conteúdo do bloco é veiculada em
https://developers.google.com/android/binary_transparency/tile. Observação: esta não é uma página da Web comum. As entradas de registro contidas nos subdiretórios dela precisam ser lidas de forma programática com a biblioteca TLog do Golang SumDB, não por um navegador.
Consulte Conteúdo do registro para uma descrição do que as entradas contêm.
O hash da raiz da árvore de Merkle de um registro, contido em um checkpoint, é veiculado em https://developers.google.com/android/binary_transparency/checkpoint.txt. Ele é apresentado no formato de ponto de verificação. As folhas dessa árvore de Merkle são veiculadas em https://developers.google.com/android/binary_transparency/image_info.txt. A assinatura do ponto de verificação pode ser verificada com a seguinte chave pública:
-----BEGIN CERTIFICATE-----
MIICPDCCAeOgAwIBAgIVAPooxISw/nFF/dPwmCUaV36Z4s3hMAoGCCqGSM49BAMCMHQxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYD
VQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAgFw0y
MTA3MTkyMjQxNDFaGA8yMDUxMDcxOTIyNDE0MVowdDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNh
bGlmb3JuaWExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC0dvb2dsZSBJbmMuMRAw
DgYDVQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRyb2lkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD
QgAEU83uXNUiTYE53c2TfdWmqpW20bBXy4KEf5Ff8dV8GLKlVAXKHyjw3Lp9J3E0yCRJ/39XKeuA
AMF7KzSvhD248KNQME4wDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUHRpvuNkzjtBY213BWgUyWWHm
3VYwHwYDVR0jBBgwFoAUHRpvuNkzjtBY213BWgUyWWHm3VYwCgYIKoZIzj0EAwIDRwAwRAIgZsZb
CNBXRkCKLS+LG/41VWj1cTszt9QCdJQNuy7aT94CIDPgn7v5b1ykBVUTuLgRSofxAzHg9R4dg1oA
7tTFAuDg
-----END CERTIFICATE-----
O processo de verificação lê o ponto de verificação e os blocos que contêm as entradas de registro do registro.
Processo de verificação
Um registro de transparência é implementado com uma árvore Merkle que consiste em hashes. Um nó folha contém dados, e um nó pai contém o hash dos filhos.
Duas computações são realizadas na árvore de Merkle para verificar a propriedade de integridade dos registros de transparência: a prova de inclusão e a prova de consistência. O primeiro prova que o registro inclui uma entrada correspondente a uma versão de imagem, ou seja, a entrada de registro inclui o resumo do VBMeta, um hash que representa as imagens do SO e pode ser retornado de um dispositivo. O último prova que, quando novas entradas são adicionadas à árvore, o novo checkpoint é consistente com a versão anterior da árvore.
Para verificar a imagem do Pixel, faça a prova de inclusão. Realizar o cálculo da prova de consistência é opcional, porque terceiros fazem isso continuamente.
Se quiser se familiarizar com os conceitos de verificação na transparência binária do Pixel, siga as instruções abaixo para usar a imagem em execução no seu dispositivo Pixel. Se quiser executar o firmware do Pixel com o maior grau de confiança, consulte o processo de verificação em Verificação completa da transparência binária do Pixel.
Pré-requisitos de verificação
Antes de verificar se o artefato (firmware ou APK) está de acordo com a reivindicação, confira 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 todos eles.
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
O ADB é uma ferramenta que se comunica com um dispositivo Android para inspecionar a imagem ou
extrair APKs, disponível no site do Android SDK Platform Tools.
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 do GitHub android-binary-transparency 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 do GitHub android-binary-transparency:
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 os 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 você tem uma dessas ferramentas instaladas, já que os scripts de verificação podem depender delas.
Avbtool
A avbtool
é usada 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
O fbpacktool
é um script Python usado para descompactar componentes individuais no
bootloader.img do Pixel.
Isso não é necessário se você estiver verificando APKs.
Essa ferramenta é importante porque permite 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 Python a seguir no diretório em que avbtool.py está, torne fbpacktool.py executável e crie um link simbólico chamado fbpacktool para fbpacktool.py por conveniência.
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
O 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. Para verificar no terminal, execute o seguinte comando e confira se o resultado retornado não está vazio:
computer:~$ which openssl
/usr/bin/openssl
Prova de inclusão
Um proprietário de Pixel pode verificar se a imagem está no registro extraindo primeiro os metadados relevantes e comparando o hash raiz recalculado com o hash raiz contido no ponto de verificação publicado. Se eles corresponderem, o proprietário do Pixel poderá ter certeza de algumas proteções exemplificadas no modelo de ameaça.
Para verificar se a imagem em um dispositivo Pixel está no registro de transparência, conecte-se ao dispositivo com adb e execute os seguintes 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
A primeira estrofe recupera os metadados de um dispositivo Pixel no formato de uma entrada de registro e os salva em /tmp/log_payload.txt.
A segunda estrofe executa o verificador de prova de inclusão publicado no repositório da Inicialização verificada do Android. Essa ferramenta calcula o hash da entrada de registro candidata, recupera os outros hashes necessários para recalcular o ponto de verificação do registro e compara com o ponto de verificação publicado pelo registro.
A saída do comando é gravada em stdout:
OKse a imagem estiver incluída no registro,FAILUREse não for.
Comprovante de consistência (opcional)
Como o Google lança periodicamente novas versões da imagem de fábrica do Pixel, o registro de transparência está em constante crescimento. Uma testemunha verifica se a árvore cresce de maneira consistente com as folhas anteriores. A testemunha rastreia o hash da raiz da árvore e calcula o próximo hash da raiz candidata solicitando os novos hashes de folha da árvore. Para que um registro de transparência seja à prova de violação, ele precisa ser verificado continuamente para garantir a consistência.
O comportamento de apenas anexar do registro de transparência é verificado ativamente por terceiros. Portanto, a maioria dos usuários não precisa fazer isso, mas é possível que qualquer pessoa monitore a consistência do registro. O Google publicou uma implementação de código aberto de uma testemunha neste repositório do GitHub. É necessário usar a configuração específica do registro de transparência binária do Pixel (PixelBT).