Enkripsi Metadata

Android 7.0 dan yang lebih tinggi mendukung enkripsi berbasis file (FBE). FBE memungkinkan file yang berbeda untuk dienkripsi dengan kunci yang berbeda yang dapat dibuka secara independen. Kunci ini digunakan untuk mengenkripsi konten file dan nama file. Saat FBE digunakan, informasi lain, seperti tata letak direktori, ukuran file, izin, dan waktu pembuatan/modifikasi, tidak dienkripsi. Secara kolektif, informasi lain ini dikenal sebagai metadata sistem file.

Android 9 memperkenalkan dukungan untuk enkripsi metadata. Dengan enkripsi metadata, satu kunci yang ada saat boot mengenkripsi konten apa pun yang tidak dienkripsi oleh FBE. Kunci ini dilindungi oleh Keymaster, yang pada gilirannya dilindungi oleh boot yang diverifikasi.

Enkripsi metadata selalu diaktifkan pada penyimpanan yang dapat diadopsi setiap kali FBE diaktifkan. Enkripsi metadata juga dapat diaktifkan di penyimpanan internal. Perangkat yang diluncurkan dengan Android 11 atau lebih tinggi harus mengaktifkan enkripsi metadata pada penyimpanan internal.

Implementasi pada penyimpanan internal

Anda dapat mengatur enkripsi metadata pada penyimpanan internal perangkat baru dengan mengatur sistem file metadata , mengubah urutan init, dan mengaktifkan enkripsi metadata dalam file fstab perangkat.

Prasyarat

Enkripsi metadata hanya dapat diatur ketika partisi data pertama kali diformat. Akibatnya, fitur ini hanya untuk perangkat baru; ini bukan sesuatu yang harus diubah oleh OTA.

Enkripsi metadata mengharuskan modul dm-default-key diaktifkan di kernel Anda. Di Android 11 dan lebih tinggi, dm-default-key didukung oleh kernel umum Android, versi 4.14 dan lebih tinggi. Versi dm-default-key ini menggunakan perangkat keras dan kerangka kerja enkripsi independen vendor yang disebut blk-crypto .

Untuk mengaktifkan dm-default-key , gunakan:

CONFIG_BLK_INLINE_ENCRYPTION=y
CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
CONFIG_DM_DEFAULT_KEY=y

dm-default-key menggunakan perangkat keras enkripsi inline (perangkat keras yang mengenkripsi/mendekripsi data saat sedang dalam perjalanan ke/dari perangkat penyimpanan) bila tersedia. Jika Anda tidak akan menggunakan perangkat keras enkripsi inline, Anda juga perlu mengaktifkan fallback ke API kriptografi kernel:

CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y

Saat tidak menggunakan perangkat keras enkripsi sebaris, Anda juga harus mengaktifkan akselerasi berbasis CPU yang tersedia seperti yang direkomendasikan dalam dokumentasi FBE .

Di Android 10 dan yang lebih rendah, dm-default-key tidak didukung oleh kernel umum Android. Oleh karena itu terserah vendor untuk mengimplementasikan dm-default-key .

Siapkan sistem file metadata

Karena tidak ada dalam partisi data pengguna yang dapat dibaca hingga kunci enkripsi metadata hadir, tabel partisi harus menyisihkan partisi terpisah yang disebut "partisi metadata" untuk menyimpan gumpalan keymaster yang melindungi kunci ini. Partisi metadata harus 16MB.

fstab.hardware harus menyertakan entri untuk sistem file metadata yang hidup di partisi yang memasangnya di /metadata , termasuk formattable yang dapat diformat untuk memastikannya diformat pada saat boot. Sistem file f2fs tidak bekerja pada partisi yang lebih kecil; sebaiknya gunakan ext4 sebagai gantinya. Sebagai contoh:

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

Untuk memastikan titik pemasangan /metadata ada, tambahkan baris berikut ke BoardConfig-common.mk :

BOARD_USES_METADATA_PARTITION := true

Perubahan pada urutan init

Ketika enkripsi metadata digunakan, vold harus dijalankan sebelum /data di-mount. Untuk memastikan bahwa itu dimulai cukup awal, tambahkan bait berikut ke init.hardware.rc :

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

