Donanım Sarılmış Anahtarlar

Çoğu disk ve dosya şifreleme yazılımı gibi, Android'in depolama şifrelemesi de geleneksel olarak şifrelemenin gerçekleştirilebilmesi için sistem belleğinde bulunan ham şifreleme anahtarlarına dayanır. Şifreleme, yazılım yerine özel donanım tarafından gerçekleştirilse bile, yazılımın genellikle ham şifreleme anahtarlarını yönetmesi gerekir.

Bu geleneksel olarak bir sorun olarak görülmez çünkü anahtarlar, depolama şifrelemesinin korumayı amaçladığı ana saldırı türü olan çevrimdışı bir saldırı sırasında mevcut olmayacaktır. Ancak, örneğin saldırılara diğer türleri, karşı yüksek düzeyde koruma sağlamak için bir istek vardır soğuk önyükleme saldırıları bir saldırganın tamamen cihazı ödün vermeden sistem belleğini sızıntı mümkün olabilir ve çevrimiçi saldırıları.

Bu sorunu çözmek için, Android 11 donanım desteği mevcut olduğu donanım sarılmış tuşları için destek tanıttı. Donanımla sarılmış anahtarlar, yalnızca özel donanıma ham biçimde bilinen depolama anahtarlarıdır; yazılım bu anahtarları yalnızca sarmalanmış (şifreli) biçimde görür ve bunlarla çalışır. Bu donanım, depolama anahtarları oluşturma ve içe aktarma, depolama anahtarlarını geçici ve uzun vadeli biçimlerde sarma, alt anahtarlar türetme, bir alt anahtarı doğrudan bir satır içi şifreleme motoruna programlama ve yazılıma ayrı bir alt anahtar döndürme yeteneğine sahip olmalıdır.

Not: Bir satır içi Şifreleme motoru (ya da içi şifreleme donanım) depolama cihazından / 'yolunda iken şifreler / verilerin şifresini çözer bu donanımı belirtmektedir. Genellikle bu, ilgili JEDEC spesifikasyonu tarafından tanımlanan kripto uzantılarını uygulayan bir UFS veya eMMC ana bilgisayar denetleyicisidir.

Tasarım

Bu bölüm, donanımla sarılmış anahtarlar özelliğinin tasarımını, bunun için hangi donanım desteğinin gerekli olduğu da dahil olmak üzere sunar. Bu tartışma odaklanır dosya tabanlı şifreleme (FBE), ama çözüm için geçerlidir meta şifreleme de.

Sistem belleğinde ham şifreleme anahtarlarına ihtiyaç duymayı önlemenin bir yolu, onları yalnızca bir satır içi şifreleme motorunun anahtar yuvalarında tutmaktır. Ancak, bu yaklaşım bazı sorunlarla karşılaşmaktadır:

  • Şifreleme anahtarlarının sayısı, anahtar yuvalarının sayısını aşabilir.
  • Satır içi şifreleme motorları yalnızca disk üzerindeki tüm veri bloklarını şifrelemek/şifresini çözmek için kullanılabilir. Bununla birlikte, FBE durumunda, yazılımın dosya adlarını şifreleme ve anahtar tanımlayıcıları türetme gibi diğer kriptografik işleri yapabilmesi gerekir. Bu diğer işi yapmak için yazılımın yine de ham FBE anahtarlarına erişmesi gerekir.

Bu sorunları önlemek için, depolama tuşları yerine sadece dilimlere ayrılmış donanım tarafından kullanılabilecek donanım sarılmış tuşları, içine yapılır. Bu, sınırsız sayıda anahtarın desteklenmesine izin verir. Ek olarak, anahtar hiyerarşisi değiştirilir ve kısmen bu donanıma taşınır; bu, bir satır içi şifreleme motoru kullanamayan görevler için bir alt anahtarın yazılıma döndürülmesine olanak tanır.

Anahtar hiyerarşi

Anahtarlar kullanan diğer şifreler türetilebilir KDF (anahtar elde etme fonksiyonunu) gibi HKDF önemli bir hiyerarşi sonuçlanan.

Donanım sarılmış anahtarlar kullanılmamaktadır aşağıdaki diyagram FBE için tipik bir anahtar hiyerarşi göstermektedir:

FBE anahtar hiyerarşisi (standart)
Şekil 1. FBE anahtar hiyerarşi (standart)

