Auf dieser Seite wird eine Methode beschrieben, mit der Sie mit höchster Wahrscheinlichkeit sicherstellen können, dass Sie eine legitime Version des Pixel-Images auf Ihrem Pixel-Gerät ausführen. Dazu müssen Sie ein Werksimage auf Ihren Computer herunterladen und einen Log-Inclusion-Beweis durchführen, bevor Sie es auf Ihr Gerät flashen.
So überprüfen Sie Ihr Pixel-Werksimage
Bestätigungsgrundlagen
Bevor Sie überprüfen, ob das Artefakt (Firmware oder APK) dem Anspruch entspricht, müssen Sie dafür sorgen, dass die folgenden Tools auf einem mit dem Netzwerk verbundenen Computer verfügbar sind. Je nach Bestätigungsziel benötigen Sie möglicherweise nicht alle.
GoLang
Das Bestätigungstool ist in Go geschrieben. Installieren Sie Go 1.24 oder höher von der Go-Website, um es zu erstellen.
Android Debug Bridge (ADB)
ADB ist ein Tool, das mit einem Android-Gerät kommuniziert, um das Image zu prüfen oder APKs zu extrahieren. Es ist auf der Website der Android SDK Platform Tools verfügbar.
Inclusion Proof-Prüfung
Der Inclusion Proof Verifier ist ein Go-Modul, das das Transparenzlog abfragt und ausgibt, ob ein Artefakt im Log enthalten ist.
Es wird im android-binary-transparency-GitHub-Repository unter https://github.com/android/android-binary-transparency/tree/main veröffentlicht.
So klonen Sie das AOSP-Repository avb:
computer:~$ git clone https://android.googlesource.com/platform/external/avb
So klonen Sie das GitHub-Repository android-binary-transparency:
computer:~$ git clone https://github.com/android/android-binary-transparency
AAPT2
AAPT2 (Android Asset Packaging Tool) ist ein Build-Tool, mit dem die Ressourcen einer Android-App kompiliert und verpackt werden. Es ist als eigenständiges Tool in Android SDK Build Tools ab Version 26.0.2 verfügbar.
bundletool
bundletool ist ein Tool zum Erstellen eines Android App Bundles (AAB). Sie kann auch zum Überprüfen von APK-Codesignaturen verwendet werden.
Sie können es von GitHub herunterladen.
wget oder curl
wget und curl sind Tools, mit denen Dateien aus dem Internet abgerufen oder heruntergeladen werden können. Achten Sie darauf, dass eines dieser Tools installiert ist, da die Bestätigungsskripts darauf angewiesen sein können.
Avbtool
Mit avbtool wird der VBMeta-Digest der Werks-Images berechnet und Binärdateien werden überprüft.
Nach dem Klonen des avb-Repositorys (wie im Abschnitt „Inclusion Proof verifier“ gezeigt) finden Sie avbtool.py im geklonten avb-Verzeichnis.
Fügen Sie dieses Verzeichnis Ihrer Umgebungsvariablen $PATH hinzu.
computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL
Fbpacktool
fbpacktool ist ein Python-Script, mit dem einzelne Komponenten im bootloader.img von Pixel entpackt werden.
Das ist nicht erforderlich, wenn Sie APKs überprüfen.
Dieses Tool ist wichtig, weil avbtool.py damit die für die Überprüfung erforderlichen Bilder finden kann.
Damit Sie dieses Tool verwenden können, müssen Sie die folgenden drei Python-Skripts in das Verzeichnis herunterladen, in dem sich avbtool.py befindet, fbpacktool.py ausführbar machen und zur Vereinfachung einen Symlink mit dem Namen fbpacktool zu fbpacktool.py erstellen.
Wenn Sie wget haben:
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
Wenn Sie curl haben:
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
Mit openssl können verschiedene kryptografische Vorgänge über das Terminal im Bestätigungsprozess ausgeführt werden. Prüfen Sie, ob es auf Ihrem System installiert ist. Sie können dies in Ihrem Terminal prüfen, indem Sie den folgenden Befehl ausführen und darauf achten, dass das zurückgegebene Ergebnis nicht leer ist:
computer:~$ which openssl
/usr/bin/openssl
Nutzlast für die Bestätigung erstellen
Wenn Sie das Image auf Ihrem Gerät oder einen Download von der Website „Pixel Factory Image“ überprüfen möchten, müssen Sie zuerst die Nutzlast für dieses Image aus dem Build-Fingerabdruck und dem VBMeta-Digest erstellen. Es gibt zwei Optionen: manuell oder automatisch.
- Build-Fingerprint: Eine String-Kennung des Werksabbilds
- Beispiel:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
- Beispiel:
- VBMeta-Digest: Ein kryptografischer SHA-256-Digest, der die verschiedenen Teile der Werks-Images miteinander verbindet.
- Beispiel:
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
- Beispiel:
Manuelle Nutzlastkonstruktion
Wenn Sie die Nutzlast für die Überprüfung manuell generieren möchten, müssen Sie eine Textdatei (payload.txt) erstellen, die in einer Zeile den Build-Fingerabdruck und in der nächsten Zeile den VBMeta-Digest enthält. Zwischen den Zeilen muss eine leere Zeile sein (das genaue Format finden Sie im Abschnitt „Log-Inhalt“).
Nachdem Sie die Schritte auf der Website für Werksimages ausgeführt haben, sollte der Inhalt der Datei payload.txt so aussehen:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
VBMeta-Digest und Build-Fingerabdruck von der Website für Pixel-Factory-Images extrahieren
Wenn Sie ein Werksimage von der Website für Werksimages für Pixel herunterladen, müssen Sie die heruntergeladene Datei entzippen. Dadurch wird ein weiterer Ordner erstellt. Rufen Sie den neu erstellten Ordner auf und entpacken Sie die zugehörige image-*.zip-Datei, um einzelne *.img-Dateien zu erhalten. Diese Binärdateien sind Partitions-Images. Prüfen Sie, ob sich unter den Bilddateien eine vbmeta.img-Datei befindet.
Auf dem Bildschirm sollte Folgendes zu sehen sein:
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
Sie können den Build-Fingerabdruck extrahieren und den VBMeta-Digest aus allen heruntergeladenen Dateien berechnen.
Nachdem avbtool.py für Ihr $PATH verfügbar gemacht wurde, können Sie die folgenden Befehle in Ihrem Terminal ausführen, um den Build-Fingerabdruck zu extrahieren und den VBMeta-Digest des gerade heruntergeladenen Werks-Images zu berechnen:
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
Manuelle Bestätigung des heruntergeladenen Werks-Images
Um das heruntergeladene Werks-Image richtig zu prüfen, müssen Sie fbpacktool.py und zwei weitere Python-Dateien herunterladen, von denen es abhängt (fbpack.py und packedstruct.py), um die Komponenten in bootloader.img zu entpacken, da sie einzeln im VBMeta-Struct beschrieben werden. Sobald Sie den Unpacker haben, können Sie das Bootloader-Image mit fbpacktool.py entpacken. Beispiel:
computer:dir_containing_unzipped_images$ python3 fbpacktool.py unpack bootloader-oriole-slider-1.0-7683913.img
In diesem Verzeichnis sollten weitere IMG-Dateien angezeigt werden.
Jetzt können Sie avbtool.py verwenden, um manuell zu prüfen, ob die Signaturen der verschiedenen Partitionen übereinstimmen.
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
Wenn keine Fehler- oder Fehlermeldungen angezeigt werden, wurde die VBMeta des heruntergeladenen Bildes erfolgreich überprüft.
Automatische Nutzlastgenerierung
Wir haben auch ein Python-Skript für Sie bereitgestellt, das Sie verwenden können. Mit diesem Tool müssen Sie Dateien nicht mehr manuell abrufen und entzippen, sondern nur die URL zum Werksimage angeben.
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.
Wenn Sie den oben genannten Befehl ausführen, wird das Factory-Image-Bundle heruntergeladen, entzippt und die Signaturen der signierten Partitionen werden überprüft. Nach erfolgreicher Bestätigung wird eine neue Datei mit dem Namen payload.txt erstellt, deren Inhalt in etwa so aussehen sollte:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Nachdem Sie „payload.txt“ erfolgreich erstellt haben, können Sie mit der Prüfung der Einbindung von Bildern beginnen.
Bild einfügen (Nachweis)
Nachdem Sie die Nutzlast erstellt haben, legen Sie eine Shell-Variable (z.B. $PAYLOAD_PATH) fest, die auf den Pfad zur Nutzlast verweist.
Ein Tool zum Erstellen von Einschlussnachweisen wurde im avb-Repository des Open-Source-Projekts für Android veröffentlicht. So führen Sie es aus:
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
Der Prüfer verwendet den Prüfpunkt und den Log-Inhalt (im Kachelverzeichnis), um zu prüfen, ob sich die Bild-Payload im Transparenzlog befindet, d. h. von Google veröffentlicht wurde.
Die Ausgabe des Befehls wird in stdout geschrieben:
OK. inclusion check success!, wenn das Bild im Log enthalten ist,FAILURE, wenn das nicht der Fall ist.