Keymaster harus berjalan dan siap sebelum init mencoba me-mount /data .

init.hardware.rc seharusnya sudah berisi instruksi mount_all yang me-mount /data itu sendiri di bait on late-fs . Sebelum baris ini, tambahkan direktif ke exec layanan wait_for_keymaster :

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

Mengaktifkan enkripsi metadata

Terakhir tambahkan keydirectory=/metadata/vold/metadata_encryption ke kolom fs_mgr_flags dari entri fstab untuk userdata . Misalnya, garis fstab lengkap mungkin terlihat seperti:

/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

Secara default, algoritma enkripsi metadata pada penyimpanan internal adalah AES-256-XTS. Ini dapat diganti dengan menyetel opsi metadata_encryption , juga di kolom fs_mgr_flags :

  • Pada perangkat yang tidak memiliki akselerasi AES, enkripsi Adiantum dapat diaktifkan dengan menyetel metadata_encryption=adiantum .
  • Pada perangkat yang mendukung kunci terbungkus perangkat keras , kunci enkripsi metadata dapat dibuat terbungkus perangkat keras dengan menyetel metadata_encryption=aes-256-xts:wrappedkey_v0 (atau setara dengan metadata_encryption=:wrappedkey_v0 , karena aes-256-xts adalah algoritme default).

Karena antarmuka kernel ke dm-default-key berubah di Android 11, Anda juga perlu memastikan bahwa Anda telah menyetel nilai yang benar untuk PRODUCT_SHIPPING_API_LEVEL di device.mk . Misalnya, jika perangkat Anda diluncurkan dengan Android 11 (API level 30), device.mk harus berisi:

PRODUCT_SHIPPING_API_LEVEL := 30

Anda juga dapat menyetel properti sistem berikut untuk memaksa penggunaan dm-default-key API baru terlepas dari level API pengiriman:

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

Validasi

Untuk memverifikasi bahwa enkripsi metadata diaktifkan dan berfungsi dengan benar, jalankan pengujian yang dijelaskan di bawah ini. Perhatikan juga masalah umum yang dijelaskan di bawah ini.

tes

Mulailah dengan menjalankan perintah berikut untuk memverifikasi bahwa enkripsi metadata diaktifkan pada penyimpanan internal:

adb root
adb shell dmctl table userdata

Outputnya harus mirip dengan:

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

Jika Anda mengesampingkan pengaturan enkripsi default dengan menyetel opsi metadata_encryption di fstab perangkat, maka hasilnya akan sedikit berbeda dari yang di atas. Misalnya, jika Anda mengaktifkan enkripsi Adiantum , maka bidang ketiga adalah xchacha12,aes-adiantum-plain64 alih-alih aes-xts-plain64 .

Selanjutnya, jalankan vts_kernel_encryption_test untuk memverifikasi kebenaran enkripsi metadata dan FBE:

atest vts_kernel_encryption_test

atau:

vts-tradefed run vts -m vts_kernel_encryption_test

Masalah umum

Selama panggilan ke mount_all , yang memasang partisi /data terenkripsi metadata, init mengeksekusi alat vdc. Alat vdc terhubung ke vold over binder untuk menyiapkan perangkat terenkripsi metadata dan memasang partisi. Selama panggilan ini, init diblokir, dan upaya untuk membaca atau menyetel properti init akan diblokir hingga mount_all selesai. Jika, pada tahap ini, setiap bagian dari pekerjaan vold secara langsung atau tidak langsung terhalang saat membaca atau mengatur properti, kebuntuan akan terjadi. Penting untuk memastikan bahwa vold dapat menyelesaikan pekerjaan membaca kunci, berinteraksi dengan Keymaster, dan memasang direktori data tanpa berinteraksi lebih jauh dengan init .

Jika Keymaster tidak sepenuhnya dimulai saat mount_all berjalan, ia tidak akan merespons vold hingga ia membaca properti tertentu dari init , yang mengakibatkan kebuntuan persis seperti yang dijelaskan. Menempatkan exec_start wait_for_keymaster di atas pemanggilan mount_all yang relevan sebagaimana ditetapkan memastikan bahwa Keymaster sepenuhnya berjalan sebelumnya dan dengan demikian menghindari kebuntuan ini.

