Meta Veri Şifreleme

Android 7.0 ve üstü, dosya tabanlı şifrelemeyi (FBE) destekler. FBE, farklı dosyaların, bağımsız olarak açılabilen farklı anahtarlarla şifrelenmesine izin verir. Bu anahtarlar hem dosya içeriğini hem de dosya adlarını şifrelemek için kullanılır. FBE kullanıldığında, dizin düzenleri, dosya boyutları, izinler ve oluşturma / değiştirme süreleri gibi diğer bilgiler şifrelenmez. Toplu olarak, bu diğer bilgiler dosya sistemi meta verileri olarak bilinir.

Android 9, meta veri şifreleme için destek sağlamıştır. Metadata şifreleme ile, önyükleme sırasında mevcut olan tek bir anahtar, FBE tarafından şifrelenmeyen içeriği şifreler. Bu anahtar, daha sonra doğrulanmış önyükleme ile korunan Keymaster tarafından korunur.

FBE her etkinleştirildiğinde, meta veri şifreleme her zaman benimsenebilir depolamada etkinleştirilir. Üst veri şifreleme, dahili depolamada da etkinleştirilebilir.

Dahili depolamada uygulama

Meta metadata dosya sistemini kurarak, başlatma sırasını değiştirerek ve cihazın fstab dosyasında meta veri şifrelemesini etkinleştirerek yeni cihazların dahili depolamasında meta veri şifrelemesini kurabilirsiniz.

Önkoşullar

Meta veri şifreleme yalnızca veri bölümü ilk biçimlendirildiğinde ayarlanabilir. Sonuç olarak, bu özellik yalnızca yeni cihazlar içindir; bu bir OTA'nın değiştirmesi gereken bir şey değil.

Meta veri şifreleme, dm-default-key modülünün çekirdeğinizde etkinleştirilmesini gerektirir. Android 11 ve sonraki sürümlerde, dm-default-key , Android ortak çekirdekler, sürüm 4.14 ve üstü tarafından desteklenir. dm-default-key bu sürümü, blk-crypto adlı bir donanım ve satıcıdan bağımsız şifreleme çerçevesi kullanır.

dm-default-key etkinleştirmek için şunu kullanın:

CONFIG_BLK_INLINE_ENCRYPTION=y
CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
CONFIG_DM_DEFAULT_KEY=y

dm-default-key , mevcut olduğunda satır içi şifreleme donanımını (veri depolama cihazına giderken / cihazdan yoldayken şifreleyen / şifresini çözen donanım) kullanır. Satır içi şifreleme donanım kullanarak olmayacak, çekirdeğin şifreleme API bir dönüşü etkinleştirmek için de gereklidir:

CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y

Satır içi şifreleme donanımını kullanmadığınızda, FBE belgelerinde önerildiği gibi mevcut herhangi bir CPU tabanlı hızlandırmayı da etkinleştirmelisiniz.

Android 10 ve önceki sürümlerde, dm-default-key Android ortak çekirdeği tarafından desteklenmiyordu. Bu nedenle, dm-default-key uygulamak satıcılara kalmıştır.

Meta veri dosya sistemini kurun

Kullanıcı verileri bölümündeki hiçbir şey, meta veri şifreleme anahtarı mevcut olana kadar okunamayacağından, bölüm tablosu, bu anahtarı koruyan keymaster blob'larını depolamak için "meta veri bölümü" adı verilen ayrı bir bölüm ayırmalıdır. Meta veri bölümü 16 MB olmalıdır.

fstab.hardware bu bölümdeki hayatını adresinden montaj Meta veri dosya sistemi için bir girdi içermelidir /metadata de dahil olmak üzere, formattable açılışta biçimlendirilir sağlamak için bayrak. F2fs dosya sistemi daha küçük bölümlerde çalışmaz; bunun yerine ext4 kullanmanızı öneririz. Örneğin:

/dev/block/bootdevice/by-name/metadata              /metadata          ext4        noatime,nosuid,nodev,discard                          wait,check,formattable

/metadata bağlama noktasının var olduğundan emin olmak için BoardConfig-common.mk aşağıdaki satırı ekleyin:

BOARD_USES_METADATA_PARTITION := true

Başlatma sırasındaki değişiklikler

Meta veri şifreleme kullanıldığında, vold /data önce çalışıyor olmalıdır. Yeterince erken başlatıldığından emin olmak için aşağıdaki kütüğü init.hardware.rc :

# We need vold early for metadata encryption
on early-fs
    start vold

İnit bağlamayı /data denemeden önce Keymaster çalışıyor ve hazır olmalıdır.

init.hardware.rc zaten on late-fs kendisini mount_all /data mount_all bir mount_all talimatı içermelidir. Bu satırdan önce, wait_for_keymaster hizmetini wait_for_keymaster için yönergeyi ekleyin:

