Meta veri şifreleme

Android 7.0 ve sonraki sürümler dosya tabanlı şifrelemeyi (FBE) destekler. FBE, farklı dosyaların bağımsız olarak kilidi açılabilen farklı anahtarlarla şifrelenmesine olanak tanır. Bu anahtarlar hem dosya içeriklerini 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şiklik yapma zamanları gibi diğer bilgiler şifrelenmez. Bu diğer bilgiler toplu olarak dosya sistemi meta verileri olarak bilinir.

Android 9, meta veri şifrelemesi desteğini kullanıma sundu. Meta veri şifrelemede, önyükleme sırasında mevcut olan tek bir anahtar, FBE tarafından şifrelenmeyen tüm içerikleri şifreler. Bu anahtar, Keymaster tarafından korunur. Keymaster da doğrulanmış önyükleme tarafından korunur.

FBE etkinleştirildiğinde meta veri şifrelemesi uyarlanabilir depolama alanında her zaman etkindir. Meta veri şifrelemesi, dahili depolama biriminde de etkinleştirilebilir. Android 11 veya sonraki sürümlerin yüklü olduğu cihazlarda dahili depolama alanında meta veri şifrelemesi etkinleştirilmiş olmalıdır.

Dahili depolama alanında uygulama

metadata dosya sistemini ayarlayarak, init sırasını değiştirerek ve cihazın fstab dosyasında meta veri şifrelemeyi etkinleştirerek yeni cihazların dahili depolama alanında meta veri şifrelemeyi ayarlayabilirsiniz.

Ön koşullar

Meta veri şifrelemesi yalnızca veri bölümü ilk kez biçimlendirilirken ayarlanabilir. Bu nedenle, bu özellik yalnızca yeni cihazlar içindir ve OTA'da değiştirilemez.

Meta veri şifrelemesi için çekirdeğinizde dm-default-key modülünün etkinleştirilmesi gerekir. Android 11 ve sonraki sürümlerde dm-default-key, 4.14 ve sonraki sürümlerin Android ortak çekirdekleri tarafından desteklenir. dm-default-key'ün bu sürümü, blk-crypto adlı donanım ve tedarikçiye bağlı olmayan bir şifreleme çerçevesi kullanır.

dm-default-key özelliğini etkinleştirmek için:

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ı (veriler depolama cihazına giderken/gelirken şifreleyen/şifre çözen donanım) kullanır. Satır içi şifreleme donanımı kullanmıyorsanız çekirdeğin kriptografi API'sine yedekleme seçeneğini etkinleştirmeniz de gerekir:

CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y

Satır içi şifreleme donanımı kullanmıyorsanız FBE dokümanlarında önerilen tüm CPU tabanlı hızlandırmaları da etkinleştirmeniz gerekir.

Android 10 ve önceki sürümlerde dm-default-key, Android ortak çekirdeği tarafından desteklenmez. Bu nedenle, dm-default-key'ü uygulamak tedarikçi firmalara bırakılmıştı.

Meta veri dosya sistemini ayarlama

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

fstab.hardware, /metadata'te monte edilen ve önyükleme sırasında biçimlendirilmesini sağlamak için formattable işareti de dahil olmak üzere, söz konusu bölümde bulunan meta veri dosya sistemi için bir giriş içermelidir. f2fs dosya sistemi daha küçük bölümlerde çalışmaz. Bunun yerine ext4 kullanmanızı öneririz. Örnek:

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

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

BOARD_USES_METADATA_PARTITION := true

İlk başlatma sırası değişiklikleri

Meta veri şifrelemesi kullanıldığında /data bağlanmadan önce vold çalışmalıdır. Yeterince erken başlatıldığından emin olmak için init.hardware.rc dosyasına aşağıdaki dörtlüğü ekleyin:

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

init, /data'ü bağlamaya çalışmadan önce Keymaster'ın çalışıyor ve hazır olması gerekir.

init.hardware.rc, /data öğesini on late-fs kıtasına monte eden bir mount_all talimatı içermelidir. Bu satırdan önce, wait_for_keymaster hizmetini çalıştırma talimatlarını 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 şifrelemeyi etkinleştirme

Son olarak, userdata için fstab girişinin fs_mgr_flags sütununa keydirectory=/metadata/vold/metadata_encryption ekleyin. Örneğin, tam bir fstab satırı şu şekilde 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

Dahili depolama alanındaki meta veri şifreleme algoritması varsayılan olarak AES-256-XTS'dir. Bu, fs_mgr_flags sütununda metadata_encryption seçeneği ayarlanarak geçersiz kılınabilir:

  • AES hızlandırması olmayan cihazlarda metadata_encryption=adiantum ayarlanarak Adiantum şifrelemesi etkinleştirilebilir.
  • Donanımla sarmalanmış anahtarları destekleyen cihazlarda, meta veri şifreleme anahtarı metadata_encryption=aes-256-xts:wrappedkey_v0 (veya aes-256-xts varsayılan algoritma olduğundan eşdeğer olarak metadata_encryption=:wrappedkey_v0) ayarlanarak donanımla sarmalanmış hale getirilebilir.

Android 11'de dm-default-key için çekirdek arayüzü değiştiğinden device.mk'de PRODUCT_SHIPPING_API_LEVEL için doğru değeri ayarladığınızdan emin olmanız gerekir. Örneğin, cihazınız Android 11 (API düzeyi 30) ile kullanıma sunuluyorsa device.mk şu bilgileri içermelidir:

PRODUCT_SHIPPING_API_LEVEL := 30

Ayrıca, gönderim API'si düzeyinden bağımsız olarak yeni dm-default-key API'nin kullanılmasını zorunlu kılmak 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 yaygın sorunlara da dikkat edin.

Testler

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

adb root
adb shell dmctl table userdata

Çıkış şuna benzer şekilde görünecektir:

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

Cihazın fstab bölümünde metadata_encryption seçeneğini ayarlayarak varsayılan şifreleme ayarlarını geçersiz kıldıysanız çıkış, yukarıdakinden biraz farklıdır. Örneğin, Adiantum şifrelemesini etkinleştirdiyseniz üçüncü alan aes-xts-plain64 yerine xchacha12,aes-adiantum-plain64 olur.

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

atest vts_kernel_encryption_test

veya:

vts-tradefed run vts -m vts_kernel_encryption_test

Genel sorunlar

Meta veri şifrelenmiş /data bölümünü bağlayan mount_all çağrısı sırasında init, vdc aracını yürütür. Meta veri şifrelenmiş cihazı ayarlamak ve bölümü bağlamak için vdc aracı, binder üzerinden vold'e bağlanır. Bu çağrı süresince init engellenir ve mount_all tamamlanana kadar init özelliklerini okuma veya ayarlama girişimleri engellenir. Bu aşamada, vold'nin çalışmasının herhangi bir kısmı bir mülkü okuma veya ayarlama konusunda doğrudan veya dolaylı olarak engellenirse kilitlenme meydana gelir. vold'ün, init ile başka bir etkileşimde bulunmadan anahtarları okuma, Keymaster ile etkileşim kurma ve veri dizini bağlama işlemlerini tamamlayabilmesi önemlidir.

Keymaster, mount_all çalışırken tam olarak başlatılmazsa init'den belirli özellikleri okuyana kadar vold'e yanıt vermez. Bu da tam olarak açıklanan kilitlenmeye neden olur. exec_start wait_for_keymaster'ü, yukarıda belirtildiği gibi ilgili mount_all çağrısının üzerine yerleştirmek, Keymaster'ın önceden tam olarak çalışmasını sağlar ve bu kilitlenmeyi önler.

Dahili hale getirilebilir depolama alanında yapılandırma

Android 9'dan beri, dahili depolama alanında meta veri şifrelemesi etkinleştirilmemiş olsa bile FBE etkinleştirildiğinde uyarlanabilir depolama alanında meta veri şifrelemesi her zaman etkinleştirilir.

AOSP'de, benimsenebilir depolama alanında meta veri şifrelemenin iki uygulaması vardır: dm-crypt'e dayalı desteği sonlandırılmış bir uygulama ve dm-default-key'e dayalı daha yeni bir uygulama. Cihazınız için doğru uygulamanın seçildiğinden emin olmak üzere device.mk içinde PRODUCT_SHIPPING_API_LEVEL için doğru değeri ayarladığınızdan emin olun. Örneğin, cihazınız Android 11 (API düzeyi 30) ile kullanıma sunuluyorsa device.mk şu bilgileri içermelidir:

PRODUCT_SHIPPING_API_LEVEL := 30

Ayrıca, gönderim API'si seviyesinden bağımsız olarak yeni birim meta veri şifreleme yönteminin (ve yeni varsayılan FBE politika sürümünün) kullanılmasını zorunlu kılmak için aşağıdaki sistem özelliklerini de 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 sonraki bir sürümle kullanıma sunulan cihazlarda, uyarlanabilir depolama alanındaki meta veri şifrelemesi, dahili depolama alanında olduğu gibi dm-default-keyçekirdek modülünü kullanır. Hangi çekirdek yapılandırma seçeneklerinin etkinleştirileceği hakkında bilgi edinmek için yukarıdaki ön koşullara bakın. Cihazın dahili depolama alanında çalışan satır içi şifreleme donanımının, benimsenebilir depolama alanında kullanılamayabileceğini ve bu nedenle CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y'ün gerekli olabileceğini unutmayın.

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

Eski yöntem

Android 10 veya önceki bir sürümle kullanıma sunulan cihazlarda, uyarlanabilir depolama alanındaki meta veri şifrelemesi için dm-default-key yerine dm-crypt çekirdek modülü kullanılır:

CONFIG_DM_CRYPT=y

dm-default-key yönteminin aksine dm-crypt yöntemi, dosya içeriğinin iki kez şifrelenmesine neden olur: bir kez FBE anahtarıyla ve bir kez meta veri şifreleme anahtarıyla. Bu çift şifreleme, performansı düşürür ve Android, FBE anahtarlarının meta veri şifreleme anahtarı kadar kolay ele geçirilememesini sağladığından meta veri şifrelemenin güvenlik hedeflerine ulaşmak için gerekli değildir. Tedarikçiler, özellikle ro.crypto.allow_encrypt_override sistem özelliği true olarak ayarlandığında Android'in dm-crypt'e ilettiği allow_encrypt_override seçeneğini uygulayarak çift şifrelemeyi önlemek için çekirdek özelleştirmeleri yapabilir. Bu özelleştirmeler Android ortak çekirdeği tarafından desteklenmez.

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

  • ro.crypto.fde_algorithm, meta veri şifreleme algoritmasını seçer. Seçenekler aes-128-cbc ve adiantum'dır. 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'tır. Adiantum şifrelemesi için 4096'ı kullanın.