Meta Veri Şifreleme

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

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 desteği sundu. Meta veri şifreleme ile, önyükleme sırasında mevcut olan tek bir anahtar, FBE tarafından şifrelenmeyen her türlü içeriği şifreler. Bu anahtar Keymaster tarafından korunur ve bu da doğrulanmış önyükleme tarafından korunur.

FBE etkinleştirildiğinde, kabul edilebilir depolamada meta veri şifrelemesi her zaman etkinleştirilir. Meta veri şifreleme, dahili depolamada da etkinleştirilebilir. Android 11 veya sonraki sürümlerle başlatılan cihazlarda dahili depolamada meta veri şifrelemesi etkin olmalıdır.

Dahili depolama üzerinde uygulama

metadata dosya sistemini ayarlayarak, başlatma sırasını değiştirerek ve aygıtın fstab dosyasında meta veri şifrelemesini etkinleştirerek yeni aygıtların dahili deposunda meta veri şifrelemesi kurabilirsiniz.

Önkoşullar

Meta veri şifrelemesi, yalnızca veri bölümü ilk formatlandığında kurulabilir. 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, çekirdeğinizde dm-default-key modülünün etkinleştirilmesini gerektirir. Android 11 ve sonraki sürümlerde, dm-default-key , Android ortak çekirdekleri, sürüm 4.14 ve üstü tarafından desteklenir. dm-default-key bu sürümü, blk-crypto adlı donanımdan ve satıcıdan bağımsız bir ş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ı (depolama aygıtına giderken/gelirken verileri şifreleyen/şifresini çözen donanım) kullanır. Satır içi şifreleme donanımı kullanmayacaksanız, çekirdeğin şifreleme API'sine bir geri dönüşü etkinleştirmek 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

Meta veri şifreleme anahtarı mevcut olana kadar kullanıcı verileri bölümündeki hiçbir şey okunamayacağından, bölüm tablosunun bu anahtarı koruyan anahtar yöneticisi bloblarını depolamak için "meta veri bölümü" adı verilen ayrı bir bölüm ayırması gerekir. Meta veri bölümü 16MB olmalıdır.

fstab.hardware , önyükleme sırasında biçimlendirildiğinden emin olmak için biçimlendirilebilir bayrak da dahil olmak üzere, /metadata formattable o bölümde yaşayan meta veri dosya sistemi için bir girdi içermelidir. 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şlangıç ​​dizisindeki değişiklikler

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

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

init /data bağlama girişiminde bulunmadan önce Keymaster çalışıyor ve hazır olmalıdır.

init.hardware.rc , /data data'nın kendisini on late-fs mount_all talimatını zaten içermelidir. Bu satırdan önce, wait_for_keymaster hizmetini yürütmek 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, userdata için fstab girişinin fs_mgr_flags sütununa keydirectory=/metadata/vold/metadata_encryption ekleyin. Ö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, metadata_encryption seçeneği, ayrıca fs_mgr_flags sütununda 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, metadata_encryption=aes-256-xts:wrappedkey_v0 (veya aes-256-xts xts varsayılan algoritma olduğundan eşdeğer metadata_encryption=:wrappedkey_v0 ) ayarlanarak meta veri şifreleme anahtarı donanımla sarılmış yapılabilir.

Android 11'de dm-default-key çekirdek arabirimi değiştiğinden, device.mk içinde 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 düzeyi 30) ile device.mk içermelidir:

PRODUCT_SHIPPING_API_LEVEL := 30

Gönderim API'si düzeyinden bağımsız olarak yeni dm-default-key API'sinin 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 ş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

Çı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 aes-xts-plain64 .

Ardından, meta veri şifrelemesinin ve FBE'nin doğruluğunu doğrulamak 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