Konfigurasi pada penyimpanan yang dapat diadopsi

Sejak Android 9, bentuk enkripsi metadata selalu diaktifkan pada penyimpanan yang dapat diadopsi setiap kali FBE diaktifkan, bahkan ketika enkripsi metadata tidak diaktifkan pada penyimpanan internal.

Di AOSP, ada dua implementasi enkripsi metadata pada penyimpanan yang dapat diadopsi: yang tidak digunakan lagi berdasarkan dm-crypt , dan yang lebih baru berdasarkan dm-default-key . Untuk memastikan bahwa penerapan yang benar dipilih untuk perangkat Anda, pastikan bahwa Anda telah menyetel nilai yang benar untuk PRODUCT_SHIPPING_API_LEVEL di device.mk . Misalnya, jika perangkat Anda diluncurkan dengan Android 11 (API level 30), device.mk harus berisi:

PRODUCT_SHIPPING_API_LEVEL := 30

Anda juga dapat mengatur properti sistem berikut untuk memaksa penggunaan metode enkripsi metadata volume baru (dan versi kebijakan FBE default baru) terlepas dari pengiriman tingkat API:

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

Metode saat ini

Pada perangkat yang diluncurkan dengan Android 11 atau lebih tinggi, enkripsi metadata pada penyimpanan yang dapat diadopsi menggunakan modul kernel dm-default-key , seperti pada penyimpanan internal. Lihat prasyarat di atas untuk mengaktifkan opsi konfigurasi kernel. Perhatikan bahwa perangkat keras enkripsi sebaris yang bekerja pada penyimpanan internal perangkat mungkin tidak tersedia pada penyimpanan yang dapat diadopsi, dan dengan demikian CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y mungkin diperlukan.

Secara default, metode enkripsi metadata volume dm-default-key menggunakan algoritma enkripsi AES-256-XTS dengan sektor kripto 4096-byte. Algoritme dapat diganti dengan menyetel properti sistem ro.crypto.volume.metadata.encryption . Nilai properti ini memiliki sintaks yang sama dengan opsi metadata_encryption fstab yang dijelaskan di atas. Misalnya, pada perangkat yang tidak memiliki akselerasi AES, enkripsi Adiantum dapat diaktifkan dengan menyetel ro.crypto.volume.metadata.encryption=adiantum .

Metode lama

Pada perangkat yang diluncurkan dengan Android 10 atau lebih rendah, enkripsi metadata pada penyimpanan yang dapat diadopsi menggunakan modul kernel dm-crypt daripada dm-default-key :

CONFIG_DM_CRYPT=y

Berbeda dengan metode dm-default-key , metode dm-crypt menyebabkan isi file dienkripsi dua kali: sekali dengan kunci FBE dan sekali dengan kunci enkripsi metadata. Enkripsi ganda ini mengurangi kinerja dan tidak diperlukan untuk mencapai tujuan keamanan enkripsi metadata, karena Android memastikan bahwa kunci FBE setidaknya sama sulitnya dengan kunci enkripsi metadata. Vendor dapat membuat penyesuaian kernel untuk menghindari enkripsi ganda, khususnya dengan menerapkan opsi allow_encrypt_override yang akan diteruskan Android ke dm-crypt ketika properti sistem ro.crypto.allow_encrypt_override disetel ke true . Penyesuaian ini tidak didukung oleh kernel umum Android.

Secara default, metode enkripsi metadata volume dm-crypt menggunakan algoritma enkripsi AES-128-CBC dengan ESSIV dan sektor crypto 512-byte. Ini dapat diganti dengan mengatur properti sistem berikut (yang juga digunakan untuk FDE):

  • ro.crypto.fde_algorithm memilih algoritma enkripsi metadata. Pilihannya adalah aes-128-cbc dan adiantum . Adiantum hanya dapat digunakan jika perangkat tidak memiliki akselerasi AES.
  • ro.crypto.fde_sector_size memilih ukuran sektor kripto. Pilihannya adalah 512, 1024, 2048, dan 4096. Untuk enkripsi Adiantum, gunakan 4096.