Binding versi

Semua kunci KeyMint harus terikat dengan root of trust untuk perangkat. Root of trust adalah bitstring yang berasal dari kunci publik yang digunakan untuk memverifikasi tanda tangan image booting, bersama dengan status kunci bootloader.

Kunci KeyMint juga harus terikat dengan versi sistem operasi dan tingkat patch perangkat. Untuk mendukung struktur modular Treble, binding versi ini menyertakan tingkat patch terpisah untuk setiap partisi (boot, system, dan vendor). Hal ini memungkinkan setiap partisi diupdate secara independen, sekaligus tetap memberikan perlindungan rollback.

Untuk menerapkan binding versi ini, aplikasi tepercaya KeyMint (TA) memerlukan cara untuk menerima versi OS dan tingkat patch saat ini dengan aman, dan untuk memastikan bahwa informasi yang diterima cocok dengan semua informasi tentang sistem yang berjalan.

  • Perangkat dengan Android Verified Boot (AVB):
    • Tingkat patch dan versi OS dapat disertakan di vbmeta.img, sehingga bootloader dapat menyediakannya ke KeyMint.
    • Untuk partisi berantai, info versi untuk partisi berada dalam VBMeta berantai.
    • Secara umum, informasi versi harus berada di VBMeta struct yang berisi data verifikasi (hash atau hashtree) untuk partisi tertentu.
  • Perangkat tanpa AVB:
    • Implementasi Verified Boot perlu memberikan hash metadata versi ke bootloader, sehingga bootloader dapat memberikan hash ke KeyMint.
    • boot.img dapat terus menyimpan level patch di header.
    • system.img dapat terus menyimpan level patch dan versi OS dalam properti hanya baca.
    • vendor.img menyimpan tingkat patch di properti hanya baca ro.vendor.build.version.security_patch.
    • Bootloader dapat memberikan hash dari semua data yang divalidasi oleh Booting Terverifikasi ke KeyMint.

Tag berikut menjelaskan informasi versi untuk partisi yang relevan:

Implementasi KeyMint harus memperlakukan semua tingkat patch secara terpisah. Kunci dapat digunakan jika semua info versi cocok dengan nilai yang terkait dengan kunci. Jika versi perangkat saat ini lebih baru dari nilai apa pun yang terkait dengan kunci, KeyMint akan menampilkan error KEY_REQUIRES_UPGRADE pada setiap upaya untuk menggunakan kunci. Keystore kemudian menjalankan IKeyMintDevice::upgradeKey() untuk membuat keyblob baru yang terikat dengan level patch saat ini (dan Keystore kemudian menghapus keyblob sebelumnya dengan panggilan ke IKeyMintDevice::deleteKey()).