Meta verilerle şifrelenmiş /data bölümünü mount_all çağrısı sırasında init , vdc aracını çalıştırır. vdc aracı, meta verilerle şifrelenmiş aygıtı kurmak ve bölümü monte etmek için vold over binder bağlanır. Bu çağrı süresince init engellenir ve init özelliklerini okuma veya ayarlama girişimleri mount_all bitene kadar engellenir. Bu aşamada, vold çalışmasının herhangi bir kısmı, bir özelliğin okunması veya ayarlanması sırasında doğrudan veya dolaylı olarak engellenirse, kilitlenme meydana gelir. vold'un anahtarları okuma, vold ile etkileşim kurma ve init ile daha fazla etkileşime girmeden veri dizinini kurma işini tamamlamasını sağlamak önemlidir.

mount_all çalıştırıldığında Keymaster tam olarak başlatılmazsa, init öğesinden belirli özellikleri okuyana kadar vold yanıt vermez ve tam olarak açıklanan kilitlenmeyle sonuçlanır. exec_start wait_for_keymaster , belirtildiği gibi ilgili mount_all çağrısının üzerine yerleştirmek, Keymaster'ın tamamen önceden çalışmasını sağlar ve böylece bu kilitlenmeyi önler.

Kabul edilebilir depolamada yapılandırma

Android 9'dan bu yana, FBE etkinleştirildiğinde, dahili depolamada meta veri şifrelemesi etkinleştirilmese bile, kabul edilebilir depolamada bir tür meta veri şifrelemesi her zaman etkinleştirilir.

AOSP'de, kabul edilebilir depolamada meta veri şifrelemesinin iki uygulaması vardır: dm-crypt dayalı kullanımdan kaldırılmış olan ve dm-default-key dayalı daha yenisi. Cihazınız için doğru uygulamanın seçildiğinden emin olmak için 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 device.mk içermelidir:

PRODUCT_SHIPPING_API_LEVEL := 30

Gönderim API seviyesinden bağımsız olarak yeni birim meta veri şifreleme yönteminin (ve yeni varsayılan FBE ilke sürümünün) kullanımını zorlamak 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

Geçerli yöntem

Android 11 veya sonraki sürümlerle başlatılan cihazlarda, uyarlanabilir depolamadaki meta veri şifrelemesi, tıpkı dahili depolamada olduğu gibi dm-default-key çekirdek modülünü kullanır. Hangi çekirdek yapılandırma seçeneklerinin etkinleştirileceği için yukarıdaki ön koşullara bakın. Cihazın dahili depolamasında çalışan satır içi şifreleme donanımının, uyarlanabilir depolamada kullanılamayabilir ve bu nedenle CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y gerekli olabilir.

Varsayılan olarak, dm-default-key birim meta veri şifreleme yöntemi, 4096 bayt şifreleme sektörleriyle AES-256-XTS şifreleme algoritmasını kullanır. Algoritma, ro.crypto.volume.metadata.encryption system ö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, ro.crypto.volume.metadata.encryption=adiantum ayarlanarak Adiantum şifrelemesi etkinleştirilebilir.

eski yöntem

Android 10 veya önceki sürümlerle başlatılan cihazlarda, uyarlanabilir 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çeriğinin iki kez şifrelenmesine neden olur: bir kez FBE anahtarıyla ve bir kez de meta veri şifreleme anahtarıyla. Bu çift şifreleme, performansı düşürür ve Android, FBE anahtarlarının en az meta veri şifreleme anahtarı kadar tehlikeye atılmasının zor olmasını sağladığından, meta veri şifrelemesinin güvenlik hedeflerine ulaşmak için gerekli değildir. Satıcılar, özellikle ro.crypto.allow_encrypt_override sistem özelliği true olarak ayarlandığında Android'in dm-crypt 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 bayt şifreleme sektörleriyle AES-128-CBC şifreleme algoritmasını kullanır. Bu, aşağıdaki sistem özellikleri (FDE için de kullanılır) ayarlanarak geçersiz kılınabilir:

  • ro.crypto.fde_algorithm , meta veri şifreleme algoritmasını seçer. Seçenekler aes-128-cbc ve adiantum . Adiantum yalnızca cihazda AES ivmesi 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.