Dziennik transparentności plików binarnych Pixela korzysta z technologii dziennika transparentności.
Użyteczność dzienników transparentności została potwierdzona przez protokół Certificate Transparency, który wymaga od urzędów certyfikacji publikowania wydawanych przez nie certyfikatów w publicznych dziennikach Certificate Transparency. Ten proces znacznie ograniczył nieprawidłowe wydawanie certyfikatów, co zwiększyło bezpieczeństwo internetu. Wielu operatorów dzienników Certificate Transparency korzysta z implementacji dzienników transparentności dostępnej na stronie transparency.dev.
Dzienniki transparentności są implementowane za pomocą drzew Merkle. Ta strona zakłada ogólną znajomość drzew Merkle i transparentności plików binarnych. Omówienie drzew Merkle znajdziesz w artykule Verifiable Data Structures (Weryfikowalne struktury danych), a omówienie transparentności plików binarnych – na stronie docelowej.
Implementacja dziennika
Dziennik transparentności plików binarnych Pixela jest implementowany jako
drzewo Merkle oparte na kafelkach. Główny katalog treści kafelków jest dostępny pod adresem https://developers.google.com/android/binary_transparency/tile. Uwaga: to nie jest zwykła strona internetowa. Wpisy w dzienniku znajdujące się w jej podkatalogach należy odczytywać programowo za pomocą biblioteki Golang SumDB
TLog, a nie w przeglądarce.
Opis zawartości wpisów znajdziesz w artykule Log Content (Zawartość dziennika) .
Hash główny drzewa Merkle dziennika, zawarty w punkcie kontrolnym, jest dostępny pod adresem https://developers.google.com/android/binary_transparency/checkpoint.txt. Jest on przedstawiony w formacie punktu kontrolnego. Liście tego drzewa Merkle są dostępne pod adresem https://developers.google.com/android/binary_transparency/image_info.txt. Podpis punktu kontrolnego można zweryfikować za pomocą tego klucza publicznego:
-----BEGIN CERTIFICATE-----
MIICPDCCAeOgAwIBAgIVAPooxISw/nFF/dPwmCUaV36Z4s3hMAoGCCqGSM49BAMCMHQxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYD
VQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAgFw0y
MTA3MTkyMjQxNDFaGA8yMDUxMDcxOTIyNDE0MVowdDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNh
bGlmb3JuaWExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC0dvb2dsZSBJbmMuMRAw
DgYDVQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRyb2lkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD
QgAEU83uXNUiTYE53c2TfdWmqpW20bBXy4KEf5Ff8dV8GLKlVAXKHyjw3Lp9J3E0yCRJ/39XKeuA
AMF7KzSvhD248KNQME4wDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUHRpvuNkzjtBY213BWgUyWWHm
3VYwHwYDVR0jBBgwFoAUHRpvuNkzjtBY213BWgUyWWHm3VYwCgYIKoZIzj0EAwIDRwAwRAIgZsZb
CNBXRkCKLS+LG/41VWj1cTszt9QCdJQNuy7aT94CIDPgn7v5b1ykBVUTuLgRSofxAzHg9R4dg1oA
7tTFAuDg
-----END CERTIFICATE-----
Proces weryfikacji odczytuje punkt kontrolny i kafelki zawierające wpisy w dzienniku.
Proces weryfikacji
Dziennik transparentności jest implementowany za pomocą drzewa Merkle składającego się z hashów. Węzeł liścia zawiera dane, a węzeł nadrzędny – hash swoich elementów podrzędnych.
Aby zweryfikować właściwość dzienników transparentności polegającą na wykrywaniu manipulacji, w drzewie Merkle wykonuje się 2 obliczenia: dowód uwzględnienia i dowód spójności. Pierwszy dowodzi, że dziennik zawiera wpis odpowiadający wersji obrazu, czyli. Wpis w dzienniku zawiera skrót VBMeta, czyli hash reprezentujący obrazy systemu operacyjnego, który można uzyskać z urządzenia. Drugi dowodzi, że gdy do drzewa dodawane są nowe wpisy, nowy punkt kontrolny jest zgodny z poprzednią wersją drzewa.
Aby zweryfikować obraz Pixela, wykonaj dowód uwzględnienia. Wykonanie obliczenia dowodu spójności jest opcjonalne, ponieważ robią to stale osoby trzecie.
Jeśli chcesz zapoznać się z koncepcjami weryfikacji w transparentności plików binarnych Pixela, możesz postępować zgodnie z instrukcjami poniżej, aby użyć obrazu działającego na urządzeniu Pixel. Jeśli chcesz uruchomić oprogramowanie układowe Pixela z najwyższym stopniem pewności, zapoznaj się z procesem weryfikacji w artykule Pixel Binary Transparency Full Verification (Pełna weryfikacja transparentności plików binarnych 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 dowodu uwzględnienia
Weryfikator dowodu uwzględnienia to moduł Go, który wysyła zapytania do dziennika transparentności i informuje, czy artefakt jest uwzględniony w dzienniku.
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 służące 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 pakietu 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 dowodu uwzględnienia
) 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 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ę plik avbtool.py,
ustaw uprawnienia wykonywania dla pliku fbpacktool.py,
i utwórz dowiązanie symboliczne 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 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
Dowód uwzględnienia
Właściciel Pixela może sprawdzić, czy jego obraz znajduje się w dzienniku, najpierw wyodrębniając odpowiednie metadane, a następnie porównując ponownie obliczony hash główny z hashem głównym zawartym w opublikowanym punkcie kontrolnym. Jeśli są zgodne, właściciel Pixela może mieć pewność, że korzysta z niektórych zabezpieczeń opisanych w modelu zagrożeń.
Aby sprawdzić, czy obraz na urządzeniu Pixel znajduje się w dzienniku transparentności, połącz się z urządzeniem za pomocą adb, a następnie uruchom te polecenia:
FINGERPRINT=$(adb shell getprop ro.build.fingerprint)
VBMETA_DIGEST=$(adb shell getprop ro.boot.vbmeta.digest)
LOG_ENTRY="${FINGERPRINT}\n${VBMETA_DIGEST}\n"
PAYLOAD_PATH="/tmp/log_payload.txt"
echo -e $LOG_ENTRY >> $PAYLOAD_PATH
cd avb/tools/transparency/verify/
go build cmd/verifier/verifier.go
./verifier --payload_path=$PAYLOAD_PATH
Pierwszy blok pobiera metadane z urządzenia Pixel w formacie wpisu w dzienniku i zapisuje je w pliku /tmp/log_payload.txt.
Drugi blok uruchamia weryfikator dowodu uwzględnienia opublikowany w repozytorium Android Verified Boot. To narzędzie oblicza hash kandydata na wpis w dzienniku, pobiera inne hashe niezbędne do ponownego obliczenia punktu kontrolnego z dziennika i porównuje go z punktem kontrolnym opublikowanym przez dziennik.
Wynik polecenia jest zapisywany w standardowym wyjściu:
OK– jeśli obraz jest uwzględniony w dzienniku,FAILURE– jeśli nie jest.
Dowód spójności (opcjonalnie)
Ponieważ Google okresowo udostępnia nowe wersje obrazu fabrycznego Pixela, dziennik transparentności stale się powiększa. Świadek sprawdza, czy drzewo rośnie w sposób zgodny z jego poprzednimi liśćmi. Świadek śledzi hash główny drzewa i oblicza następny hash główny kandydata, wysyłając zapytanie o nowe hashe liści z drzewa. Aby dziennik transparentności był odporny na manipulacje, należy stale sprawdzać jego spójność.
Zachowanie dziennika transparentności polegające na dodawaniu tylko nowych wpisów jest aktywnie sprawdzane przez osoby trzecie, więc większość użytkowników nie musi tego robić samodzielnie, ale każdy może monitorować spójność dziennika. Google opublikowało implementację świadka open source w tym repozytorium GitHub. Konieczne jest użycie konfiguracji specyficznej dla dziennika transparentności plików binarnych Pixela (PixelBT).