Weaver

Hardware Abstraction Layer (HAL) Weaver (IWeaver.aidl), yang diperkenalkan di Android 8.1, menyediakan antarmuka yang aman untuk autentikasi pengguna dengan Faktor Pengetahuan Layar Kunci (LSKF) seperti PIN, pola, dan sandi.

Weaver menggantikan fungsi verifikasi LSKF Gatekeeper. Namun, Gatekeeper masih digunakan untuk membuat token autentikasi hardware.

Di Android 9 dan yang lebih tinggi, CDD 9.11.2 mewajibkan perangkat yang mendukung StrongBox untuk menyediakan hardware aman khusus yang mendukung autentikasi pengguna yang aman. Mengimplementasikan HAL Weaver menggunakan hardware aman ini memenuhi persyaratan "autentikasi pengguna yang aman".

Di perangkat tanpa Elemen Pengaman (SE) khusus, Weaver masih dapat diimplementasikan di Trusted Execution Environment (TEE) seperti Trusty.

Di Android 17 dan yang lebih tinggi, penerapan Weaver sangat direkomendasikan meskipun di perangkat tanpa elemen pengamanan khusus.

Komponen

Weaver terdiri dari tiga komponen:

  • Antarmuka AIDL Weaver (IWeaver): Spesifikasi formal HAL. Android 13 dan yang lebih lama menggunakan HIDL, bukan AIDL.
  • Layanan Weaver Hardware Abstraction Layer (HAL): Proses Android khusus vendor yang mengimplementasikan antarmuka IWeaver.
  • Aplikasi Tepercaya Weaver (TA): Logika inti yang berjalan di lingkungan yang aman. Hal ini melakukan verifikasi LSKF dan menerapkan pembatasan kapasitas. Layanan HAL berkomunikasi dengan TA menggunakan saluran aman khusus implementasi.

Antarmuka

Antarmuka Weaver menampilkan array ukuran tetap dari slot persisten, yang masing-masing berisi kunci ukuran tetap dan nilai ukuran tetap. Setiap slot diidentifikasi berdasarkan ID-nya, yaitu bilangan bulat dalam interval [0, numSlots - 1]. Nilai slot hanya dapat diakses jika kunci yang cocok dengan kunci yang disimpan diberikan.

Antarmuka Weaver terutama terdiri dari:

  • getConfig(): Mengambil jumlah slot, ukuran kunci, dan ukuran nilai yang didukung oleh implementasi.
  • write(): Menimpa slot yang ditentukan dengan pasangan nilai kunci baru. Operasi ini bersifat atomik dan membuat data sebelumnya tidak dapat dipulihkan secara permanen (penghapusan aman).
  • read(): Mencoba mengambil nilai slot yang ditentukan. Operasi ini hanya berhasil jika waktu tunggu pembatasan kecepatan (diterapkan oleh TA) tidak aktif dan kunci yang diberikan sama persis dengan kunci yang disimpan.
  • warmUp(): Di Android 17 dan yang lebih tinggi, menyampaikan petunjuk bahwa pembacaan atau penulisan mungkin akan segera terjadi.

Untuk mengetahui spesifikasi antarmuka lengkap, lihat IWeaver.aidl.

Penggunaan oleh Android

Jika implementasi Weaver tersedia, LockSettingsService di server sistem Android menggunakannya untuk melindungi data pengguna. Untuk setiap pengguna di perangkat, LockSettingsService mengelola slot Weaver:

  • Kunci slot (weaverKey): Hash LSKF pengguna. Jika pengguna tidak memiliki kunci layar, string default akan digunakan.
  • Nilai slot (weaverSecret): Rahasia kriptografi yang dihasilkan secara acak dengan entropi tinggi.

weaverSecret dirancang untuk diambil hanya oleh:

  • Menyediakan weaverKey yang benar ke Weaver TA dalam kebijakan pembatasan kapasitasnya.
  • Membahayakan lingkungan aman tempat TA Weaver berjalan. Hal ini dimaksudkan agar sangat sulit.

LockSettingsService menggunakan weaverKey dan weaverSecret untuk mengenkripsi Sandi Sintetis pengguna. Karena Sandi Sintetis melindungi penyimpanan yang Dienkripsi dengan Kredensial (CE) pengguna untuk Enkripsi Berbasis File (FBE) dan kunci terikat autentikasi pengguna di Android Keystore, data tetap tidak dapat diakses hingga Weaver merilis secret.

Di Android 17 dan yang lebih tinggi, panggilan LockSettingsService memanggil metode warmUp() Weaver saat LSKF mulai dimasukkan. Penerapan Weaver dapat menggunakan sinyal ini untuk mentransisikan hardware aman dari status daya rendah guna mengurangi latensi untuk permintaan read() yang akan datang.

Weaver vs. Gatekeeper

Secara historis, HAL Gatekeeper menjalankan dua peran berbeda dalam satu panggilan verify():

  1. Verifikasi: Memeriksa LSKF, dengan pembatasan frekuensi yang diterapkan TEE.
  2. Pengesahan: Menerbitkan HardwareAuthToken untuk memberi tahu KeyMint (sebelumnya Keymaster) bahwa autentikasi LSKF berhasil.

Mengapa beralih ke Weaver?

Dengan diperkenalkannya token reset kode sandi aman di Android 8.1, "Sandi Sintetis" menjadi rahasia kriptografi utama. Kedua peran yang dijelaskan di atas kini ditangani oleh pendaftaran Gatekeeper terpisah, satu untuk LSKF di userId + 100000 dan satu untuk Sandi Sintetis di userId.

Weaver diperkenalkan untuk mengambil alih peran pertama, menggunakan antarmuka HAL yang lebih sederhana dengan dukungan untuk penerapan berbasis Secure Element (SE).

Fitur Weaver Pemilah Komunikasi
Penghapusan Aman Penghapusan aman diperlukan, dan mudah untuk menerapkannya karena antarmuka menggunakan sejumlah slot berukuran tetap. Penghapusan aman tidak diperlukan, dan sulit untuk menerapkannya karena antarmuka mendukung jumlah pendaftaran yang tidak terbatas.
Hardware Dioptimalkan untuk SE, tetapi juga berfungsi di TEE. Efektif hanya TEE. Menerapkannya di SE tidak memberikan manfaat keamanan dengan desain saat ini.
Penanganan Error Kode error yang lebih jelas Kode error ambigu. Akibatnya, layar kunci tidak membedakan antara LSKF yang salah dan kegagalan yang tidak terkait.
Atomisitas (Atomicity) Kode di LockSettingsService yang menggunakan Weaver melakukan perubahan LSKF secara atomik. Data baru ditulis ke slot Weaver baru, dan slot lama dihapus hanya jika aman untuk melakukannya. Kode di LockSettingsService yang menggunakan Gatekeeper tidak melakukan perubahan LSKF secara atomik. Semua data pengguna dapat hilang jika terjadi masalah saat LSKF diubah.

Kode referensi

AOSP berisi dua implementasi referensi Weaver:

  • Di Android 17 dan yang lebih tinggi, system/weaver/ berisi implementasi Weaver untuk lingkungan aman umum.
  • Di Android 8.1 dan yang lebih tinggi, external/libese/ berisi implementasi Weaver untuk elemen aman yang kompatibel dengan ISO/IEC7816-4.

Pengujian

Untuk memvalidasi penerapan Weaver, gunakan VtsHalWeaverTargetTest:

atest VtsHalWeaverTargetTest

atau:

vts-tradefed run vts -m VtsHalWeaverTargetTest