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
- Esempio:
- Digest VBMeta: un digest crittografico SHA-256 che lega i diversi componenti
delle immagini di fabbrica insieme
- Esempio:
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
- Esempio:
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 è.