Auf dieser Seite wird beschrieben, wie Sie überprüfen, ob das auf Ihrem Android Gerät installierte APK oder APEX den Angaben im Modell des Anspruchstellers entspricht. Dazu wird das APK von Ihrem Gerät abgerufen und ein Nachweis für die Aufnahme in das Log für das extrahierte Artefakt erbracht.
Überprüfungsverfahren
Ein Transparenzlog wird mit einem Merkle-Baum aus Hashes implementiert. Ein Blattknoten enthält Daten und ein übergeordneter Knoten enthält den Hash seiner untergeordneten Knoten.
Zwei grundlegende Berechnungen bestätigen die Manipulationssicherheit von Transparenzlogs: der Nachweis für die Aufnahme und der Konsistenznachweis. Der Nachweis für die Aufnahme bestätigt, dass das Log einen Eintrag für eine bestimmte APK-Version enthält. Dieser Logeintrag enthält einen Hash, der der SHA256-Digest der APK-Datei ist, die auf dem Gerät installiert ist. Der Konsistenznachweis stellt sicher, dass der neue Prüfpunkt bei Hinzufügen neuer Einträge kryptografisch mit früheren Versionen des Baums übereinstimmt (oder dass der Baum nicht manipuliert wurde). In dieser Anleitung konzentrieren wir uns auf den Prozess der Berechnung des Nachweises für die Aufnahme. Zeugen führen kontinuierlich einen Konsistenznachweis anhand der neuesten Prüfpunkte durch.
Wenn Sie ein abgedecktes APK bestätigen möchten, erbringen Sie einen Nachweis für die Aufnahme anhand eines bezeugten Prüfpunkts. Wir planen, dieses Log mit einem öffentlichen Zeugennetzwerk zu verknüpfen , das ein standardisiertes Zeugenprotokoll verwendet. Durch diese Verknüpfung werden bezeugte Prüfpunkte bereitgestellt, die die Konsistenz des Logs garantieren.
So überprüfen Sie, ob die Google-Apps auf Ihrem Gerät den Angaben im Modell des Anspruchstellers entsprechen:
Nachweis für die Aufnahme
Sie können überprüfen, ob ein abgedecktes APK auf Ihrem Gerät im Log enthalten ist. Dazu extrahieren Sie das APK, berechnen seinen Hash und prüfen mit einem Nachweis für die Aufnahme, ob dieser Hash im veröffentlichten Prüfpunkt vorhanden ist. Ein erfolgreicher Nachweis für die Aufnahme bietet Schutz vor den im Bedrohungsmodell beschriebenen Risiken und bestätigt, dass die App eine legitime Google-App ist.
Aufnahme eines APK in das Log bestätigen
Jede App, die als Google-App eines Erstanbieters bezeichnet wird, kann anhand dieses Logs bestätigt werden.
Bestätigungsgrundlagen
Bevor Sie überprüfen, ob das Artefakt (Firmware oder APK) der Behauptung entspricht, müssen die folgenden Tools auf einem mit dem Netzwerk verbundenen Computer verfügbar sein. 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 Android SDK Platform Tools verfügbar.
Tool zur Bestätigung des Nachweises für die Aufnahme
Das Tool zur Bestätigung des Nachweises für die Aufnahme 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 Version 26.0.2 und höher verfügbar.
bundletool
bundletool ist ein Tool zum Erstellen eines Android App Bundle (AAB). Es kann auch verwendet werden, um APK-Codesignaturen zu bestätigen.
Es kann von GitHub heruntergeladen werden.
wget oder curl
wget und curl sind Tools, mit denen Sie Dateien aus dem Internet abrufen oder herunterladen können. Achten Sie darauf, dass eines dieser Tools installiert ist, da die Bestätigungsskripts möglicherweise darauf angewiesen sind.
Avbtool
avbtool
wird verwendet, um den VBMeta-Digest der Factory Images zu berechnen und
Binärdateien zu bestätigen.
Nach dem Klonen des avb Repositorys (wie im Abschnitt Tool zur Bestätigung des Nachweises für die Aufnahme
gezeigt) finden Sie avbtool.py im geklonten avb Verzeichnis.
Fügen Sie dieses Verzeichnis der Umgebungsvariable $PATH hinzu.
computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL
Fbpacktool
fbpacktool
ist ein Python-Skript, mit dem einzelne Komponenten in Pixel's
bootloader.img entpackt werden.
Wenn Sie APKs bestätigen, benötigen Sie dieses Tool nicht.
Es ist wichtig, da avbtool.py damit die für die Bestätigung erforderlichen Images finden kann.
fbpacktool erfordert Python 3.6 oder höher und das
PyYAML-Paket
(z. B. python3 -m pip install pyyaml).
Wenn Sie dieses Tool verwenden möchten, laden Sie die folgenden sechs Python-Skripts
in das Verzeichnis herunter, in dem sich avbtool.py befindet,
machen Sie fbpacktool.py ausführbar
und erstellen Sie zur Vereinfachung einen Symlink namens fbpacktool zu fbpacktool.py.
Wenn Sie wget haben:
computer:dir_to_avbtool$ wget https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.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 -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool
OpenSSL
Mit openssl können Sie im Bestätigungsworkflow verschiedene kryptografische Vorgänge über das Terminal ausführen. Achten Sie darauf, dass es auf Ihrem System installiert ist. Sie können das im 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 Überprüfung erstellen
Wenn Sie Ihr extrahiertes APK bestätigen möchten, müssen Sie eine Log-Nutzlast mit Informationen aus dem APK selbst erstellen.
Aktivieren Sie zuerst das USB-Debugging auf Ihrem Gerät, um adb
Verbindungen zuzulassen.
Suchen Sie dann das installierte APK auf Ihrem Gerät. In dieser Anleitung wird das
Google Play-Dienste-APK (com.google.android.gms) als Arbeitsbeispiel verwendet.
adb shell pm path com.google.android.gms
Die Ausgabe sollte in etwa so aussehen:
computer:~$ adb shell pm path com.google.android.gms
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/base.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_CronetDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteLoader_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteModulesA_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteModulesC_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_GoogleCertificates_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_MapsDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_MeasurementDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_config.en.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_config.xxhdpi.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_maps_core_dynamite_ondemand.apk
Diese Ausgabe zeigt, dass auf Ihrem Gerät ein Basis-APK und mehrere unterteilte APKs installiert sind
für com.google.android.gms auf Ihrem Gerät.
Die genaue Anzahl der unterteilten APKs hängt von der Konfiguration Ihres Geräts ab.
Jedes unterteilte APK hat denselben Paketnamen und Versionscode wie das Basis-APK.
Laden Sie die aufgeführten APKs mit dem folgenden Befehl von Ihrem Android-Gerät auf Ihren Computer herunter. Beachten Sie, dass die tatsächlichen Dateipfade variieren können:
mkdir -p /tmp/testdir/gms && cd /tmp/testdir/gms && \
adb shell pm path com.google.android.gms | cut -d':' -f2 | tr -d '\r' | xargs -n1 adb pull
Wenn Sie den Paketnamen und die Version der heruntergeladenen APKs bestätigen möchten, müssen Sie ihr Manifest (AndroidManifest.xml)
prüfen.
Da sich das Manifest in einem APK im Binärformat befindet, verwenden Sie das aapt2 Tool
(das im Schritt zu den Voraussetzungen installiert wurde), um die
Informationen direkt aus dem APK zu extrahieren und zu lesen:
computer:/tmp/testdir/gms$ aapt2 dump badging ./base.apk
package: name='com.google.android.gms' versionCode='260834035' versionName='26.08.34 (260400-876566425)' platformBuildVersionName='Baklava' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='Baklava'
minSdkVersion:'35'
targetSdkVersion:'36'
...
Wiederholen Sie diesen Schritt, um die relevanten Informationen zu erhalten, bis Sie alle auf Ihrem Gerät installierten Split-APKs berücksichtigt haben.
Die Ausgabe bestätigt, dass der Paketname des APK com.google.android.gms und die Versionsnummer (versionCode) 260834035 ist.
Berechnen Sie als Nächstes den kryptografischen Hash jedes APK:
computer:/tmp/testdir/gms$ sha256sum *.apk
66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a base.apk
c20754aee886cc55a9de91ee15c623c59d94ad22b7e435a1a48afc43cf1a106c split_config.en.apk
68c09b63a1262e0d34020c139bc77deff3c32bd2b01177abac64790a62fb3be6 split_config.xxhdpi.apk
cd746820c27babd855fa5daea6fabcdf7b44abf3060bc547adc4219212410af0 split_CronetDynamite_installtime.apk
512ee48b60fdb0787a17f84a7dc448fdbf885b2b86a9cb50525d4c22d561b0f1 split_DynamiteLoader_installtime.apk
9e0c74bdc75c50c80d4e2e580a7eda6b8391423ab1161645f41ec6cadc07d678 split_DynamiteModulesA_installtime.apk
955780ac01f59b98bd9be12968f3824ad71b762620f7bf223c569c1a6ab7056c split_DynamiteModulesC_installtime.apk
34c4a2e32d31554d55fc1519e2cfc3ed5027a090fb29b54cfc99f42d1da43bc5 split_GoogleCertificates_installtime.apk
475e18dde92472cde9d8300c082b6dc269613db03398bcd9d1987dff3e68f7b5 split_maps_core_dynamite_ondemand.apk
f83faf40f08bc13f4879302e01c08c863ca2304b4b4e7c9eaf8cd1e869bb6573 split_MapsDynamite_installtime.apk
ec6d854ddda6cd1ba2ba7af2d9fdf4f28c5c78be8713c64521c785429296738c split_MeasurementDynamite_installtime.apk
Sie haben jetzt alle Informationen, die zum Erstellen einer Log-Nutzlast erforderlich sind. Sie ist wie im Abschnitt Log-Inhalt beschrieben formatiert . Wenn Sie einen Hash aus den Ergebnissen als Beispiel auswählen (Sie sollten den Hash jedes unterteilten APK bestätigen), sieht die Log-Nutzlast so aus:
66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a
SHA256(APK)
com.google.android.gms
260834035
Achten Sie darauf, dass am Ende der Datei ein Zeilenumbruchzeichen steht. Speichern Sie diesen Inhalt in einer Datei, z. B. payload.txt, um ihn später mit dem Tool verifier zu verwenden.
Aufnahme des Pakets bestätigen (Nachweis für die Aufnahme)
Nachdem Sie die Nutzlast erstellt haben, können Sie jetzt prüfen, ob das Paket im Transparenzlog enthalten ist. Erstellen Sie das Tool zur Bestätigung des Nachweises für die Aufnahme aus dem Repository android-binary-transparency, das Sie zuvor geklont haben:
go build cmd/verifier/verifier.go
Dadurch sollte in diesem Verzeichnis eine ausführbare Datei namens verifier erstellt werden.
Führen Sie das Tool zur Bestätigung aus, geben Sie den Pfad zur Nutzlast an und legen Sie den Logtyp fest:
computer:android-binary-transparency$ PAYLOAD_PATH=PATH_TO_PAYLOAD_DIR/payload.txt
computer:android-binary-transparency$ ./verifier --payload_path=${PAYLOAD_PATH} --log_type=google_1p_apk
Das Tool zur Bestätigung verwendet den Prüfpunkt und den Log-Inhalt (aus dem Kachelverzeichnis), um zu prüfen, ob sich Ihre APK-Nutzlast im Transparenzlog befindet. So wird bestätigt, dass sie von Google veröffentlicht wurde.
Der Befehl gibt Folgendes an stderr aus:
OK. inclusion check success!, wenn das Paket im Log enthalten ist.FAILURE, wenn das nicht der Fall ist.
Alle Pakete auf einem Gerät automatisch bestätigen
Angesichts der Anzahl der Google-Apps, die möglicherweise auf Ihrem Gerät vorinstalliert sind, kann es mühsam sein, jede App einzeln aufzulisten und Nachweise für die Aufnahme zu erbringen.
Wir bieten ein weiteres automatisiertes Tool namens Uraniborg, mit dem alle derzeit auf Ihrem Gerät installierten Pakete erkannt und gemessen werden können.
Die Ausgabe wird direkt an das Tool verifier weitergeleitet, sodass Sie die Transparenz aller Apps auf Ihrem Gerät in einem einzigen Schritt ermitteln und bestätigen können.
Wenn Sie diesen automatisierten Workflow verwenden möchten, muss Ihr Android-Gerät über ADB mit Ihrem Computer verbunden sein. Der Quellcode von Uraniborg ist ebenfalls im Repository android-binary-transparency enthalten.
Führen Sie das Skript automate_observation.py im Verzeichnis scripts/python aus:
python3 automate_observation.py --pull-all-apks --perform_inclusion_proof_check --verifier_path <path_to_verifier_executable>
Nach Abschluss des Skripts sollte die Ausgabe in etwa so aussehen:
INFO:automate_observation.py:main(858): SUCCESS! Hubble was successfully deployed and executed on connected device ABCDEFGHN01234.
INFO:automate_observation.py:main(860): Hubble output files can be found at: /Users/user/home/src/android-binary-transparency/uraniborg/scripts/python/results/google/lynx/lynx:16/BP4A.260105.004.E1/14587043:user/release-keys/001
Rufen Sie das vom Skript angegebene Ausgabeverzeichnis auf.
Suchen Sie dort die Datei packages_with_inclusion_proof_signal.txt.
In dieser Datei ist jedes installierte Paket zusammen mit einem Feld inclusion_proof_verified aufgeführt, das entweder auf true oder false gesetzt ist.
Ein Wert von true bedeutet, dass das Paket kryptografisch anhand des Transparenzlogs bestätigt wurde. So wird bestätigt, dass es den Angaben des Logs entspricht.