Metodo di verifica

Questa pagina descrive un metodo (con il massimo grado di affidabilità) per assicurarti di poter eseguire una versione legittima dell'immagine Pixel sul tuo dispositivo Pixel. Questo metodo prevede il download di un'immagine di fabbrica sul computer e l'esecuzione di una prova di inclusione nei log sull'artefatto scaricato prima di eseguirne il flashing sul dispositivo.

Come verificare l'immagine di fabbrica di Pixel

Prerequisiti di verifica

Prima di procedere con la verifica della conformità dell'artefatto (firmware o APK) alla rivendicazione, assicurati che i seguenti strumenti siano disponibili su un computer connesso alla rete. A seconda della destinazione della verifica, potresti non aver bisogno di tutti gli strumenti.

Golang

Lo strumento di verifica è scritto in Go. Per crearlo, installa Go 1.24 o versioni successive dal sito di Go.

Android Debug Bridge (ADB)

ADB è uno strumento che comunica con un dispositivo Android per ispezionare l'immagine o estrarre gli APK. È disponibile sul sito web degli strumenti della piattaforma Android SDK website.

Strumento di verifica della prova di inclusione

Lo strumento di verifica della prova di inclusione è un modulo Go che esegue query sul log di trasparenza e indica se un artefatto è incluso nel log. È pubblicato nel repository GitHub android-binary-transparency all'indirizzo https://github.com/android/android-binary-transparency/tree/main

Per clonare il repository avb di AOSP:

computer:~$ git clone https://android.googlesource.com/platform/external/avb

Per clonare il repository GitHub android-binary-transparency:

computer:~$ git clone https://github.com/android/android-binary-transparency

AAPT2

AAPT2 (Android Asset Packaging Tool) è uno strumento di build utilizzato per compilare e creare pacchetti delle risorse di un'app Android. È disponibile come strumento autonomo in Android SDK Build Tools versione 26.0.2 e successive.

bundletool

bundletool è uno strumento utilizzato per creare un Android App Bundle (AAB). Può essere utilizzato anche per verificare le firme del codice APK. Può essere scaricato da GitHub.

wget o curl

wget e curl sono strumenti che possono essere utilizzati per recuperare o scaricare file da internet. Assicurati di aver installato uno di questi strumenti, poiché gli script di verifica potrebbero farvi affidamento.

Avbtool

avbtool viene utilizzato per calcolare il digest VBMeta delle immagini di fabbrica e per verificare i file binari. Dopo aver clonato il repository avb (come mostrato nella sezione Strumento di verifica della prova di inclusione ), avbtool.py si trova nella directory avb clonata. Dovresti aggiungere questa directory alla variabile di ambiente $PATH.

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

Fbpacktool

fbpacktool è uno script Python utilizzato per decomprimere i singoli componenti in Pixel's bootloader.img. Non è necessario se stai verificando gli APK. Questo strumento è importante perché consente a avbtool.py di scoprire le immagini richieste per la verifica.

Per utilizzare questo strumento, scarica i tre script Python seguenti nella directory in cui si trova avbtool.py, rendi fbpacktool.py eseguibile, e crea un link simbolico denominato fbpacktool a fbpacktool.py per comodità.

Se hai 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 hai 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 consente di eseguire varie operazioni di crittografia utilizzando il terminale nel flusso di lavoro di verifica. Assicurati che sia installato sul tuo sistema. Puoi controllare sul terminale eseguendo il comando seguente e assicurandoti che il risultato restituito non sia vuoto:

computer:~$ which openssl
/usr/bin/openssl

Creare il payload per la verifica

Per verificare l'immagine presente sul dispositivo o un download dal sito web delle immagini di fabbrica di Pixel, devi prima creare il payload corrispondente all'immagine dal fingerprint build e dal digest VBMeta. Sono disponibili due opzioni, manuale o automatica, come descritto di seguito.

  • Fingerprint build: un identificatore stringa dell'immagine di fabbrica.
    • Esempio: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
  • Digest VBMeta: un digest di crittografia SHA-256 che collega i diversi componenti delle immagini di fabbrica.
    • Esempio: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

Creazione manuale del payload

Per generare manualmente il payload per la verifica, devi creare un file di testo , payload.txt che contenga il fingerprint build su una riga e poi il digest VBMeta sulla riga successiva, con una nuova riga vuota (consulta la sezione Contenuti dei log per il formato esatto).

Dopo aver seguito i passaggi del sito web delle immagini di fabbrica, il contenuto del file payload.txt dovrebbe essere simile al seguente:

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Estrarre il digest VBMeta e il fingerprint build dal sito web delle immagini di fabbrica di Pixel

Quando scarichi un'immagine di fabbrica da Pixel Factory Image website, dovrai decomprimere il file scaricato, che creerà un'altra cartella in place. Vai alla cartella appena creata e decomprimi il file image-*.zip associato per ottenere i singoli file *.img. Questi file binari sono immagini di partizione. Assicurati che esista un file vbmeta.img tra i file img. Il risultato dovrebbe essere simile a questo:

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

Puoi estrarre il fingerprint build e calcolare il digest VBMeta da tutti i file scaricati.

Dopo aver reso disponibile avbtool.py per $PATH, puoi eseguire i seguenti comandi dal terminale per estrarre il fingerprint build e calcolare il digest VBMeta dell'immagine di fabbrica appena scaricata:

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 manuale dell'immagine di fabbrica scaricata

Per verificare correttamente l'immagine di fabbrica scaricata, dovrai scaricare fbpacktool.py e altri due file Python da cui dipende (fbpack.py e packedstruct.py) per decomprimere i componenti in bootloader.img, come descritto singolarmente nella struttura VBMeta. Una volta decompresso, puoi utilizzare fbpacktool.py per decomprimere l'immagine del bootloader. Ad esempio:

computer:dir_containing_unzipped_images$ python3 fbpacktool.py unpack bootloader-oriole-slider-1.0-7683913.img

Dovresti essere in grado di visualizzare altri file .img in questa directory. Ora puoi procedere utilizzando avbtool.py per verificare manualmente che le firme delle varie partizioni corrispondano.

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 non visualizzi messaggi di errore o di errore, significa che il VBMeta dell'immagine scaricata è stato verificato correttamente.

Creazione automatica del payload

Per tua comodità, abbiamo fornito anche uno script Python che puoi utilizzare. Con questo strumento, anziché recuperare e decomprimere manualmente i file, devi solo specificare l'URL dell'immagine di fabbrica.

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'esecuzione del comando precedente scaricherà il pacchetto dell'immagine di fabbrica, lo decomprimerà e verificherà le firme delle partizioni firmate. Se la verifica va a buon fine, verrà creato un nuovo file denominato payload.txt, il cui contenuto dovrebbe essere simile al seguente:

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

Una volta creato correttamente il file payload.txt, puoi iniziare i passaggi di verifica dell'inclusione dell'immagine.

Verificare l'inclusione dell'immagine (prova di inclusione)

Una volta creato il payload, imposta una variabile shell (ad es. $PAYLOAD_PATH) in modo che punti al percorso del payload.

Uno strumento di prova di inclusione è stato pubblicato nel avb repository all'interno di Android Open Source Project. Per eseguirlo:

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

Lo strumento di verifica utilizza il checkpoint e i contenuti dei log (che si trovano nella directory dei riquadri) per verificare che il payload dell'immagine sia presente nel log di trasparenza, ovvero che sia pubblicato da Google.

L'output del comando viene scritto in stdout:

  • OK. inclusion check success! se l'immagine è inclusa nel log.
  • FAILURE in caso contrario.