Na tej stronie opisujemy metodę (o najwyższym stopniu pewności), która pozwala upewnić się, że na urządzeniu Pixel możesz uruchomić legalną wersję obrazu Pix. Wymaga to pobrania obrazu fabrycznego na komputer i przeprowadzenia weryfikacji włączenia do dziennika pobranego artefaktu przed wgraniem go 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 podłączonym do sieci są dostępne te narzędzia. W zależności od celu weryfikacji możesz nie potrzebować wszystkich z nich.
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 lub nowszej.
bundletool
bundletool to narzędzie służące do tworzenia pakietów Android App Bundle (AAB). Można go też używać do weryfikowania podpisów kodu APK.
Można 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 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.
Aby korzystać z tego narzędzia, pobierz te 3 skrypty w Pythonie
do katalogu, w którym znajduje się avbtool.py,
ustaw uprawnienia wykonywania dla fbpacktool.py,
i utwórz link symboliczny o nazwie fbpacktool do 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 wykonywać różne operacje kryptograficzne za pomocą terminala w procesie weryfikacji. Upewnij się, że 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 do 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 cyfrowego 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 do 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 Pixela,
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
strony Obraz fabryczny Pixela, musisz rozpakować pobrany plik, co spowoduje utworzenie w tym miejscu kolejnego folderu. Otwórz nowo utworzony folder i rozpakuj powiązany plik image-*.zip, aby uzyskać poszczególne pliki *.img. Te pliki binarne to obrazy 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 uruchomić w terminalu te polecenia, aby wyodrębnić odcisk cyfrowy kompilacji i obliczyć skrót VBMeta właśnie pobranego obrazu fabrycznego:
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
Ręczna weryfikacja pobranego obrazu fabrycznego
Aby prawidłowo zweryfikować pobrany obraz fabryczny, musisz
pobrać
fbpacktool.py
i 2 inne pliki w Pythonie, od których zależy
(fbpack.py
i
packedstruct.py)
aby rozpakować komponenty w bootloader.img, ponieważ są one opisane osobno
w strukturze VBMeta. Gdy masz już rozpakowywarkę, możesz użyć fbpacktool.py do rozpakowania obrazu 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 pomyślnie 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.
Uruchomienie 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.
W repozytorium
avb
w ramach projektu Android Open Source Project opublikowano narzędzie do weryfikacji włączenia do dziennika. 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!(OK. Weryfikacja włączenia do dziennika zakończona pomyślnie), jeśli obraz jest uwzględniony w dzienniku,FAILURE(NIEPOWODZENIE), jeśli nie jest.