FBE sınıf anahtarı, belirli bir Android kullanıcısı için kimlik bilgileriyle şifrelenmiş depolama gibi belirli bir dizi şifreli dizinin kilidini açmak için Android'in Linux çekirdeğine ilettiği ham şifreleme anahtarıdır. (Çekirdek olarak, bu anahtar, bir fscrypt ana anahtarı denir.) Bu anahtar kaynaktan, çekirdek aşağıdaki alt elde:

  • Anahtar tanımlayıcı. Bu, şifreleme için kullanılmaz, bunun yerine belirli bir dosya veya dizinin korunduğu anahtarı tanımlamak için kullanılan bir değerdir.
  • Dosya içeriği şifreleme anahtarı
  • Dosya adları şifreleme anahtarı

Buna karşılık, aşağıdaki şema, donanım sarılı anahtarlar kullanıldığında FBE için anahtar hiyerarşisini gösterir:

FBE anahtar hiyerarşisi (donanım sarılı anahtarla)
(Donanım sarılmış anahtar ile) Şekil 2. FBE anahtar hiyerarşisi

Önceki duruma kıyasla, anahtar hiyerarşisine ek bir düzey eklendi ve dosya içeriği şifreleme anahtarının yeri değiştirildi. Kök düğüm hala Android'in bir dizi şifreli dizinin kilidini açmak için Linux'a ilettiği anahtarı temsil ediyor. Ancak, şimdi bu anahtar geçici olarak sarılmış biçimde ve kullanılabilmesi için özel donanıma iletilmesi gerekiyor. Bu donanım, kısa ömürlü bir anahtar alan iki arabirim uygulamalıdır:

  • Bir türetmek için arayüz inline_encryption_key ve doğrudan sıralı kripto motorun bir keyslot içine programlamak. Bu, ham anahtara erişimi olan yazılım olmadan dosya içeriğinin şifrelenmesine/şifresinin çözülmesine izin verir. Android ortak tanelerin olarak, bu arayüz karşılık blk_ksm_ll_ops::keyslot_program depolama sürücüsü tarafından uygulanması gereken işlem.
  • Derived ve dönüş için bir arayüz sw_secret Linux dosya içeriğini şifreleme dışındaki her şey için alt anahtarlarını türetmek için kullandığı bir anahtardır - (aynı zamanda bazı yerlerde "ham sır" olarak adlandırılan "yazılım sır"). Android ortak tanelerin olarak, bu arayüz karşılık blk_ksm_ll_ops::derive_raw_secret depolama sürücüsü tarafından uygulanması gereken işlem.

Türetmek için inline_encryption_key ve sw_secret ham depolama anahtarından, donanım şifreleme açısından güçlü KDF kullanmalıdır. Bu KDF, kriptografi en iyi uygulamalarını izlemelidir; en az 256 bitlik bir güvenlik gücüne sahip olmalıdır, yani daha sonra kullanılacak herhangi bir algoritma için yeterli olmalıdır. Ayrıca, sonuçta ortaya çıkan alt anahtarların kriptografik olarak izole edilmesini garanti etmek için her bir alt anahtar türünü türetirken ayrı bir etiket, bağlam ve/veya uygulamaya özel bilgi dizisi kullanmalıdır, yani bunlardan birinin bilgisi diğerini ortaya çıkarmaz. Ham depolama anahtarı zaten tek tip rastgele bir anahtar olduğundan, anahtar genişletme gerekli değildir.

Teknik olarak, güvenlik gereksinimlerini karşılayan herhangi bir KDF kullanılabilir. Ancak test amacıyla aynı KDF'yi test kodunda yeniden uygulamak gerekir. Şu anda bir KDF gözden geçirildi ve uygulandı; bunun bulunabilir için kaynak kodu vts_kernel_encryption_test . Vananın hatta donanım kullanımı kullanan bu KDF, "Sayaç Modunda KDF" NIST SP 800-108 ile AES-256-cmac PRF olarak. Uyumlu olması için, her bir alt anahtar için KDF bağlamları ve etiketleri de dahil olmak üzere, algoritmanın tüm bölümlerinin aynı olması gerektiğini unutmayın.

Anahtar sarma

Donanımla sarılmış anahtarların güvenlik hedeflerini karşılamak için iki tür anahtar sarma tanımlanmıştır:

  • Geçici sarma: donanımı içerisinde, rastlantısal her yeniden oluşturulur ve doğrudan doğruya donanımı dışında maruz kalmayan bir anahtar kullanarak ham anahtarını şifreler.
  • Uzun vadeli sarma: donanım doğrudan donanım dışında maruz kalmaz donanımda yerleşiktir benzersiz, kalıcı tuşunu kullanarak ham anahtar şifreler.

Depolamanın kilidini açmak için Linux çekirdeğine iletilen tüm anahtarlar geçici olarak sarılır. Bu, bir saldırganın kullanımdaki bir anahtarı sistem belleğinden çıkarabilmesi durumunda, bu anahtarın yalnızca cihaz dışında değil, aynı zamanda yeniden başlatma sonrasında cihazda da kullanılamayacağını garanti eder.

