Ta strona opisuje metodę (o najwyższym stopniu pewności), która pozwala mieć pewność, że na urządzeniu Pixel będzie działać autentyczna wersja obrazu Pixel. Polega to na pobraniu obrazu fabrycznego na komputer i sprawdzeniu dowodu włączenia logów w pobieranym artefakcie przed wgraniem go na urządzenie.
Jak zweryfikować obraz fabryczny Pixela
Wymagania wstępne weryfikacji
Zanim przejdziesz do weryfikacji, czy obraz fabryczny, który właśnie pobierzesz, jest zgodny z naszą reklamacją, wykonaj te czynności na komputerze połączonym z siecią.
Golang
Narzędzie do weryfikacji jest napisane w języku Go. Aby je skompilować, zainstaluj wersję Go 1.17 lub nowszą z witryny Go.
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ż dalsza część tego przewodnika i udostępniony przez nas skrypt wymagają obecności jednego z nich.
Avbtool
avbtool służy do obliczania skrótu VBMeta obrazów fabrycznych i weryfikacji binarnych.
Możesz go pobrać z repozytorium AOSP, korzystając z poniższego polecenia. Więcej informacji znajdziesz w powiązanej dokumentacji.
computer:~$ git clone https://android.googlesource.com/platform/external/avb
Po sklonowaniu repozytorium plik avbtool.py
znajdziesz w katalogu sklonowanego repozytorium avb
. Dodatkowo musisz dodać ten katalog do zmiennej środowiskowej $PATH
.
computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL
Weryfikator dowodów na to, że treści są odpowiednie
Weryfikator dowodu na uwzględnienie to moduł Go, który wysyła zapytanie do dziennika przejrzystości obrazów w Pixel Factory i wypisuje, czy obraz jest uwzględniony w tym dzienniku.
Po sklonowaniu repozytorium AVB powyżej kod źródłowy weryfikatora znajduje się w tools/transparency/verify/
Fbpacktool
fbpacktool to skrypt Pythona służący do rozpakowywania poszczególnych komponentów w Pixelu.bootloader.img
To narzędzie umożliwia avbtool.py
znalezienie zdjęć wymaganych do weryfikacji.
Aby korzystać z tego narzędzia, pobierz te 3 skrypty Pythona do katalogu, w którym znajduje się avbtool.py
, nadaj fbpacktool.py
uprawnienia do uruchomienia, a następnie utwórz dla fbpacktool.py
link symboliczny o nazwie fbpacktool
.
Jeśli masz wget
, możesz użyć tego polecenia, aby pobrać 3 skrypty:
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
, możesz użyć tych poleceń, aby pobrać 3 skrypty:
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
Do wykonywania różnych operacji kryptograficznych za pomocą terminala w ramach procesu weryfikacji potrzebne jest też narzędzie openssl. Upewnij się, że jest on zainstalowany w systemie. Aby sprawdzić stan w terminalu, uruchom podane niżej polecenie i upewnij się, że zwrócony wynik nie jest pusty. Na przykład:
computer:~$ which openssl
/usr/bin/openssl
Tworzenie danych Payload na potrzeby weryfikacji
Aby zweryfikować obraz na urządzeniu lub pobrany z witryny Pixel Factory, musisz najpierw utworzyć ładunek odpowiadający temu obrazowi na podstawie odcisku palca kompilacji i skrótu VBMeta. Dostępne są 2 opcje: ręczna lub automatyczna, 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:
- VBMeta Digest: skrót kryptograficzny SHA-256, który łączy ze sobą różne elementy obrazów fabrycznych.
- Przykład:
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
- Przykład:
Ręczne tworzenie ładunku
Aby ręcznie wygenerować ładunek do weryfikacji, musisz utworzyć plik tekstowy payload.txt
zawierający odcisk palca kompilacji na jednym wierszu, a następnie skrót VBMeta na kolejnym wierszu, z pustym nowym wierszem (dokładny format znajdziesz w sekcji Treść dziennika).
Po wykonaniu czynności opisanych na stronie z obrazami fabrycznymi zawartość pliku payload.txt
powinna wyglądać tak:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Wyodrębnianie danych VBMeta Digest i Build Fingerprint z witryny Pixel Factory Image
Po pobraniu obrazu fabrycznego z witryny z obrazami fabrycznymi Pixela musisz rozpakować pobrany plik, aby utworzyć kolejny folder w miejscu. Przejdź do nowo utworzonego folderu 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 obrazu 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 palca kompilacji i obliczyć skrót VBMeta ze wszystkich pobranych plików.
Gdy avbtool.py
będzie dostępne dla $PATH
, możesz użyć tych poleceń w terminalu, aby wyodrębnić odcisk palca kompilacji i obliczyć skrót VBMeta dla 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ęczne sprawdzanie pobranego obrazu fabrycznego
Aby prawidłowo zweryfikować pobrany obraz fabryczny, musisz pobrać fbpacktool.py i 2 inne pliki Pythona, od których zależy (fbpack.py i packedstruct.py), aby rozpakować komponenty w pliku bootloader.img
, ponieważ są one opisane osobno w strukturze VBMeta. Po rozpakowaniu możesz użyć narzędzia fbpacktool.py
, aby rozpakować obraz bootloadera. Na przykład:
computer:dir_containing_unzipped_images$ python3 fbpacktool.py unpack bootloader-oriole-slider-1.0-7683913.img
W tym katalogu powinny być widoczne 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 błędach, oznacza to, że VBMeta pobranego obrazu została pomyślnie zweryfikowana.
Automatyczne tworzenie ładunku
Dla wygody udostępniliśmy też skrypt Pythona. Dzięki temu narzędziu nie musisz ręcznie pobierać ani 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.
Wykonywanie tego polecenia powoduje pobranie pakietu obrazów fabrycznych, rozpakowanie tego pakietu i weryfikację podpisów podpisanych partycji. Po pomyślnej weryfikacji zostanie utworzony nowy plik o nazwie payload.txt
, a jego zawartość powinna wyglądać tak:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Po utworzeniu pliku payload.txt możesz rozpocząć weryfikację uwzględnienia obrazu.
Weryfikacja uwzględnienia obrazu (dowód uwzględnienia)
Po utworzeniu ładunku ustaw zmienną powłoki (np.
$PAYLOAD_PATH
), aby wskazywała ścieżkę do ładunku.
W repozytorium avb
w ramach projektu Android Open Source opublikowano narzędzie do weryfikacji włączenia. Aby 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 korzysta z punktu kontrolnego i treści dziennika (znajdują się w katalogu płytek), aby sprawdzić, czy ładunek danych obrazu znajduje się w dzienniku przejrzystości, czyli czy został opublikowany przez Google.
Wynik polecenia jest zapisywany na wyjściu standardowym:
OK. inclusion check success!
jeśli obraz jest zawarty w logu,FAILURE
jeśli tak nie jest.