Çoğu disk ve dosya şifreleme yazılımı gibi, Android'in de depolama alanı şifreleme geleneksel olarak sistem belleğinde bulunan ham şifreleme anahtarlarına dayanır şifrelemenin gerçekleştirilebilmesi gerekir. Şifreleme yapıldığında bile tarafından kullanılabilmesini sağlayan özel bir donanımla, yazılımların şifreleme anahtarlarını yönetmenizi sağlar.
Geleneksel olarak bu durum bir sorun olarak görülmez çünkü anahtarlar hazır olmaz. Bu, saldırıya uğrayan çevrimdışı saldırı türüdür. Bu saldırı türü, korumayı amaçlar. Bununla birlikte, soğuk başlatma gibi diğer saldırı türlerine karşı daha fazla koruma saldırılar ve bir saldırganın sistemi sızdırabileceği online saldırılar ve belleğe öncelik verebilir.
Android 11, bu sorunu çözmek için donanımla sarmalanmış anahtarlar içindir. Donanımla sarmalanmış anahtarlar, yalnızca ham biçimde bilinen depolama anahtarlarıdır. özel donanımlar; yazılım bu anahtarları yalnızca sarmalanmış olarak görür ve bunlarla çalışır (şifrelenmiş) formda olduğundan emin olun. Bu donanım, oluşturma ve içe aktarma kapasitesine sahip olmalıdır depolama anahtarları, depolama anahtarlarını geçici ve uzun süreli formlarda sarmalama, türetme bir alt anahtarı doğrudan satır içi kripto motoruna programlayarak ve ayrı bir alt anahtar döndürerek başlayın.
Not: Satır içi kripto motoru (veya satır içi şifreleme donanımı), verileri şifreleyen/şifrelerini çözen depolama cihazına iletildi. Genellikle bu bir UFS veya eMMC ana makinesidir tarafından tanımlanan şifreleme uzantılarını uygulayan denetleyici JEDEC spesifikasyonu.
Tasarım
Bu bölümde, donanımla sarmalanmış anahtarlar özelliğinin tasarımı (örneğin, ve hangi donanım desteğinin gerekli olduğunu açıklıyor. Bu tartışma dosya tabanlı şifrelemeye (FBE) odaklansa da Google Analytics 4'te, meta veriler şifrelemeyi de unutmayın.
Sistem belleğinde ham şifreleme anahtarlarına ihtiyaç duymamaktan kaçınmanın bir yolu da bunları yalnızca satır içi kripto motorunun anahtar alanlarında tutar. Ancak bu yaklaşımda bazı sorunlarla karşılaşılıyor:
- Şifreleme anahtarlarının sayısı, anahtar yuvası sayısını aşabilir.
- Satır içi kripto motorları yalnızca blokların tam bloklarını şifrelemek/şifresini çözmek için kullanılabilir anlamına gelir. Ancak FBE söz konusu olduğunda, yazılımın yine de şunları yapabilmesi gerekir: dosya adı şifreleme ve anahtar türetme gibi başka kriptografik işler tanımlayıcılar. Yazılımın çalışması için ham FBE anahtarlarına diğer işleri de yapacaksınız.
Bu sorunları önlemek için depolama anahtarları donanım sarmalanmış anahtarlar bir donanımla sınırlıdır. Bu şekilde sınırsız sayıda anahtar desteklenir. İçinde ek olarak, anahtar hiyerarşisi değiştirilmiş ve kısmen bu donanıma taşınmıştır. Bu alt anahtarın, satır içi kripto motoru.
Anahtar hiyerarşisi
Anahtarlar, HKDF gibi bir KDF (anahtar türetme işlevi) kullanılarak diğer anahtarlardan türetilebilir. Bu da bir anahtar hiyerarşisi oluşturur.
Aşağıdaki şemada, FBE için tipik bir anahtar hiyerarşisi gösterilmektedir. donanımla sarmalanmış anahtarlar kullanılmaz:
'nı inceleyin.FBE sınıf anahtarı, Android'in Linux'a ilettiği ham şifreleme anahtarıdır. örneğin, kimlik bilgisi ile şifrelenmiş depolama alanı. (Çekirdekteki bu anahtarına, fscrypt ana anahtarı denir.) Bu anahtardan çekirdek, şu alt anahtarlar:
- Anahtar tanımlayıcı. Bu, şifreleme için kullanılmaz ancak bir değerdir belli bir dosyanın veya dizinin bulunduğu anahtarı tanımlamak için kullanılır. korunuyor.
- Dosya içeriği şifreleme anahtarı
- Dosya adları şifreleme anahtarı
Buna karşılık aşağıdaki şemada FBE'nin anahtar hiyerarşisi gösterilmektedir. donanımla sarmalanmış anahtarlar kullanılır:
'nı inceleyin.Önceki duruma kıyasla anahtara yeni bir seviye eklendi. ve dosya içeriği şifreleme anahtarının yeri değişti. Kök düğüm, bir dizi anahtarın kilidini açmak için Android'in Linux'a geçtiği anahtarı temsil eder. şifrelenmiş dizinler. Ancak şimdi bu anahtar kısa süreli olarak sarmalanmış biçimdedir kullanılması için özel donanıma iletilmesi gerekir. Bu donanım, kısa ömürlü olarak sarmalanmış anahtar alan iki arayüz uygulayın:
inline_encryption_key
ve doğrudan elde etmek için tek bir arayüz bunu satır içi şifreleme motorunun bir anahtar üzerinde programlaması. Bu, ham verilere erişimi olmayan yazılım olmadan şifrelenecek/şifresi çözülecek içerikler tuşuna basın. Android'in ortak çekirdeklerinde bu arayüzblk_crypto_ll_ops::keyslot_program
işlemi, şu olmalıdır: depolama sürücüsü tarafından uygulanır.sw_secret
değerini türetmek ve döndürmek için tek bir arayüz ("yazılım sır" "işlenmemiş sır" olarak da bilinir. yer alır). Bu, bir anketin Linux, dosya içerikleri dışındaki her şey için alt anahtar türetmek için kullanılır bahsedeceğim. Android'in ortak çekirdeklerinde bu arayüzblk_crypto_ll_ops::derive_sw_secret
işlemi, şu olmalıdır: depolama sürücüsü tarafından uygulanır.
Şundan inline_encryption_key
ve sw_secret
türetmek için:
şifreleme anahtarı ise donanımın kriptografik açıdan güçlü bir KDF kullanması gerekir. Bu KDF
Kriptografiyle ilgili en iyi uygulamalara uygun olmalıdır; güvenlik gücü şu kadar olmalıdır:
(yani daha sonra kullanılan algoritmalar için yeterlidir.) Aynı zamanda
farklı etiket, bağlam ve/veya uygulamaya özel bilgi dizesi
sonuç olarak elde edilen alt anahtarları garanti etmek için her bir alt anahtar türünü türetmek
kriptografik olarak izole edilir. Yani, birinin bilinmesi
diğer. Ham depolama anahtarı zaten bir
olması gerekir.
Teknik olarak güvenlik gereksinimlerini karşılayan tüm KDF'ler kullanılabilir.
Ancak test amacıyla aynı KDF'nin
test kodu. Şu anda bir KDF incelenip uygulanmış; bulabilirsiniz
vts_kernel_encryption_test
e-posta adresine ilişkin kaynak kodunda.
Donanımın, PRF olarak NIST SP 800-108 "KDF'yi Sayaç Modunda" ve AES-256-CMAC kullanan bu KDF'yi kullanması önerilir. Uyumlu olmak amacıyla,
KDF bağlamlarının seçimi de dahil olmak üzere algoritmanın bölümleri özdeş olmalıdır.
ve etiketleri kullanabilirsiniz.
Anahtar sarmalama
Donanımla sarmalanmış anahtarların güvenlik hedeflerini karşılamak için iki tür anahtar sarmalama vardır. şu şekilde tanımlanır:
- Geçici sarmalama: Donanım, ham anahtarı bir anahtar kullanarak şifreler her başlatma sırasında rastgele oluşturulur ve doğrudan kullanıma sunulmaz. dış mekana uyum sağlar.
- Uzun süreli sarmalama: Donanım, ham anahtarı bir yerleşik olarak bulunan benzersiz, kalıcı bir anahtar, tespit edebilirsiniz.
Depolama alanının kilidini açmak için Linux çekirdeğine iletilen tüm anahtarlar kısa süreli olarak sarmalanmış. Bu sayede, saldırgan bir dosyanın içeriğini anahtar sistem belleğinde bulunan kullanım dışı bir anahtarla cihaz dışında ancak yeniden başlatma sonrasında da cihaz üzerinde.
Aynı zamanda, Android'in şifrelenmiş sürümleri de depolayabilmesi gerekir. öncelikle kilitlerini açmaları için diskteki tuşlara basın. Ham anahtarları bu amaçla kullanılabilir. Bununla birlikte, doğal oluşumların hiçbir zaman çıkarılamaması için sistem belleğinde hiçbir zaman bulunmamalıdır. cihaz dışında kullanılmasına (önyükleme sırasında çıkartılsa bile) izin verir. Bu nedenle, sarmalamanın tanımıdır.
Bu iki farklı şekilde sarmalanmış anahtarların yönetilmesini desteklemek için donanım, aşağıdaki arayüzleri uygulayın:
- Depolama anahtarlarını oluşturmak ve içe aktarmak için kullanılan arayüzler ve bunları
uzun süreli sarmalanmış halidir. Bu arayüzlere, uygulamadaki
KeyMint'tır ve
TAG_STORAGE_KEY
KeyMint etiketine karşılık gelir. "Oluşturma" özelliğivold
tarafından yeni depolama alanı oluşturmak için kullanılır anahtarlarının dışında "içe aktarma" ile özelliği kullanan Test anahtarlarını içe aktarmak içinvts_kernel_encryption_test
tuşlarına basın. - Uzun süreli sarmalanmış depolama anahtarını
bir depolama anahtarı olabilir. Bu,
convertStorageKeyToEphemeral
KeyMint yöntemi. Bu yöntem kullanılır sırasıylavold
vevts_kernel_encryption_test
bazında depolama alanının kilidini açın.
Anahtar sarmalama algoritması bir uygulama ayrıntısı olsa da güçlü AEAD (örneğin, rastgele IV'lerle AES-256-GCM).
Yazılım değişiklikleri gerekiyor
AOSP, donanımla sarmalanmış anahtarları desteklemek için halihazırda temel bir çerçeveye sahiptir. Bu
vold
gibi kullanıcı alanı bileşenlerinde de destek içerir.
Linux çekirdeğinin blk-crypto, fscrypto ve
dm-default-key olarak ayarlayın.
Ancak uygulamaya özel bazı değişiklikler yapılması gerekiyor.
KeyMint değişiklikleri
Cihazın KeyMint uygulaması,
TAG_STORAGE_KEY
ve
convertStorageKeyToEphemeral
yöntemini çağırın.
Keymaster'da şunun yerine exportKey
kullanıldı:
convertStorageKeyToEphemeral
.
Linux çekirdek değişiklikleri
Cihazın satır içi şifreleme motoru için Linux çekirdek sürücüsü değiştirilmelidir ve donanımla sarmalanmış anahtarları destekler.
android14
ve daha yüksek çekirdekler için
BLK_CRYPTO_KEY_TYPE_HW_WRAPPED
ayarla
blk_crypto_profile::key_types_supported
içinde,
blk_crypto_ll_ops::keyslot_program
yapın
ve blk_crypto_ll_ops::keyslot_evict
donanımla sarmalanmış anahtarları programlamayı/çıkarmayı destekler,
ve blk_crypto_ll_ops::derive_sw_secret
uygulayın.
android12
ve android13
çekirdekleri için
BLK_CRYPTO_FEATURE_WRAPPED_KEYS
ayarla
blk_keyslot_manager::features
içinde
yap: blk_ksm_ll_ops::keyslot_program
ve blk_ksm_ll_ops::keyslot_evict
donanımla sarmalanmış anahtarları programlamayı/çıkarmayı destekler,
ve blk_ksm_ll_ops::derive_raw_secret
uygulayın.
android11
çekirdek için
BLK_CRYPTO_FEATURE_WRAPPED_KEYS
ayarla
keyslot_manager::features
içinde,
keyslot_mgmt_ll_ops::keyslot_program
yapın
ve keyslot_mgmt_ll_ops::keyslot_evict
donanımla sarmalanmış anahtarları programlamayı/çıkarmayı destekler,
ve keyslot_mgmt_ll_ops::derive_raw_secret
uygulayın.
Test
Donanımla sarmalanmış anahtarlarla şifrelemeyi test etmek, şifrelemeden daha zor olsa da
yine de bir test anahtarını içe aktarıp ve ardından doğrudan
donanımın yaptığı anahtar türevini yeniden
uygulayabilirsiniz. Uygulandı
vts_kernel_encryption_test
içinde. Bu testi çalıştırmak için
çalıştır:
atest -v vts_kernel_encryption_test
Test günlüğünü okuyun ve donanımla sarmalanmış anahtar test durumlarının (ör.
FBEPolicyTest.TestAesInlineCryptOptimizedHwWrappedKeyPolicy
ve
DmDefaultKeyTest.TestHwWrappedKey
), destek nedeniyle atlanmadı
test sonuçları yine de gösterileceğinden, donanımla sarmalanmış anahtarların algılanmaması için
"geçti" bu durumda iletişim kurabilirsiniz.
Etkinleştiriliyor
Cihazın donanımla sarmalanmış anahtar desteği düzgün çalışmaya başladıktan sonra şunları yapabilirsiniz:
cihazın fstab
dosyasında aşağıdaki değişiklikleri yapın:
Android, bunu FBE ve meta veri şifreleme için kullanır:
- FBE:
wrappedkey_v0
işaretinifileencryption
parametresinden yararlanın. Örneğin, şunu kullanın:fileencryption=::inlinecrypt_optimized+wrappedkey_v0
Örneğin, Daha fazla bilgi için FBE'ye göz atın dokümanlarına göz atın. - Meta veri şifreleme:
wrappedkey_v0
işaretinimetadata_encryption
parametresinden yararlanın. Örneğin, şunu kullanın:metadata_encryption=:wrappedkey_v0
Daha fazla bilgi için meta veriler şifreleme belgelerine bakın.