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
weaverKeyyang 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():
- Verifikasi: Memeriksa LSKF, dengan pembatasan frekuensi yang diterapkan TEE.
- Pengesahan: Menerbitkan
HardwareAuthTokenuntuk 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