Cette page décrit une méthode (avec le plus haut degré de confiance) pour vous assurer que vous pouvez exécuter une version légitime de l'image Pixel sur votre appareil Pixel. Pour ce faire, téléchargez une image d'usine sur votre ordinateur et effectuez une preuve d'inclusion de journal sur l'artefact téléchargé avant de le flasher sur votre appareil.
Vérifier l'image d'usine de votre Pixel
Conditions préalables à la validation
Avant de vérifier que l'image d'usine que vous venez de télécharger est conforme à notre réclamation, vous devez effectuer les opérations suivantes à partir d'un ordinateur connecté au réseau.
Golang
L'outil de validation est écrit en Go. Pour le compiler, installez Go 1.17 ou une version ultérieure sur le site Go.
wget ou curl
wget et curl sont des outils qui peuvent être utilisés pour récupérer ou télécharger des fichiers sur Internet. Assurez-vous que l'un de ces outils est installé sur votre système, car le reste de ce guide et le script que nous fournissons reposent sur la présence de l'un d'eux.
Avbtool
avbtool permet de calculer le condensé VBMeta des images d'usine et de vérifier les binaires.
Vous pouvez le télécharger à partir du dépôt AOSP à l'aide de la commande ci-dessous et en savoir plus dans la documentation associée.
computer:~$ git clone https://android.googlesource.com/platform/external/avb
Après avoir cloné ce dépôt, avbtool.py
se trouve dans le répertoire du dépôt avb
cloné. Vous devez également ajouter ce répertoire à votre variable d'environnement $PATH
.
computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL
Outil de validation de la preuve d'inclusion
Le vérificateur de preuve d'inclusion est un module Go qui interroge le journal de transparence des images Pixel Factory et indique si une image est incluse dans le journal.
Après avoir cloné le dépôt AVB ci-dessus, le code source du vérificateur se trouve dans tools/transparency/verify/
.
Fbpacktool
fbpacktool est un script Python qui permet de décompresser des composants individuels dans bootloader.img
de Pixel. Cet outil est important pour permettre à avbtool.py
de découvrir les images requises pour la validation.
Pour utiliser cet outil, vous devez télécharger les trois scripts Python suivants dans le répertoire où se trouve votre avbtool.py
, rendre fbpacktool.py
exécutable et créer un lien symbolique nommé fbpacktool
vers fbpacktool.py
pour plus de commodité.
Si vous disposez de wget
, vous pouvez exécuter la commande suivante pour télécharger les trois 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
Si vous disposez de curl
, vous pouvez exécuter les commandes suivantes pour télécharger les trois 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
Vous avez également besoin d'un outil nommé openssl pour effectuer diverses opérations cryptographiques à l'aide du terminal dans le workflow de validation. Assurez-vous qu'il est installé sur votre système. Vous pouvez effectuer une vérification dans votre terminal en exécutant la commande suivante et en vous assurant que le résultat renvoyé n'est pas vide. Exemple :
computer:~$ which openssl
/usr/bin/openssl
Créer la charge utile pour la validation
Pour vérifier l'image que vous avez sur votre appareil ou un téléchargement à partir du site Web d'images de la Pixel Factory, vous devez d'abord créer la charge utile correspondant à cette image à partir de l'empreinte de compilation et du récapitulatif VBMeta. Vous avez le choix entre deux options : manuelle ou automatique, comme décrit ci-dessous.
- Empreinte de build: identifiant de chaîne de l'image d'usine
- Exemple :
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
- Exemple :
- Condensé VBMeta: condensé cryptographique SHA-256 qui lie les différentes parties des images d'usine.
- Exemple :
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
- Exemple :
Création manuelle de la charge utile
Pour générer manuellement la charge utile à des fins de validation, vous devez créer un fichier texte, payload.txt
, qui contient l'empreinte de compilation sur une ligne, puis le récapitulatif VBMeta sur la ligne suivante, avec une nouvelle ligne vide (reportez-vous à la section Contenu du journal pour connaître le format exact).
Après avoir suivi les étapes du site Web de l'image d'usine, le contenu du fichier payload.txt
doit se présenter comme suit:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Extraire le récapitulatif VBMeta et l'empreinte de compilation à partir du site Web de l'image d'usine Pixel
Lorsque vous téléchargez une image d'usine à partir du site Web d'images d'usine Pixel, vous devez décompresser le fichier téléchargé, ce qui crée un autre dossier. Accédez au dossier nouvellement créé, puis décompressez le fichier image-*.zip
associé pour obtenir des fichiers *.img
individuels. Ces binaires sont des images de partition. Assurez-vous qu'un fichier vbmeta.img
existe parmi les fichiers img.
L'écran qui s'affiche devrait ressembler à ce qui suit :
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
Vous pouvez extraire l'empreinte de compilation et calculer le récapitulatif VBMeta à partir de tous les fichiers téléchargés.
Une fois que avbtool.py
a été mis à la disposition de votre $PATH
, vous pouvez ensuite exécuter les commandes suivantes à partir de votre terminal pour extraire l'empreinte de compilation et calculer le récapitulatif VBMeta de l'image d'usine que vous venez de télécharger:
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
Vérification manuelle de l'image d'usine téléchargée
Pour vérifier correctement l'image d'usine téléchargée, vous devez télécharger fbpacktool.py et deux autres fichiers Python dont il dépend (fbpack.py et packedstruct.py) pour décompresser les composants dans bootloader.img
, car ils sont décrits individuellement dans la struct VBMeta. Une fois que vous avez le décompresseur, vous pouvez utiliser fbpacktool.py
pour décompresser l'image du bootloader. Exemple :
computer:dir_containing_unzipped_images$ python3 fbpacktool.py unpack bootloader-oriole-slider-1.0-7683913.img
Vous devriez voir d'autres fichiers .img s'afficher dans ce répertoire.
Vous pouvez maintenant utiliser avbtool.py
pour vérifier manuellement que les signatures des différentes partitions correspondent.
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
Si aucun message d'erreur ou d'échec ne s'affiche, cela signifie que le VBMeta de l'image téléchargée a bien été validé.
Création automatique de la charge utile
Pour plus de commodité, nous vous avons également fourni un script Python que vous pouvez utiliser. Avec cet outil, au lieu d'extraire et de décompresser manuellement les fichiers, il vous suffit de spécifier l'URL de l'image d'usine.
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.
L'exécution de la commande ci-dessus permet de télécharger le bundle d'images d'usine, de le décompresser et de vérifier les signatures des partitions signées. Une fois la validation réussie, un nouveau fichier nommé payload.txt
est créé. Son contenu devrait ressembler à celui ci-dessous:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Une fois votre fichier payload.txt créé, vous pouvez commencer les étapes de validation de l'inclusion d'images.
Vérifier l'inclusion d'une image (preuve d'inclusion)
Une fois que vous avez construit votre charge utile, définissez une variable de shell (par exemple, $PAYLOAD_PATH
) pour qu'elle pointe vers le chemin d'accès à la charge utile.
Un outil de preuve d'inclusion a été publié dans le dépôt avb
du projet Android Open Source. Pour l'exécuter:
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
Le vérificateur utilise le point de contrôle et le contenu du journal (disponible dans le répertoire des tuiles) pour vérifier que la charge utile de votre image figure dans le journal de transparence, c'est-à-dire qu'elle est publiée par Google.
Le résultat de la commande est écrit dans stdout:
OK. inclusion check success!
si l'image est incluse dans le journal ;FAILURE
si ce n'est pas le cas.