O registro de transparência binária do Pixel aproveita a tecnologia de registro de transparência.
A utilidade dos registros de transparência foi comprovada com a Transparência de certificados, um protocolo da Internet que exige que as autoridades de certificação publiquem os certificados emitidos nos registros públicos de Transparência de certificados. Esse processo reduziu muito a emissão incorreta de certificados, aumentando a segurança da Internet. Muitos operadores de registro de Transparência de certificados dependem de uma implementação de registros de transparência encontrada em transparency.dev.
Os registros de transparência são implementados com árvores de Merkle. Esta página pressupõe o conhecimento geral de á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 registro
O registro de transparência binária do Pixel é implementado como uma
árvore de Merkle baseada em blocos. A raiz do conteúdo do bloco é veiculada em https://developers.google.com/android/binary_transparency/tile. Observação: essa não é uma página da Web normal. As entradas de registro contidas nos subdiretórios precisam ser lidas programaticamente com a biblioteca SumDB
TLog do Golang e 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 checkpoint. As folhas dessa árvore de Merkle são veiculadas em https://developers.google.com/android/binary_transparency/image_info.txt. A assinatura do checkpoint 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 checkpoint e os blocos que contêm as entradas de registro.
Processo de verificação
Um registro de transparência é implementado com uma árvore de 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 violação de registros de transparência: a prova de inclusão e a prova de consistência. A primeira 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, que podem ser retornadas de um dispositivo. A segunda 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. A execução da computação de prova de consistência é opcional, porque terceiros fazem isso continuamente.
Se você 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 dispositivo Pixel. Se você quiser executar o firmware do Pixel com o maior grau de confiança, consulte o processo de verificação na 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, 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 criá-la, 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 SDK do Android 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 gera 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 SDK do Android Build Tools versão 26.0.2 e mais recentes.
bundletool
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.
fbpacktool exige o Python 3.6 ou mais recente e o
PyYAML
(por exemplo, python3 -m pip install pyyaml).
Para usar essa ferramenta, baixe os seis 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://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.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 -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.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 seguinte comando e conferindo se o resultado retornado não está vazio:
computer:~$ which openssl
/usr/bin/openssl
Prova de inclusão
Um proprietário do Pixel pode verificar se a imagem está no registro extraindo os metadados relevantes e comparando o hash da raiz recalculado com o hash da raiz contido no checkpoint 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 o adb, 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 --log_type=pixel
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 do Android Verified Boot. Essa ferramenta calcula o hash da entrada de registro candidata, recupera os outros hashes necessários para recalcular o checkpoint do registro e o compara com o checkpoint publicado pelo registro.
A saída do comando é gravada em stdout:
OKse a imagem estiver incluída no registro,FAILUREse não estiver.
Prova 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 acompanha 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 quanto à consistência.
O comportamento somente de anexação 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).