on late-fs
   … 
    # Wait for keymaster
    exec_start wait_for_keymaster

    # Mount RW partitions which need run fsck
    mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late

Meta veri şifrelemesini açma

Son olarak eklemek keydirectory=/metadata/vold/metadata_encryption ait fs_mgr_flags sütuna fstab için girdiği userdata . Örneğin, tam bir fstab satırı şöyle görünebilir:

/dev/block/bootdevice/by-name/userdata              /data              f2fs        noatime,nosuid,nodev,discard,inlinecrypt latemount,wait,check,fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized,keydirectory=/metadata/vold/metadata_encryption,quota,formattable

Varsayılan olarak, dahili depolamadaki meta veri şifreleme algoritması AES-256-XTS'dir. Bu, ayrıca fs_mgr_flags sütununda metadata_encryption seçeneği ayarlanarak geçersiz kılınabilir:

  • AES hızlandırması olmayan cihazlarda, Adiantum şifrelemesi metadata_encryption=adiantum ayarlanarak etkinleştirilebilir.
  • Donanımla sarılmış anahtarları destekleyen cihazlarda, meta veri şifreleme anahtarı, metadata_encryption=aes-256-xts:wrappedkey_v0 (veya eşdeğer olarak metadata_encryption=:wrappedkey_v0 , çünkü aes-256-xts metadata_encryption=:wrappedkey_v0 varsayılan algoritmadır) ayarlanarak donanımla sarmalanmış yapılabilir.

Android 11'de dm-default-key için çekirdek arayüzü değiştiğinden, device.mk PRODUCT_SHIPPING_API_LEVEL için doğru değeri ayarladığınızdan da emin olmanız gerekir. Örneğin, cihazınız Android 11 (API seviyesi 30) ile başlatılıyorsa, device.mk içermelidir:

PRODUCT_SHIPPING_API_LEVEL := 30

Ayrıca, gönderim API seviyesinden bağımsız olarak yeni dm-default-key API'nin kullanımını zorlamak için aşağıdaki sistem özelliğini de ayarlayabilirsiniz:

PRODUCT_PROPERTY_OVERRIDES += \
    ro.crypto.dm_default_key.options_format.version=2

Doğrulama

Meta veri şifrelemenin etkinleştirildiğini ve düzgün çalıştığını doğrulamak için aşağıda açıklanan testleri çalıştırın. Ayrıca aşağıda açıklanan genel sorunlara da dikkat edin.

Testler

Dahili depolamada meta veri şifrelemesinin etkinleştirildiğini doğrulamak için aşağıdaki komutu çalıştırarak başlayın:

adb root
adb shell dmctl table userdata

Çıktı şuna benzer olmalıdır:

Targets in the device-mapper table for userdata:
0-4194304: default-key, aes-xts-plain64 - 0 252:2 0 3 allow_discards sector_size:4096 iv_large_sectors

Aygıtın fstab metadata_encryption seçeneğini ayarlayarak varsayılan şifreleme ayarlarını geçersiz kılarsanız, çıktı yukarıdakinden biraz farklı olacaktır. Örneğin, Adiantum şifrelemesini etkinleştirdiyseniz, üçüncü alan xchacha12,aes-adiantum-plain64 yerine xchacha12,aes-adiantum-plain64 aes-xts-plain64 .

Ardından, meta veri şifreleme ve FBE'nin doğruluğunu onaylamak için vts_kernel_encryption_test'i çalıştırın:

atest vts_kernel_encryption_test

veya:

vts-tradefed run vts -m vts_kernel_encryption_test

Ortak sorunlar

Metadata ile şifrelenmiş /data bölümünü mount_all çağrısı sırasında init , vdc aracını çalıştırır. Vdc aracı bağlandığı için vold üzerinde binder meta-şifreli cihazı kurmak ve bölüm monte etmek. Bu çağrının süresi boyunca, init engellenir ve init özelliklerini okuma veya ayarlama girişimleri, mount_all bitene kadar mount_all . Bu aşamada, vold çalışmasının herhangi bir bölümü bir özelliği okumada veya ayarlamada doğrudan veya dolaylı olarak engellenirse, kilitlenme ortaya çıkacaktır. vold anahtarları okuma, vold ile etkileşim ve veri dizinini vold işini init ile daha fazla etkileşim vold tamamlayabilmesini sağlamak önemlidir.

Zaman Keymaster tamamen başlamış değilse mount_all çalışır, bu kadar tepki vermez vold ondan belirli özellikleri okumak kadar init aynen anlatıldığı çıkmaz sonuçlanan. exec_start wait_for_keymaster belirtildiği gibi ilgili mount_all çağrısının üzerine yerleştirmek, exec_start wait_for_keymaster önceden tam olarak çalışmasını sağlar ve böylece bu kilitlenmeyi önler.

