Android 7.0 dan mendukung lebih tinggi 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 adoptable setiap kali FBE diaktifkan. Enkripsi metadata juga dapat diaktifkan pada 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 menyiapkan metadata
filesystem, mengubah urutan init, dan memungkinkan 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 mensyaratkan bahwa dm-default-key
modul diaktifkan di kernel. Di Android 11 dan lebih tinggi, dm-default-key
didukung oleh kernel umum Android, versi 4.14 dan yang lebih tinggi. Versi dm-default-key
menggunakan hardware dan vendor-independen kerangka enkripsi disebut blk-kripto.
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 inline hardware enkripsi (hardware yang mengenkripsi / mendekripsi data saat itu dalam perjalanan ke / dari perangkat penyimpanan) bila tersedia. Jika Anda tidak akan menggunakan inline hardware enkripsi, perlu juga untuk mengaktifkan fallback ke kernel kriptografi API:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
Bila tidak menggunakan hardware enkripsi inline Anda juga harus mengaktifkan apapun yang tersedia percepatan berbasis CPU-seperti yang direkomendasikan dalam dokumentasi FBE .
Dalam Android 10 dan bawah, dm-default-key
tidak didukung oleh kernel umum Android. Oleh karena itu sampai dengan vendor untuk melaksanakan 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 sebuah entri untuk filesystem metadata yang hidup pada partisi mounting di /metadata
, termasuk formattable
bendera untuk memastikan itu 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 /metadata
mount point ada, tambahkan baris berikut ke BoardConfig-common.mk
:
BOARD_USES_METADATA_PARTITION := true
Perubahan pada urutan init
Ketika enkripsi metadata digunakan, vold
harus menjalankan sebelum /data
sudah terpasang. Untuk memastikan bahwa itu mulai awal cukup, tambahkan bait berikut untuk init.hardware.rc
:
# We need vold early for metadata encryption on early-fs start vold
Keymaster harus berjalan dan siap sebelum upaya init untuk me-mount /data
.
init.hardware.rc
harus sudah mengandung mount_all
instruksi yang tunggangan /data
itu sendiri di on late-fs
bait. Sebelum baris ini, tambahkan direktif untuk exec yang wait_for_keymaster
layanan:
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
Akhirnya menambahkan keydirectory=/metadata/vold/metadata_encryption
ke kolom fs_mgr_flags dari fstab
entri 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. Hal ini dapat ditimpa dengan menetapkan metadata_encryption
pilihan, juga di kolom fs_mgr_flags:
- Pada perangkat yang tidak memiliki akselerasi AES, enkripsi Adiantum dapat diaktifkan dengan menetapkan
metadata_encryption=adiantum
. - Pada perangkat yang mendukung kunci hardware-dibungkus , metadata kunci enkripsi dapat dibuat hardware-dibungkus dengan menetapkan
metadata_encryption=aes-256-xts:wrappedkey_v0
(atau ekuivalenmetadata_encryption=:wrappedkey_v0
, sebagaiaes-256-xts
adalah algoritma default).
Karena antarmuka kernel untuk dm-default-key
berubah di Android 11, Anda juga perlu memastikan bahwa Anda telah mengatur nilai yang benar untuk PRODUCT_SHIPPING_API_LEVEL
di device.mk
. Misalnya, jika perangkat peluncuran Anda 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 baru dm-default-key
API terlepas dari pengiriman tingkat API:
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. Juga berhati-hati dari masalah umum yang dijelaskan di bawah.
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 standar dengan menetapkan metadata_encryption
pilihan dalam perangkat fstab
, maka output akan sedikit berbeda dari atas. Misalnya, jika Anda mengaktifkan enkripsi Adiantum , maka bidang ketiga akan xchacha12,aes-adiantum-plain64
bukan 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 untuk mount_all
, yang mount metadata-dienkripsi /data
partisi, init
menjalankan alat VDC. Alat VDC menghubungkan ke vold
lebih binder
untuk mengatur perangkat metadata-dienkripsi dan mount partisi tersebut. Untuk durasi panggilan ini, init
diblokir, dan upaya untuk baik membaca atau set init
properti akan memblokir sampai mount_all
selesai. Jika, pada tahap ini, setiap bagian dari vold
kerja 's secara langsung atau tidak langsung diblokir pada membaca atau pengaturan properti, kebuntuan akan menghasilkan. Hal ini penting untuk memastikan bahwa vold
dapat menyelesaikan pekerjaan membaca kunci, berinteraksi dengan Keymaster, dan pemasangan direktori data tanpa berinteraksi lebih lanjut dengan init
.
Jika Keymaster tidak sepenuhnya dimulai ketika mount_all
berjalan, tidak akan merespon vold
sampai telah membaca sifat tertentu dari init
, sehingga persis kebuntuan dijelaskan. Menempatkan exec_start wait_for_keymaster
di atas relevan mount_all
doa sebagaimana diatur memastikan bahwa Keymaster sepenuhnya berjalan di muka dan jadi menghindari kebuntuan ini.
Konfigurasi pada penyimpanan yang dapat diadopsi
Sejak Android 9, bentuk enkripsi metadata selalu diaktifkan pada penyimpanan adoptable setiap kali FBE diaktifkan, bahkan ketika enkripsi metadata tidak diaktifkan pada penyimpanan internal.
Dalam AOSP, ada dua implementasi enkripsi metadata pada penyimpanan adoptable: satu usang berdasarkan dm-crypt
, dan yang lebih baru yang didasarkan pada dm-default-key
. Untuk memastikan bahwa pelaksanaan yang benar dipilih untuk perangkat Anda, pastikan bahwa Anda telah menetapkan nilai yang benar untuk PRODUCT_SHIPPING_API_LEVEL
di device.mk
. Misalnya, jika perangkat peluncuran Anda 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 meluncurkan dengan Android 11 atau lebih tinggi, enkripsi metadata pada penyimpanan adoptable menggunakan dm-default-key
modul kernel, seperti pada penyimpanan internal. Lihat prasyarat di atas untuk yang opsi konfigurasi kernel untuk mengaktifkan. Perhatikan bahwa inline enkripsi hardware yang bekerja pada penyimpanan internal perangkat mungkin tidak tersedia pada penyimpanan adoptable, dan dengan demikian CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
mungkin diperlukan.
Secara default, dm-default-key
metode enkripsi volume yang metadata menggunakan algoritma enkripsi AES-256-XTS dengan sektor kripto 4096-byte. Algoritma dapat ditimpa dengan menetapkan ro.crypto.volume.metadata.encryption
properti sistem. Nilai properti ini memiliki sintaks yang sama dengan metadata_encryption
pilihan fstab dijelaskan di atas. Sebagai contoh, pada perangkat yang tidak memiliki akselerasi AES, enkripsi Adiantum dapat diaktifkan dengan menetapkan ro.crypto.volume.metadata.encryption=adiantum
.
Metode lama
Pada perangkat meluncurkan dengan Android 10 atau lebih rendah, enkripsi metadata pada penyimpanan adoptable menggunakan dm-crypt
modul kernel daripada dm-default-key
:
CONFIG_DM_CRYPT=y
Berbeda dengan dm-default-key
metode, dm-crypt
metode menyebabkan isi file yang akan 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 kustomisasi kernel untuk menghindari enkripsi ganda, khususnya dengan menerapkan allow_encrypt_override
pilihan yang Android akan lolos ke dm-crypt
ketika properti sistem ro.crypto.allow_encrypt_override
diatur ke true
. Penyesuaian ini tidak didukung oleh kernel umum Android.
Secara default, dm-crypt
metode volume enkripsi metadata menggunakan algoritma enkripsi AES-128-CBC dengan ESSIV dan sektor kripto 512-byte. Ini dapat diganti dengan mengatur properti sistem berikut (yang juga digunakan untuk FDE):
-
ro.crypto.fde_algorithm
memilih algoritma enkripsi metadata. Pilihannya adalahaes-128-cbc
danadiantum
. Adiantum hanya dapat digunakan jika perangkat tidak memiliki akselerasi AES. -
ro.crypto.fde_sector_size
menyeleksi ukuran sektor kripto. Pilihannya adalah 512, 1024, 2048, dan 4096. Untuk enkripsi Adiantum, gunakan 4096.