Android 8.1'de kullanıma sunulan Weaver Donanım Soyutlama Katmanı (HAL)
(IWeaver.aidl),
PIN, desen ve şifre gibi kilit ekranı bilgi faktörü (LSKF) ile kullanıcı kimlik doğrulaması için güvenli bir arayüz sağlar.
Weaver, Gatekeeper'ın LSKF doğrulama işlevinin yerini alır. Ancak Gatekeeper, donanım kimlik doğrulama jetonları oluşturmak için hâlâ kullanılmaktadır.
Android 9 ve sonraki sürümlerde, CDD 9.11.2 StrongBox'ı destekleyen cihazların, güvenli kullanıcı kimlik doğrulamasını destekleyen özel bir güvenli donanım sağlamasını zorunlu kılar. Bu güvenli donanım kullanılarak Weaver HAL'nin uygulanması, "güvenli kullanıcı kimlik doğrulaması" şartını karşılar.
Özel bir güvenli öğe (SE) bulunmayan cihazlarda Weaver, Trusty gibi bir güvenilir yürütme ortamında (TEE) uygulanmaya devam edebilir.
Android 17 ve sonraki sürümlerde, özel güvenlik unsuru olmayan cihazlarda bile Weaver'ın uygulanması önemle tavsiye edilir.
Bileşenler
Weaver üç bileşenden oluşur:
- Weaver AIDL arayüzü (
IWeaver): HAL'nin resmi spesifikasyonu. Android 13 ve önceki sürümlerde AIDL yerine HIDL kullanılıyordu. - Weaver Donanım Soyutlama Katmanı (HAL) hizmeti:
IWeaverarayüzünü uygulayan, satıcıya özel bir Android süreci. - Weaver Güvenilir Uygulaması (TA): Güvenli bir ortamda çalışan temel mantık. LSKF doğrulaması yapar ve sıklık sınırlaması uygular. HAL hizmeti, TA ile uygulamaya özel güvenli bir kanal kullanarak iletişim kurar.
Arayüz
Weaver'ın arayüzünde, her biri sabit boyutlu bir anahtar ve sabit boyutlu bir değer içeren sabit boyutlu bir dizi kalıcı yuva bulunur. Her yuva, kimliğiyle tanımlanır. Kimlik, [0, numSlots - 1] aralığında bir tam sayıdır. Bir yuvanın değeri yalnızca depolanan anahtarla eşleşen bir anahtar sağlandığında erişilebilir.
Weaver'ın arayüzü temel olarak şunlardan oluşur:
getConfig(): Uygulama tarafından desteklenen alan sayısını, anahtar boyutunu ve değer boyutunu alır.write(): Belirtilen alanı yeni bir anahtar/değer çiftiyle üzerine yazar. Bu işlem atomik olduğundan önceki veriler kalıcı olarak kurtarılamaz (güvenli silme).read(): Belirtilen yuvanın değerini almaya çalışır. Bu işlem yalnızca hız sınırlama zaman aşımı (TA tarafından uygulanır) etkin olmadığında ve sağlanan anahtar, depolanan anahtarla tam olarak eşleştiğinde başarılı olur.warmUp(): Android 17 ve sonraki sürümlerde, yakında okuma veya yazma işleminin gerçekleşebileceğine dair bir ipucu verir.
Arayüz spesifikasyonunun tamamı için IWeaver.aidl bölümüne bakın.
Android tarafından kullanım
Weaver uygulaması kullanıma sunulduğunda Android sistem sunucusundaki LockSettingsService, kullanıcı verilerini korumak için bu uygulamayı kullanır. Cihazdaki her kullanıcı için LockSettingsService, bir Weaver yuvasını yönetir:
- Yuva anahtarı (
weaverKey): Kullanıcının LSKF'sinin karması. Kullanıcının ekran kilidi yoksa varsayılan bir dize kullanılır. - Yuva değeri (
weaverSecret): Yüksek entropili, rastgele oluşturulmuş kriptografik bir gizli anahtardır.
weaverSecret yalnızca şu yöntemlerden biriyle alınacak şekilde tasarlanmıştır:
- Weaver TA'ya, sıklık sınırlama politikası kapsamında doğru
weaverKey'yı sağlama. - Weaver TA'nın çalıştığı güvenli ortamın güvenliğini ihlal etmek. Bu işlem çok zor olacak şekilde tasarlanmıştır.
LockSettingsService, kullanıcının yapay şifresini şifrelemek için hem weaverKey hem de weaverSecret kullanır. Çünkü
Sentetik Şifre, kullanıcının dosya tabanlı şifreleme (FBE) için kimlik bilgileriyle şifrelenmiş (CE) depolama alanını ve kullanıcının Android anahtar deposundaki kimlik doğrulama ile ilişkili anahtarlarını korur.
Weaver, sırrı yayınlayana kadar verilere erişilemez.
Android 17 ve sonraki sürümlerde, LSKF girilmeye başlandığında LockSettingsService, Weaver'ın warmUp() yöntemini çağırır. Weaver uygulamaları, yaklaşan bir read() isteğinin gecikmesini azaltmak için güvenli donanımı düşük güç durumundan çıkarmak üzere bu sinyali kullanabilir.
Weaver - Gatekeeper
Geçmişte Gatekeeper HAL, tek bir verify() çağrısında iki farklı rolü yerine getiriyordu:
- Doğrulama: LSKF'nin TEE ile zorunlu kılınan sıklık sınırlamasıyla kontrol edilmesi.
- Onay: LSKF kimlik doğrulamasının başarılı olduğunu KeyMint'e
(eski adıyla Keymaster) bildirmek için
HardwareAuthTokenyayınlama.
Neden Weaver'a geçildi?
Android 8.1'de güvenli geçiş kodu sıfırlama jetonlarının kullanıma sunulmasıyla birlikte "Sentezlenmiş Şifre" birincil şifreleme sırrı haline geldi. Yukarıda açıklanan iki rol artık ayrı Gatekeeper kayıtlarıyla yönetiliyor. Bunlardan biri userId + 100000 altındaki LSKF, diğeri ise userId altındaki yapay şifre için geçerli.
Weaver, Secure Element (SE) tabanlı uygulamaları destekleyen daha basit bir HAL arayüzü kullanarak ilk rolü devralmak için tanıtıldı.
| Özellik | Dokumacı | Sistemik rolü olan büyük online platform |
|---|---|---|
| Güvenli Silme | Güvenli silme işlemi gereklidir ve arayüzde sabit sayıda sabit boyutlu yuva kullanıldığından bu işlem kolayca uygulanabilir. | Güvenli silme işlemi gerekli değildir ve arayüz sınırsız sayıda kayıt desteklediğinden uygulanması zordur. |
| Donanım | SE'ler için optimize edilmiştir ancak TEE'lerde de çalışır. | Etkili bir şekilde yalnızca TEE. Mevcut tasarımda, SE'de uygulanması güvenlik avantajı sağlamaz. |
| Hata İşleme | Daha net hata kodları | Belirsiz hata kodları. Sonuç olarak, kilit ekranı yanlış LSKF'ler ile alakasız hatalar arasında ayrım yapmaz. |
| Atomicity | Weaver'ı kullanan LockSettingsService içindeki kod, LSKF değişikliklerini atomik olarak gerçekleştirir. Yeni veriler yeni bir Weaver yuvasına yazılır ve eski yuva yalnızca güvenli olduğunda silinir. |
Gatekeeper'ı kullanan LockSettingsService içindeki kod, LSKF değişikliklerini atomik olarak gerçekleştirmiyor. LSKF değiştirilirken bir sorun yaşanırsa tüm kullanıcı verileri kaybolabilir. |
Referans kodu
AOSP, Weaver'ın iki referans uygulamasını içerir:
-
Android 17 ve sonraki sürümlerde,
system/weaver/genel güvenli ortamlar için bir Weaver uygulaması içerir. -
Android 8.1 ve sonraki sürümlerde,
external/libese/ISO/IEC7816-4 uyumlu güvenli öğeler için bir Weaver uygulaması içerir.
Test
Bir Weaver uygulamasını doğrulamak için VtsHalWeaverTargetTest kullanın:
atest VtsHalWeaverTargetTest
veya:
vts-tradefed run vts -m VtsHalWeaverTargetTest