Hardware Abstraction Layer (HAL) Weaver
(IWeaver.aidl),
yang diperkenalkan di Android 8.1, menyediakan antarmuka yang aman untuk autentikasi pengguna
dengan Lock Screen Knowledge Factor (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 khusus yang aman yang mendukung autentikasi pengguna yang aman. Mengimplementasikan HAL Weaver menggunakan hardware aman ini memenuhi persyaratan "autentikasi pengguna yang aman".
Di perangkat tanpa Secure Element (SE) khusus, Weaver masih dapat diimplementasikan di Trusted Execution Environment (TEE) seperti Trusty.
Di Android 17 dan yang lebih tinggi, mengimplementasikan Weaver sangat direkomendasikan meskipun pada perangkat tanpa elemen pengaman khusus.
Komponen
Weaver terdiri dari tiga komponen:
- Antarmuka AIDL Weaver (
IWeaver): Spesifikasi formal HAL. Android 13 dan yang lebih rendah menggunakan HIDL bukan AIDL. - Layanan Hardware Abstraction Layer (HAL) Weaver:
Proses Android khusus vendor yang mengimplementasikan
IWeaverantarmuka. - Aplikasi Tepercaya (TA) Weaver: Logika inti yang berjalan di lingkungan yang aman. Aplikasi ini melakukan verifikasi LSKF dan menerapkan pembatasan frekuensi. Layanan HAL berkomunikasi dengan TA menggunakan saluran aman khusus implementasi.
Antarmuka
Antarmuka Weaver menampilkan array slot persisten berukuran tetap, yang masing-masing berisi kunci berukuran tetap dan nilai berukuran tetap. Setiap slot diidentifikasi berdasarkan ID-nya, 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. Tindakan ini hanya berhasil jika waktu tunggu pembatasan frekuensi (diberlakukan oleh TA) tidak aktif dan kunci yang diberikan cocok dengan kunci yang disimpan.warmUp(): Di Android 17 dan yang lebih tinggi, menyampaikan petunjuk bahwa pembacaan atau penulisan mungkin akan segera terjadi.
Untuk spesifikasi antarmuka lengkap, lihat
IWeaver.aidl.
Penggunaan oleh Android
Jika implementasi Weaver tersedia, LockSettingsService di server sistem Android akan 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 berentropi tinggi yang dibuat secara acak.
weaverSecret dirancang untuk hanya dapat diambil oleh:
- Memberikan
weaverKeyyang benar ke TA Weaver dalam kebijakan pembatasan frekuensinya. - Mengkompromikan lingkungan aman tempat TA Weaver berjalan. Hal ini dimaksudkan agar sangat sulit dilakukan.
LockSettingsService menggunakan weaverKey dan weaverSecret untuk mengenkripsi sandi sintetis pengguna. Karena
sandi sintetis melindungi penyimpanan Credential-Encrypted (CE) pengguna untuk
File-Based Encryption (FBE)
dan
kunci yang terikat autentikasi pengguna di Android Keystore,
data tetap tidak dapat diakses hingga Weaver merilis rahasia.
Di Android 17 dan yang lebih tinggi, LockSettingsService memanggil metode warmUp() Weaver saat LSKF mulai dimasukkan. Implementasi Weaver dapat menggunakan sinyal ini untuk mengalihkan hardware aman dari status daya rendah guna mengurangi latensi untuk permintaan read() yang akan datang.
Weaver versus Gatekeeper
Secara historis, HAL Gatekeeper
menjalankan dua peran berbeda dalam satu panggilan verify():
- Verifikasi: Memeriksa LSKF, dengan pembatasan frekuensi yang diterapkan TEE.
- Attestation: Mengeluarkan
HardwareAuthTokenuntuk memberi tahu KeyMint (sebelumnya Keymaster) bahwa autentikasi LSKF berhasil.
Mengapa beralih ke Weaver?
Dengan diperkenalkannya token reset kode sandi yang
aman
di Android 8.1, sandi sintetis menjadi rahasia kriptografi
utama. Dua peran yang dijelaskan di atas ditangani oleh
pendaftaran Gatekeeper terpisah, satu untuk LSKF di bawah userId + 100000
dan satu untuk sandi sintetis di bawah userId.
Weaver diperkenalkan untuk mengambil alih peran pertama, menggunakan antarmuka HAL yang lebih sederhana dengan dukungan untuk implementasi berbasis Secure Element (SE).
| Fitur | Weaver | Gatekeeper |
|---|---|---|
| Penghapusan aman | Penghapusan aman diperlukan, dan mudah untuk mengimplementasikannya karena the antarmuka menggunakan jumlah slot berukuran tetap. | Penghapusan aman tidak diperlukan, dan sulit untuk mengimplementasikannya karena antarmuka mendukung jumlah pendaftaran yang tidak terbatas. |
| Hardware | Dioptimalkan untuk SE, tetapi juga berfungsi di TEE. | Hanya TEE secara efektif. Mengimplementasikannya di SE tidak memberikan manfaat keamanan dengan desain saat ini. |
| Penanganan error | Kode error yang lebih jelas. | Kode error yang ambigu. Akibatnya, layar kunci tidak membedakan antara LSKF yang salah dan kegagalan yang tidak terkait. |
| Atomitas | 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 implementasi Weaver, gunakan
VtsHalWeaverTargetTest:
atest VtsHalWeaverTargetTest
atau:
vts-tradefed run vts -m VtsHalWeaverTargetTest