Na tej stronie dowiesz się, jak sprawdzić, czy pakiet APK lub APEX zainstalowany na urządzeniu z Androidem odpowiada informacjom podanym w modelu podmiotu zgłaszającego. Proces ten obejmuje pobranie pliku APK z urządzenia i przeprowadzenie w wyodrębnionym artefakcie dowodu na włączenie do dziennika.
Proces weryfikacji
Dziennik przejrzystości jest zaimplementowany za pomocą drzewa Merkle składającego się z wartości skrótu. Węzeł liścia zawiera dane, a węzeł nadrzędny zawiera skrót jego węzłów podrzędnych.
Dwa podstawowe obliczenia weryfikują właściwość zabezpieczenia przed manipulacją w przypadku dzienników przejrzystości: dowód na uwzględnienie i dowód na spójność. Dowód włączenia potwierdza, że dziennik zawiera wpis dotyczący konkretnej wersji pliku APK. Ten wpis w dzienniku zawiera hash, czyli skrót SHA256 pliku APK zainstalowanego na urządzeniu. Dowód spójności zapewnia, że po dodaniu nowych wpisów nowy punkt kontrolny pozostaje kryptograficznie spójny z poprzednimi wersjami drzewa (lub że drzewo nie zostało zmodyfikowane). W tym przewodniku skupiamy się na procesie obliczania dowodu włączenia, a jednocześnie polegamy na świadkach, którzy stale przeprowadzają dowód spójności w odniesieniu do najnowszych punktów kontrolnych.
Aby zweryfikować objęty plik APK, przeprowadź dowód włączenia względem zaobserwowanego punktu kontrolnego. Planujemy zintegrować ten dziennik z publiczną siecią świadków za pomocą standardowego protokołu świadków. Ta integracja zapewni punkty kontrolne, które zagwarantują spójność dziennika.
Aby sprawdzić, czy aplikacje Google na urządzeniu są zgodne z deklaracjami w modelu zgłaszającego, wykonaj te czynności.
Dowód uwzględnienia
Możesz sprawdzić, czy objęty plik APK na urządzeniu znajduje się w logu, wyodrębniając go, obliczając jego hash i używając dowodu włączenia, aby sprawdzić, czy ten hash znajduje się w opublikowanym punkcie kontrolnym. Dowód włączenia zapewnia ochronę przed zagrożeniami opisanymi w modelu zagrożeń, potwierdzając, że aplikacja jest legalną aplikacją Google.
Jak sprawdzić, czy pakiet APK został uwzględniony w logu
Każda aplikacja, która twierdzi, że jest aplikacją Google, może zostać zweryfikowana na podstawie tego dziennika.
Weryfikacja – wymagania wstępne
Zanim przejdziesz do weryfikacji, czy artefakt (oprogramowanie lub plik APK) jest zgodny z deklaracją, upewnij się, że na komputerze podłączonym do sieci są dostępne te narzędzia: W zależności od celu weryfikacji nie wszystkie z nich mogą być potrzebne.
Golang
Narzędzie do weryfikacji jest napisane w języku Go. Aby je skompilować, zainstaluj Go 1.24 lub nowszą wersję z witryny Go.
Android Debug Bridge (ADB)
ADB to narzędzie, które komunikuje się z urządzeniem z Androidem, aby sprawdzić obraz lub wyodrębnić pliki APK. Jest dostępne na stronie Android SDK Platform Tools.
Weryfikator dowodu włączenia
Weryfikator dowodu włączenia to moduł Go, który wysyła zapytania do dziennika przejrzystości i określa, czy artefakt jest w nim uwzględniony.
Jest ona opublikowana w android-binary-transparency repozytorium GitHub pod adresem
https://github.com/android/android-binary-transparency/tree/main
Aby sklonować repozytorium AOSP avb:
computer:~$ git clone https://android.googlesource.com/platform/external/avb
Aby sklonować repozytorium android-binary-transparency GitHub:
computer:~$ git clone https://github.com/android/android-binary-transparency
AAPT2
AAPT2 (Android Asset Packaging Tool) to narzędzie do kompilowania i pakowania zasobów aplikacji na Androida. Jest ono dostępne jako samodzielne narzędzie w Android SDK Build Tools w wersji 26.0.2 lub nowszej.
bundletool
bundletool to narzędzie służące do tworzenia pakietów Android App Bundle (AAB). Może też służyć do weryfikowania podpisów kodu APK.
Możesz go pobrać z GitHub.
wget lub curl
wget i curl to narzędzia, których można używać do pobierania plików z internetu. Upewnij się, że masz zainstalowane jedno z tych narzędzi, ponieważ skrypty weryfikacyjne mogą z nich korzystać.
Avbtool
avbtool służy do obliczania skrótu VBMeta obrazów fabrycznych i weryfikacji plików binarnych.
Po sklonowaniu repozytorium avb (jak pokazano w sekcji Weryfikator dowodu włączenia) plik avbtool.py można znaleźć w sklonowanym katalogu avb.
Ten katalog należy dodać do zmiennej środowiskowej $PATH.
computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL
Fbpacktool
fbpacktool to skrypt w Pythonie służący do rozpakowywania poszczególnych komponentów w bootloader.img Pixela.
Nie jest to wymagane w przypadku weryfikacji plików APK.
To narzędzie jest ważne, ponieważ pozwala avbtool.py odkryć wymagane
obrazy do weryfikacji.
Aby korzystać z tego narzędzia, pobierz te 3 skrypty w Pythonie do katalogu, w którym znajduje się plik avbtool.py, nadaj plikowi fbpacktool.py uprawnienia do wykonywania i utwórz wygodny w użyciu link symboliczny o nazwie fbpacktool do pliku fbpacktool.py.
Jeśli masz 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
Jeśli masz 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 pomaga w przeprowadzaniu różnych operacji kryptograficznych za pomocą terminala w procesie weryfikacji. Sprawdź, czy jest zainstalowany w systemie. Możesz to sprawdzić w terminalu, uruchamiając to polecenie i upewniając się, że zwrócony wynik nie jest pusty:
computer:~$ which openssl
/usr/bin/openssl
Tworzenie ładunku na potrzeby weryfikacji
Aby zweryfikować wyodrębniony plik APK, musisz utworzyć ładunek logu, używając informacji pochodzących z samego pliku APK.
Zanim rozpoczniesz, włącz debugowanie USB na urządzeniu, aby zezwolić na adbpołączenia.
Następnie znajdź zainstalowany plik APK na urządzeniu. W tym przewodniku jako przykładu używamy pliku APK Usług Google Play (com.google.android.gms).
adb shell pm path com.google.android.gms
Zostaną wyświetlone dane wyjściowe podobne do tych:
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
Te dane wyjściowe wskazują, że na urządzeniu com.google.android.gms zainstalowano jeden podstawowy plik APK i kilka dzielonych plików APK.
Dokładna liczba podzielonych plików APK zależy od konfiguracji urządzenia.
Każdy podzielony plik APK ma taką samą nazwę pakietu i kod wersji jak podstawowy plik APK.
Pobierz wymienione pliki APK z urządzenia z Androidem na komputer, używając tego polecenia (pamiętaj, że rzeczywiste ścieżki plików mogą się różnić):
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
Aby sprawdzić nazwę pakietu i wersję pobranych plików APK, musisz przejrzeć ich manifest (AndroidManifest.xml).
Manifest w pliku APK jest w formacie binarnym, więc użyj narzędzia aapt2 (zainstalowanego w ramach wymagań wstępnych), aby wyodrębnić i odczytać informacje bezpośrednio z pliku APK:
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'
...
Powtarzaj ten krok, aby uzyskać odpowiednie informacje, dopóki nie uwzględnisz wszystkich podzielonych plików APK zainstalowanych na urządzeniu.
Dane wyjściowe potwierdzają, że nazwa pakietu APK to com.google.android.gms, a numer wersji (versionCode) to 260834035.
Następnie oblicz kryptograficzny skrót każdego pliku 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
Masz już wszystkie informacje potrzebne do utworzenia ładunku logu sformatowanego zgodnie z opisem w sekcji Zawartość logu. Wybierając jeden z wyników skrótu jako przykład (należy sprawdzić skrót każdego podzielonego pliku APK), ładunek dziennika wygląda tak:
66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a
SHA256(APK)
com.google.android.gms
260834035
Pamiętaj, aby dodać znak nowego wiersza na końcu pliku. Zapisz te treści w pliku, np. payload.txt, aby później użyć ich w narzędziu verifier.
Weryfikowanie włączenia pakietu (dowód włączenia)
Po utworzeniu ładunku możesz sprawdzić, czy pakiet jest uwzględniony w dzienniku przejrzystości. Skompiluj narzędzie do tworzenia dowodu włączenia z repozytorium android-binary-transparency, które zostało wcześniej sklonowane:
go build cmd/verifier/verifier.go
W tym katalogu powinien się pojawić plik wykonywalny o nazwie verifier.
Uruchom weryfikator, podając ścieżkę do ładunku i określając typ logu:
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
Weryfikator używa punktu kontrolnego i zawartości dziennika (z katalogu kafelków), aby sprawdzić, czy ładunek APK znajduje się w dzienniku przejrzystości, co potwierdza, że został opublikowany przez Google.
Polecenie wyświetla w stderr:
OK. inclusion check success!, jeśli pakiet jest uwzględniony w logu.FAILURE, jeśli nie jest.
Automatyczne weryfikowanie wszystkich pakietów na urządzeniu
Ze względu na liczbę aplikacji Google, które mogą być wstępnie zainstalowane na urządzeniu, wyliczanie każdej z nich i przeprowadzanie dowodów włączenia z osobna może być uciążliwe.
Udostępniamy też inne automatyczne narzędzie o nazwie Uraniborg, które może wykrywać i mierzyć
wszystkie zainstalowane obecnie na urządzeniu pakiety.
Przekazuje ono dane wyjściowe bezpośrednio do verifier, dzięki czemu możesz w jednym kroku odkrywać i weryfikować przejrzystość wszystkich aplikacji na urządzeniu.
Aby skorzystać z tego zautomatyzowanego procesu, upewnij się, że urządzenie z Androidem jest połączone z komputerem za pomocą kabla ADB. Kod źródłowy Uraniborg jest też dostępny w repozytorium android-binary-transparency.
Uruchom skrypt automate_observation.py znajdujący się w katalogu scripts/python:
python3 automate_observation.py --pull-all-apks --perform_inclusion_proof_check --verifier_path <path_to_verifier_executable>
Po zakończeniu skryptu powinny pojawić się dane wyjściowe podobne do tych:
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
Przejdź do katalogu wyjściowego wskazanego przez skrypt.
Znajdź w nim plik o nazwie packages_with_inclusion_proof_signal.txt.
Ten plik zawiera listę wszystkich zainstalowanych pakietów wraz z polem inclusion_proof_verified ustawionym na true lub false.
Wartość true oznacza, że pakiet został zweryfikowany kryptograficznie na podstawie dziennika przejrzystości, co potwierdza jego zgodność z informacjami w tym dzienniku.