Metodo di verifica

Questa pagina illustra un metodo (con il massimo grado di certezza) per assicurarti di poter eseguire una versione legittima dell'immagine di Pixel sul tuo dispositivo Pixel. Per farlo, devi scaricare un'immagine di fabbrica sul computer ed eseguire una prova di inclusione dei log sull'elemento scaricato prima di eseguirlo sul dispositivo.

Come verificare l'immagine di fabbrica di Pixel

Prerequisiti per la verifica

Prima di procedere per verificare che l'immagine di fabbrica che hai appena scaricato sia conforme alla nostra rivendicazione, devi eseguire i seguenti passaggi da un computer connesso alla rete.

Linguaggio Go

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

wget o curl

wget e curl sono strumenti che possono essere utilizzati per recuperare o scaricare file da internet. Assicurati di avere uno di questi strumenti installato sul tuo sistema, in quanto il resto di questa guida e lo script fornito prevedono la presenza di uno di questi strumenti.

Avbtool

avbtool viene utilizzato per calcolare il digest VBMeta delle immagini di fabbrica e per la verifica dei binari.

Puoi scaricarlo dal repository AOSP utilizzando il comando riportato di seguito e trovare maggiori dettagli nella documentazione collegata.

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

Dopo aver clonato il repository, avbtool.py si trova nella directory del repository avb clonato. Inoltre, devi aggiungere questa directory alla variabile di ambiente $PATH.

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

Verificatore della prova dell'inclusione

Il verificatore della prova di inclusione è un modulo Go che esegue query sul log di trasparenza delle immagini di Pixel Factory e esamina se un'immagine è inclusa nel log.

Dopo aver clonato il repository AVB riportato sopra, il codice sorgente del verificatore si trova in tools/transparency/verify/

Fbpacktool

fbpacktool è uno script Python utilizzato per estrarre i singoli componenti dibootloader.img di Pixel. Questo strumento è importante per consentire a avbtool.py di rilevare le immagini richieste per la verifica.

Per utilizzare questo strumento, devi scaricare i seguenti tre script Python nella directory in cui si trova avbtool.py, rendere fbpacktool.py eseguibile e creare un link simbolico denominato fbpacktool a fbpacktool.py per comodidade.

Se hai wget, puoi emettere il seguente comando per scaricare i tre script:

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, puoi emettere i seguenti comandi per scaricare i tre script:

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

Inoltre, devi disporre di uno strumento denominato openssl per eseguire varie operazioni di crittografia utilizzando il terminale nel flusso di lavoro di verifica. Assicurati che sia installato sul tuo sistema. Puoi eseguire un controllo sul tuo terminale emettendo il seguente comando e assicurarti che il risultato restituito non sia vuoto. Ad esempio:

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

Creare il payload per la verifica

Per verificare l'immagine che hai sul tuo dispositivo o un download dal sito web Pixel Factory Image, devi prima creare il payload corrispondente all'immagine dalla impronta della build e dal digest VBMeta. Sono disponibili due opzioni, manuale o automatica, come descritto di seguito.

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

Creazione del payload manuale

Per generare manualmente il payload per la verifica, devi creare un file di testo, payload.txt, contenente l'impronta della build su una riga e il digest VBMeta sulla riga successiva, con una nuova riga vuota (fai riferimento alla sezione Contenuti del log per il formato esatto).

Dopo aver seguito i passaggi descritti sul sito web delle immagini di fabbrica, i contenuti del file payload.txt dovrebbero avere il seguente aspetto:

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Estrazione di VBMeta Digest e Build Fingerprint dal sito web delle immagini di fabbrica di Pixel

Quando scarichi un'immagine di fabbrica dal sito web delle immagini di fabbrica di Pixel, dovrai decomprimere il file scaricato, che creerà un'altra cartella al suo posto. Vai alla cartella appena creata e decomprimi il file image-*.zip associato per ottenere i singoli file *.img. Questi file binari sono immagini delle partizioni. Assicurati che tra i file IMG sia presente un file vbmeta.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 l'impronta della build e calcolare il digest VBMeta da tutti i file scaricati.

Dopo che avbtool.py è stato reso disponibile per $PATH, puoi emettere i seguenti comandi dal terminale per estrarre l'impronta della build e calcolare il digest VBMeta dell'immagine di fabbrica che hai appena scaricato:

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 di cui dipende (fbpack.py e packedstruct.py) per scompattare i componenti in bootloader.img, come descritti singolarmente nella struttura VBMeta. Una volta ottenuto lo strumento di scompattazione, puoi utilizzare fbpacktool.py per scompattare l'immagine del bootloader. Ad esempio:

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

Dovresti vedere altri file .img nella directory. Ora puoi procedere a utilizzare avbtool.py per verificare manualmente la corrispondenza delle firme delle varie partizioni.

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 mancata riuscita, significa che il VBMeta dell'immagine scaricata è stato verificato correttamente.

Creazione automatica del payload

Per praticità, abbiamo anche fornito 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 riportato sopra consente di scaricare il bundle di immagini di fabbrica, decomprimerlo e verificare le firme delle partizioni firmate. Al termine della verifica, verrà creato un nuovo file denominato payload.txt e i relativi contenuti dovrebbero essere simili a quelli riportati di seguito:

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

Dopo aver creato il file payload.txt, puoi iniziare la procedura di verifica dell'inclusione delle immagini.

Verifica dell'inclusione dell'immagine (prova dell'inclusione)

Dopo aver creato il payload, imposta una variabile shell (ad es. $PAYLOAD_PATH) in modo che indichi il 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

Il verificatore utilizza il checkpoint e i contenuti del log (che si trovano nella directory dei riquadri) per verificare che il payload dell'immagine sia nel log della 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 se non lo è.