Wiązanie z wersją

Wszystkie klucze KeyMint muszą być powiązane ze źródłem zaufania urządzenia. Źródło zaufania to ciąg bitów pochodzący z klucza publicznego używanego do weryfikacji podpisu obrazu rozruchowego oraz stanu blokady programu rozruchowego.

Klucze KeyMint muszą być też powiązane z wersją systemu operacyjnego i poziomem poprawek na urządzeniu. Aby obsługiwać modułową strukturę Treble, to powiązanie wersji obejmuje osobne poziomy poprawek dla każdej partycji (boot, system i vendor). Dzięki temu każdą partycję można aktualizować niezależnie, zachowując ochronę przed przywróceniem poprzedniej wersji.

Aby wdrożyć to powiązanie wersji, zaufana aplikacja KeyMint potrzebuje sposobu na bezpieczne otrzymywanie informacji o bieżącej wersji systemu operacyjnego i poziomach poprawek oraz na upewnienie się, że otrzymane informacje są zgodne ze wszystkimi informacjami o uruchomionym systemie.

  • Urządzenia z weryfikacją podczas uruchamiania Androida (AVB):
    • Poziomy poprawek i wersja systemu operacyjnego mogą być uwzględnione w vbmeta.img, dzięki czemu program rozruchowy może przekazać je do KeyMint.
    • W przypadku partycji połączonych łańcuchowo informacje o wersji partycji znajdują się w połączonym łańcuchowo VBMeta.
    • Ogólnie informacje o wersji powinny znajdować się w VBMeta struct, który zawiera dane weryfikacyjne (skrót lub drzewo skrótów) dla danej partycji.
  • Urządzenia bez AVB:
    • Implementacje weryfikacji podczas uruchamiania muszą dostarczać programowi rozruchowemu wartość skrótu metadanych wersji, aby program rozruchowy mógł przekazać ją do KeyMint.
    • boot.img może nadal przechowywać poziomy poprawek w nagłówku.
    • system.img może nadal przechowywać poziomy poprawek i wersję systemu operacyjnego we właściwościach tylko do odczytu.
    • vendor.img przechowuje poziom poprawek we właściwości tylko do odczytu ro.vendor.build.version.security_patch.
    • Program rozruchowy może dostarczyć do KeyMint skrót wszystkich danych zweryfikowanych przez weryfikację podczas uruchamiania.

Te tagi opisują informacje o wersji odpowiednich partycji:

Implementacje KeyMint powinny traktować wszystkie poziomy poprawek niezależnie. Klucze są użyteczne, jeśli wszystkie informacje o wersji są zgodne z wartościami powiązanymi z kluczem. Jeśli bieżąca wersja urządzenia jest nowsza niż jakakolwiek wartość powiązana z kluczem, KeyMint zwraca błąd KEY_REQUIRES_UPGRADE przy każdej próbie użycia klucza. Następnie Keystore wykonuje IKeyMintDevice::upgradeKey, aby wygenerować nowy obiekt keyblob powiązany z bieżącymi poziomami poprawek (a potem usuwa poprzedni obiekt keyblob, wywołując IKeyMintDevice::deleteKey).