Kabul edilebilir depolamada yapılandırma

Android 9'dan beri, dahili depolamada meta veri şifreleme etkinleştirilmemiş olsa bile, FBE her etkinleştirildiğinde, benimsenebilir depolamada bir meta veri şifreleme biçimi her zaman etkinleştirilir.

AOSP'de, benimsenebilir depolamada meta veri şifrelemesinin iki uygulaması vardır: kullanımdan kaldırılmış olan dm-crypt ve daha yeni olan dm-default-key . Cihazınız için doğru uygulamanın seçildiğinden emin olmak için device.mk PRODUCT_SHIPPING_API_LEVEL için doğru değeri ayarladığınızdan emin device.mk . Örneğin, cihazınız Android 11 (API seviyesi 30) ile başlatılıyorsa, device.mk içermelidir:

PRODUCT_SHIPPING_API_LEVEL := 30

Ayrıca, nakliye API seviyesinden bağımsız olarak yeni hacim meta veri şifreleme yönteminin (ve yeni varsayılan FBE politika sürümünün) kullanımını zorlamak için aşağıdaki sistem özelliklerini ayarlayabilirsiniz:

PRODUCT_PROPERTY_OVERRIDES += \
    ro.crypto.volume.metadata.method=dm-default-key \
    ro.crypto.dm_default_key.options_format.version=2 \
    ro.crypto.volume.options=::v2

Mevcut yöntem

Android 11 veya üstü ile başlatılan cihazlarda, benimsenebilir depolamadaki meta veri şifrelemesi, dahili depolamada olduğu gibi dm-default-key çekirdek modülünü kullanır. Hangi çekirdek yapılandırma seçeneklerinin etkinleştirileceğini öğrenmek için yukarıdaki önkoşullara bakın. Cihazın dahili depolamasında çalışan satır içi şifreleme donanımının benimsenebilir depolamada kullanılamayabileceğini ve bu nedenle CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y gerekebileceğini unutmayın.

Varsayılan olarak, dm-default-key birim meta veri şifreleme yöntemi, 4096 baytlık kripto sektörleri ile AES-256-XTS şifreleme algoritmasını kullanır. Algoritma, ro.crypto.volume.metadata.encryption sistem özelliği ayarlanarak geçersiz kılınabilir. Bu özelliğin değeri, yukarıda açıklanan metadata_encryption fstab seçeneğiyle aynı sözdizimine sahiptir. Örneğin, AES hızlandırması olmayan cihazlarda, Adiantum şifrelemesi ro.crypto.volume.metadata.encryption=adiantum ayarlanarak etkinleştirilebilir.

Eski yöntem

Android 10 veya daha düşük sürümle başlatılan cihazlarda, benimsenebilir depolamadaki meta veri şifrelemesi, dm-default-key yerine dm-crypt çekirdek modülünü kullanır:

CONFIG_DM_CRYPT=y

dm-default-key yönteminden farklı olarak, dm-crypt yöntemi dosya içeriklerinin iki kez şifrelenmesine neden olur: birincisi bir FBE anahtarıyla ve birincisi meta veri şifreleme anahtarıyla. Bu çift şifreleme performansı düşürür ve meta veri şifrelemesinin güvenlik hedeflerine ulaşmak için gerekli değildir, çünkü Android FBE anahtarlarının en azından meta veri şifreleme anahtarı kadar zor olduğundan emin olur. Satıcılar hayata geçirerek özellikle çift şifreleme önlemek için çekirdek özelleştirmeleri yapabilirsiniz allow_encrypt_override Android geçecek seçeneği dm-crypt sistem özelliği zaman ro.crypto.allow_encrypt_override olarak ayarlanır true . Bu özelleştirmeler, Android ortak çekirdeği tarafından desteklenmez.

Varsayılan olarak, dm-crypt birim meta veri şifreleme yöntemi ESSIV ve 512 bayt kripto sektörleri ile AES-128-CBC şifreleme algoritmasını kullanır. Bu, aşağıdaki sistem özellikleri ayarlanarak geçersiz kılınabilir (bunlar aynı zamanda FDE için de kullanılır):

  • ro.crypto.fde_algorithm , meta veri şifreleme algoritmasını seçer. Seçenekler aes-128-cbc ve adiantum . Adiantum , yalnızca cihazda AES hızlandırması yoksa kullanılabilir.
  • ro.crypto.fde_sector_size , kripto sektör boyutunu seçer. Seçenekler 512, 1024, 2048 ve 4096'dır. Adiantum şifrelemesi için 4096'yı kullanın.