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 cela, vous devez télécharger une image d'usine sur votre ordinateur et effectuer une preuve d'inclusion dans le journal sur l'artefact téléchargé avant de le flasher sur votre appareil.
Vérifier votre image d'usine Pixel
Conditions préalables pour la validation
Avant de vérifier que l'artefact (micrologiciel ou APK) est conforme à la revendication, assurez-vous que les outils suivants sont disponibles sur un ordinateur connecté au réseau. Selon la cible de validation, vous n'aurez peut-être pas besoin de tous ces outils.
Golang
L'outil de validation est écrit en Go. Pour le compiler, installez Go 1.24 ou version ultérieure à partir du site Go.
Android Debug Bridge (ADB)
ADB est un outil qui communique avec un appareil Android pour inspecter l'image ou
extraire des APK. Il est disponible sur le site Web Android SDK Platform Tools website.
Outil de validation de la preuve d'inclusion
L'outil de validation de la preuve d'inclusion est un module Go qui interroge le journal de transparence et indique si un artefact est inclus dans le journal.
Il est publié dans le dépôt GitHub android-binary-transparency à l'adresse
https://github.com/android/android-binary-transparency/tree/main.
Pour cloner le dépôt AOSP avb :
computer:~$ git clone https://android.googlesource.com/platform/external/avb
Pour cloner le dépôt GitHub android-binary-transparency :
computer:~$ git clone https://github.com/android/android-binary-transparency
AAPT2
AAPT2 (Android Asset Packaging Tool) est un outil de compilation utilisé pour compiler et empaqueter les ressources d'une application Android. Il est disponible en tant qu'outil autonome dans les outils de compilation du SDK Android version 26.0.2 et versions ultérieures.
bundletool
bundletool est un outil utilisé pour créer un Android App Bundle (AAB). Il peut également être utilisé pour valider les signatures de code APK.
Vous pouvez le télécharger depuis GitHub.
wget ou curl
wget et curl sont des outils qui peuvent être utilisés pour récupérer ou télécharger des fichiers depuis Internet. Assurez-vous que l'un de ces outils est installé, car les scripts de validation peuvent en dépendre.
Avbtool
avbtool
est utilisé pour calculer le condensé VBMeta des images d'usine et la validation des
binaires.
Après avoir cloné le dépôt avb (comme indiqué dans la section Outil de validation de la preuve d'inclusion
), avbtool.py se trouve dans le répertoire avb cloné.
Vous devez ajouter ce répertoire à votre variable d'environnement $PATH.
computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL
Fbpacktool
fbpacktool
est un script Python utilisé pour décompresser des composants individuels dans Pixel's
bootloader.img.
Vous n'en avez pas besoin si vous validez des APK.
Cet outil est important, car il permet à 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 avez 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
Si vous avez 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
openssl permet d'effectuer diverses opérations de chiffrement à l'aide du terminal dans le workflow de validation. Assurez-vous qu'il est installé sur votre système. Vous pouvez vérifier sur votre terminal en exécutant la commande suivante et en vous assurant que le résultat renvoyé n'est pas vide :
computer:~$ which openssl
/usr/bin/openssl
Créer la charge utile pour la validation
Pour valider l'image dont vous disposez sur votre appareil ou un téléchargement depuis le site Web Pixel Factory Image, vous devez d'abord créer la charge utile correspondant à cette image à partir de l'empreinte de build et du condensé VBMeta. Deux options sont disponibles : 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 pour la validation, vous devez créer un fichier texte
, payload.txt qui contient l'empreinte de build sur une ligne, puis le
condensé VBMeta sur la ligne suivante, avec une nouvelle ligne vide (veuillez vous reporter à la section
Contenu du journal pour le
format exact).
Après avoir suivi les étapes du
site Web Factory Image,
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 condensé VBMeta et l'empreinte de build du site Web Pixel Factory Image
Lorsque vous téléchargez une image d'usine depuis
le site Web Pixel Factory Image, vous
devez décompresser le fichier téléchargé, ce qui créera un autre dossier
à la place. Accédez au dossier nouvellement créé et 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 build et calculer le condensé VBMeta à partir de tous les fichiers téléchargés.
Une fois avbtool.py mis à disposition de votre $PATH, vous pouvez exécuter les commandes suivantes à partir de votre terminal pour extraire l'empreinte de build et calculer le condensé 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
Validation manuelle de l'image d'usine téléchargée
Pour valider 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, comme décrit individuellement
dans la structure VBMeta. Une fois le décompresseur installé, 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 apparaître 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 été validé.
Création automatique de la charge utile
Pour plus de commodité, nous avons également fourni un script Python que vous pouvez utiliser. Avec cet outil, au lieu de récupérer et de décompresser manuellement les fichiers, vous n'avez qu'à 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 téléchargera le bundle d'images d'usine, le décompressera et validera les signatures des partitions signées. Une fois la validation réussie, un fichier nommé payload.txt sera créé, et son contenu devrait ressembler à ce qui suit :
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Une fois votre fichier payload.txt créé, vous pouvez commencer la validation des étapes d'inclusion d'image.
Valider l'inclusion d'image (preuve d'inclusion)
Une fois votre charge utile créée, définissez une variable 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
avb dépôt
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
L'outil de validation utilise le point de contrôle et le contenu du journal (disponible dans le répertoire de la vignette) pour vérifier que la charge utile de votre image se trouve 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,FAILUREsi ce n'est pas le cas.