Przejrzystość plików APK usług systemowych Google

W ramach ciągłych inwestycji Google w przejrzystość swoich usług dodajemy informacje o prywatności do plików APK dwóch nowych usług systemowych Google: Android System SafetyCore (com.google.android.safetycore) i Android System Key Verifier (com.google.android.contactkeys). Te pliki APK obsługują odpowiednio ostrzeżenia o kontrowersyjnych treściach i funkcję weryfikacji klucza kryptograficznegoWiadomościach Google. Dziennik przejrzystości, który opublikowaliśmy, aby zweryfikować nasze twierdzenia dotyczące tych plików APK.

Pakiety objęte ochroną

W tej sekcji opisano pakiety objęte dziennikiem przejrzystości oraz ich klucze podpisywania kodu przejrzystości.

Android System SafetyCore

Android System SafetyCore (com.google.android.safetycore) to element systemu Androida, który zapewnia aplikacjom infrastrukturę chroniącą prywatność użytkowników na urządzeniu.

Kod z tego pliku APK jest obecnie podpisany za pomocą tego klucza opisanego w tym certyfikacie:

-----BEGIN CERTIFICATE-----
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
4ZM=
-----END CERTIFICATE-----

Weryfikator kluczy systemowych Androida

Plik APK weryfikator kluczy systemowych Androida (com.google.android.contactkeys) to usługa do weryfikacji kontaktów na Androidzie. Umożliwia użytkownikowi zweryfikowanie kluczy publicznych kontaktu, aby potwierdzić, że komunikuje się z osobą, do której chce wysłać wiadomość. Usługa ta to ujednolicony system weryfikacji kluczy publicznych w różnych aplikacjach, który wykorzystuje skanowanie kodu QR lub porównanie numerów.

Kod z tego pliku APK jest obecnie podpisany za pomocą tego klucza opisanego w tym certyfikacie:

-----BEGIN CERTIFICATE-----
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
PLM=
-----END CERTIFICATE-----

Model zagrożenia

Systemy przejrzystości mogą służyć do wykrywania ataków na łańcuch dostaw i w ten sposób do ich powstrzymywania. Poniżej przedstawiamy kilka przykładów.

Załóżmy, że atakujący modyfikuje plik APK usług systemowych Google i podpisuje go kluczem podpisywania używanym przez Google Play. Każdy, kto otrzyma złośliwy plik APK, może wysłać zapytanie do dziennika przejrzystości binarnych, aby sprawdzić autentyczność pliku APK. Użytkownik zobaczy, że Google nie dodało odpowiednich metadanych pliku APK do dziennika, i wie, że nie powinien ufać zainfekowanemu plikowi APK.

Ponieważ publikowanie w dzienniku jest oddzielnym procesem od procesu uwierzytelniania z podpisem (jak pokazano na diagramie ekosystemu), zwiększa to wymagania wobec atakującego, który nie może ograniczyć się do skompromitowania klucza.

Planujemy też zintegrować ten dziennik z publiczną siecią świadków za pomocą standardowego protokołu świadków. Zachęcamy zewnętrzne, niezależne podmioty do monitorowania integralności tego publicznie dostępnego dziennika. Te osoby mogą potwierdzić, że dziennik ma właściwość „tylko do dołączania”, oraz zgłaszać wszelkie próby manipulacji.

Istnienie takiego systemu przejrzystości i dodatkowa możliwość wykrywania ataków zniechęcają do szkodliwych działań. Jeśli plik APK został naruszony, a użytkownicy ufają tylko tym, które są w dzienniku, naruszony plik APK musi być udostępniony publicznie. Zwiększa to prawdopodobieństwo wykrycia zainfekowanego pliku APK i podjęcia działań, aby zablokować jego rozpowszechnianie.

Model strony wnoszącej roszczenie

Model zgłaszającego to struktura służąca do definiowania ról i elementów w systemie weryfikowalnym. W przypadku przejrzystości plików APK usług systemowych Google twierdzimy, że hasz podpisanych plików binarnych zapisany w tym dzienniku reprezentuje oficjalny kod plików APK odpowiednich usług systemowych Google.

  • UprawnieniaGoogleSystemServicesApk: (I, Google, claim that $codeSignature is for $googleSystemServicesApk), gdzie:
    • $codeSignature to podpisany token sieciowy JSON (JWT), który zawiera listę plików DEX i bibliotek natywnych oraz odpowiadające im ciągi haszujące zawarte w konkretnej wersji $googleSystemServicesApk.
    • $googleSystemServicesApk to pakiet na Androida (APK) z tego zestawu pakietów: {Android System SafetyCore (com.google.android.safetycore), Android System Key Verifier (com.google.android.contactkeys)}

Każda osoba, która ma kopię $googleSystemServicesApk, może zweryfikować powyższe informacje. Szczegóły tego procesu znajdziesz na stronie weryfikacji.

Treść dziennika

Gdy Google wyda nową wersję wymienionych powyżej plików APK, dodaje odpowiedni wpis do dziennika przejrzystości plików APK usług systemowych Google.

Każdy wpis w tym logach zawiera 4 elementy metadanych pliku APK:

  1. Hasz podpisu kodu pliku APK opracowanego przez Google. Jest to ciąg szesnastkowy skrótu SHA256 tokena przejrzystości kodu (zwanego też tokenem JWT przejrzystości kodu).
  2. Opis typu haszu powyżej. To jest ciąg znaków.
  3. Nazwa pakietu pliku APK. To jest ciąg znaków.
  4. Numer wersji (versionCode) pliku APK. Jest to liczba całkowita.

Format wpisu w logu to konkatenacja tych 4 elementów za pomocą znaku nowego wiersza (\n), jak pokazano poniżej:

hash\nSHA256(Signed Code Transparency JWT)\npackage_name\npackage_version\n

Pamiętaj, że w tej wersji eksperymentujemy z użyciem przejrzystości kodu. Oznacza to, że zamiast hasha pliku APK rejestrujemy wynik funkcji digest dla tokenu przejrzystości kodu. Dlatego opis hasha jest obecnie ustalony jako SHA256(Signed Code Transparency JWT).

Pokazuje też, jak deweloperzy aplikacji mogą korzystać z przejrzystości kodu, gdy klucze podpisywania aplikacji są przechowywane przez Google Play.

Schemat ekosystemu

Schemat ekosystemu zweryfikowanych logów