Na tej stronie opisujemy metodę (z najwyższym stopniem pewności), która pozwala sprawdzić, czy na urządzeniu Pixel można uruchomić legalną wersję obrazu Pixela. Wymaga to pobrania obrazu fabrycznego na komputer i przeprowadzenia weryfikacji włączenia do dziennika pobranego artefaktu przed jego wgraniem na urządzenie.
Jak zweryfikować obraz fabryczny Pixela
Weryfikacja – wymagania wstępne
Zanim przejdziesz do weryfikacji, czy artefakt (oprogramowanie układowe lub APK) jest zgodny z deklaracją, upewnij się, że na komputerze połączonym z 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 w wersji 1.24 lub nowszej ze strony 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 website.
Weryfikator włączenia do dziennika
Weryfikator włączenia do dziennika to moduł Go, który wysyła zapytania do dziennika przejrzystości i sprawdza, czy artefakt jest w nim uwzględniony.
Jest on opublikowany w repozytorium GitHub android-binary-transparency 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 GitHub android-binary-transparency:
computer:~$ git clone https://github.com/android/android-binary-transparency
AAPT2
AAPT2 (Android Asset Packaging Tool) to narzędzie do kompilacji, które służy do kompilowania i pakowania zasobów aplikacji na Androida. Można je znaleźć jako samodzielne narzędzie w Android SDK Build Tools w wersji 26.0.2 i 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żna je 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 włączenia do dziennika
) plik avbtool.py można znaleźć w sklonowanym katalogu avb.
Dodaj ten katalog do zmiennej środowiskowej $PATH.
computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL
Fbpacktool
fbpacktool
to skrypt w Pythonie, który służy do rozpakowywania poszczególnych komponentów w pliku Pixela
bootloader.img.
Nie jest on potrzebny, jeśli weryfikujesz pliki APK.
To narzędzie jest ważne, ponieważ umożliwia avbtool.py wykrywanie obrazów wymaganych do weryfikacji.
fbpacktool wymaga Pythona w wersji 3.6 lub nowszej oraz pakietu
PyYAML
(np. python3 -m pip install pyyaml).
Aby korzystać z tego narzędzia, pobierz te 6 skryptów w Pythonie
do katalogu, w którym znajduje się plik avbtool.py,
ustaw uprawnienia wykonywania dla pliku fbpacktool.py,
i utwórz link symboliczny o nazwie fbpacktool do pliku fbpacktool.py.
Jeśli masz wget:
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
Jeśli masz curl:
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
openssl pomaga wykonywać różne operacje kryptograficzne za pomocą terminala w procesie weryfikacji. Upewnij się, że jest zainstalowany w systemie. Możesz to sprawdzić w terminalu, wykonują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ć obraz na urządzeniu lub pobrany ze strony Obraz fabryczny Pixela, musisz najpierw utworzyć ładunek odpowiadający temu obrazowi na podstawie odcisku palca kompilacji i skrótu VBMeta. Możesz to zrobić ręcznie lub automatycznie, jak opisano poniżej.
- Odcisk cyfrowy kompilacji: ciąg znaków identyfikujący obraz fabryczny.
- Przykład:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
- Przykład:
- Skrót VBMeta: skrót kryptograficzny SHA-256, który łączy różne części obrazów fabrycznych.
- Przykład:
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
- Przykład:
Ręczne tworzenie ładunku
Aby ręcznie wygenerować ładunek na potrzeby weryfikacji, utwórz plik tekstowy, payload.txt który zawiera odcisk cyfrowy kompilacji w jednym wierszu, a następnie skrót VBMeta w następnym wierszu z pustym nowym wierszem (dokładny format znajdziesz w sekcji Zawartość dziennika).
Po wykonaniu czynności opisanych na stronie
Obraz fabryczny,
zawartość pliku payload.txt powinna wyglądać tak:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Wyodrębnianie skrótu VBMeta i odcisku cyfrowego kompilacji ze strony Obraz fabryczny Pixela
Gdy pobierzesz obraz fabryczny z
Obraz fabryczny Pixela, musisz rozpakować pobrany plik, co spowoduje utworzenie kolejnego folderu. Otwórz nowo utworzony folder i rozpakuj powiązany plik image-*.zip, aby uzyskać poszczególne pliki *.img. Są to pliki binarne partycji. Upewnij się, że wśród plików img znajduje się plik vbmeta.img.
Powinien pojawić się ekran podobny do tego:
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
Możesz wyodrębnić odcisk cyfrowy kompilacji i obliczyć skrót VBMeta ze wszystkich pobranych plików.
Gdy avbtool.py będzie dostępny w $PATH, możesz wydać te polecenia w terminalu, aby wyodrębnić odcisk palca kompilacji specyficzny dla urządzenia i obliczyć skrót VBMeta pobranego obrazu fabrycznego:
computer:dir_containing_unzipped_factory_image~$ grep -a 'ro\.product\.build\.fingerprint=google/.*/release-keys' product.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
Ręczna weryfikacja pobranego obrazu fabrycznego
Aby prawidłowo zweryfikować pobrany obraz fabryczny, musisz
pobrać
fbpacktool.py
i inne pliki w Pythonie, od których zależy (pełną listę i polecenia pobierania znajdziesz w sekcji
Fbpacktool w wymaganiach wstępnych)
aby rozpakować komponenty w bootloader.img, ponieważ są one opisane osobno
w strukturze VBMeta. Gdy masz już rozpakowywarkę, możesz użyć fbpacktool.py, aby rozpakować obraz programu rozruchowego. Na przykład:
computer:dir_containing_unzipped_images$ python3 fbpacktool.py unpack bootloader-oriole-slider-1.0-7683913.img
W tym katalogu powinny pojawić się dodatkowe pliki .img.
Teraz możesz użyć avbtool.py, aby ręcznie sprawdzić, czy podpisy różnych partycji są zgodne.
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
Jeśli nie widzisz żadnych komunikatów o błędach ani niepowodzeniach, oznacza to, że VBMeta pobranego obrazu została zweryfikowana.
Automatyczne tworzenie ładunku
Dla Twojej wygody udostępniliśmy też skrypt w Pythonie. Dzięki temu narzędziu nie musisz ręcznie pobierać i rozpakowywać plików. Wystarczy, że podasz adres URL obrazu fabrycznego.
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.
Wykonanie powyższego polecenia spowoduje pobranie pakietu obrazu fabrycznego, rozpakowanie go i zweryfikowanie podpisów podpisanych partycji. Po pomyślnej weryfikacji utworzy nowy plik o nazwie payload.txt, a jego zawartość powinna wyglądać podobnie do tej:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Gdy plik payload.txt zostanie utworzony, możesz rozpocząć weryfikację włączenia obrazu.
Weryfikowanie włączenia obrazu (weryfikacja włączenia do dziennika)
Gdy utworzysz ładunek, ustaw zmienną powłoki (np. $PAYLOAD_PATH) tak, aby wskazywała ścieżkę do ładunku.
Narzędzie do weryfikacji włączenia do dziennika zostało opublikowane w
avb repozytorium
w ramach projektu Android Open Source. Aby je uruchomić:
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
Weryfikator używa punktu kontrolnego i zawartości dziennika (znajdujących się w katalogu tile), aby sprawdzić, czy ładunek obrazu znajduje się w dzienniku przejrzystości, czyli czy został opublikowany przez Google.
Wynik polecenia jest zapisywany w standardowym wyjściu:
OK. inclusion check success!– jeśli obraz jest uwzględniony w dzienniku,FAILURE– jeśli nie jest.