Donanımla Sarmalanmış Anahtarlar

Ç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:

FBE anahtar hiyerarşisi (standart)
Şekil 1. FBE anahtar hiyerarşisi (standart)
ziyaret edin.
'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:

FBE anahtar hiyerarşisi (donanımla sarmalanmış anahtarla)
Şekil 2. FBE anahtar hiyerarşisi (donanımla sarmalanmış anahtarla)
ziyaret edin.
'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üz blk_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üz blk_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ği vold 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çin vts_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ıyla vold ve vts_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şaretini fileencryption 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şaretini metadata_encryption parametresinden yararlanın. Örneğin, şunu kullanın: metadata_encryption=:wrappedkey_v0 Daha fazla bilgi için meta veriler şifreleme belgelerine bakın.