Aynı zamanda, ilk etapta kilitlerinin açılabilmesi için Android'in yine de anahtarların şifreli bir sürümünü diskte saklayabilmesi gerekiyor. Ham anahtarlar bu amaç için çalışır. Ancak, önyükleme sırasında çıkarılsalar bile, aygıt dışında kullanılmak üzere hiçbir zaman ayıklanamamaları için ham anahtarların sistem belleğinde hiçbir zaman bulunmaması arzu edilir. Bu nedenle uzun süreli sarma kavramı tanımlanmıştır.

Bu iki farklı yolla sarılmış anahtarları yönetmeyi desteklemek için donanımın aşağıdaki arabirimleri uygulaması gerekir:

  • Depolama anahtarlarını oluşturmak ve içe aktarmak için arabirimler, bunları uzun vadeli sarmalanmış biçimde döndürür. Bu arayüzler KeyMint aracılığıyla dolaylı olarak erişilir ve karşılık geldikleri TAG_STORAGE_KEY KeyMint etiketi. "Üretmek" yeteneği tarafından kullanılan vold "ithal" yetenek tarafından kullanılır ise, Android tarafından kullanılmak üzere yeni depolama anahtarları oluşturmak için vts_kernel_encryption_test ithalat testi tuşlarına.
  • Uzun vadeli sarılmış bir depolama anahtarını geçici olarak sarılmış bir depolama anahtarına dönüştürmek için bir arabirim. Bu tekabül convertStorageKeyToEphemeral KeyMint yöntemi. Bu yöntem, her iki tarafından kullanılan vold ve vts_kernel_encryption_test depolama açmak üzere.

Anahtar sarma algoritması bir uygulama detayıdır, ancak rastgele IV'lere sahip AES-256-GCM gibi güçlü bir AEAD kullanmalıdır.

Yazılım değişiklikleri gerekli

AOSP, donanımla sarılmış anahtarları desteklemek için zaten temel bir çerçeveye sahiptir. Bu gibi userspace bileşenlerindeki destek içerir vold yanı sıra blk-kripto, fscrypt ve dm-default-anahtarında Linux çekirdek desteği.

Ancak, uygulamaya özel bazı değişiklikler gereklidir.

KeyMint değişiklikleri

Cihazın KeyMint uygulama desteği şekilde değiştirilmesi gerekir TAG_STORAGE_KEY ve uygulamak convertStorageKeyToEphemeral yöntemi.

Anahtar Sorumlusu olarak, exportKey yerine kullanılmıştır convertStorageKeyToEphemeral .

Linux çekirdeği değişiklikleri

Cihazın inline şifreleme motoru için Linux çekirdek sürücüsü seti şekilde değiştirilmesi gerekir BLK_CRYPTO_FEATURE_WRAPPED_KEYS yapmak, keyslot_program() ve keyslot_evict() işlemleri donanım sarılı anahtarlarını kovması / programlama desteği ve uygulamak derive_raw_secret() işlemi.

Test yapmak

Donanımla sarılmış anahtarlarla şifrelemeyi test etmek, standart anahtarlarla şifrelemeyi test etmekten daha zor olsa da, bir test anahtarını içe aktararak ve donanımın yaptığı anahtar türetmesini yeniden uygulayarak test etmek yine de mümkündür. Bu uygulanan vts_kernel_encryption_test . Bu testi çalıştırmak için şunu çalıştırın:

atest -v vts_kernel_encryption_test

Test günlüğünü okuyun ve donanım sarılmış anahtar test durumları (örn doğrulamak FBEPolicyTest.TestAesInlineCryptOptimizedHwWrappedKeyPolicy ve DmDefaultKeyTest.TestHwWrappedKey test sonuçları hala "geçti" olacak şekilde) değil, algılanan donanım sarılmış anahtarlar için desteklemeye nedeniyle atlanan değildi O vaka.

etkinleştirme

Cihazın donanımı sarılmış anahtar destek düzgün çalıştığını sonra, cihazın aşağıdaki değişiklikleri yapabilirsiniz fstab FBE ve meta veri şifreleme için Android kullanmak bunu yapmak için dosyanın:

  • FBE: eklemek wrappedkey_v0 bayrağı fileencryption parametresi. Örneğin kullanılacak fileencryption=::inlinecrypt_optimized+wrappedkey_v0 . Daha fazla ayrıntı için bkz FBE belgelerine .
  • Meta Veri şifreleme: eklemek wrappedkey_v0 bayrağı metadata_encryption parametresi. Örnek olarak, metadata_encryption=:wrappedkey_v0 . Daha fazla ayrıntı için bkz meta veri şifreleme belgelerine .