Android 7.0 dan lebih tinggi mendukung enkripsi berbasis file (FBE). FBE memungkinkan file berbeda dienkripsi dengan kunci berbeda yang dapat dibuka kuncinya secara mandiri. Kunci ini digunakan untuk mengenkripsi konten file dan nama file. Ketika 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 terverifikasi.
Enkripsi metadata selalu diaktifkan pada penyimpanan yang dapat diadopsi 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 menyiapkan enkripsi metadata pada penyimpanan internal perangkat baru dengan menyiapkan sistem file metadata
, mengubah urutan init, dan mengaktifkan enkripsi metadata di file fstab perangkat.
Prasyarat
Enkripsi metadata hanya dapat diatur ketika partisi data pertama kali diformat. Oleh karena itu, fitur ini hanya untuk perangkat baru; ini bukanlah 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 kerangka enkripsi perangkat keras dan 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 inline, 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, vendor harus menerapkan dm-default-key
.
Siapkan sistem file metadata
Karena tidak ada apa pun di partisi data pengguna yang dapat dibaca hingga kunci enkripsi metadata ada, tabel partisi harus menyisihkan partisi terpisah yang disebut "partisi metadata" untuk menyimpan gumpalan keymaster yang melindungi kunci ini. Partisi metadata harus berukuran 16MB.
fstab.hardware
harus menyertakan entri untuk sistem file metadata yang ada di partisi tersebut yang memasangnya di /metadata
, termasuk tanda formattable
untuk memastikannya diformat pada waktu boot. Sistem file f2fs tidak berfungsi pada partisi yang lebih kecil; kami sarankan menggunakan ext4 sebagai gantinya. Misalnya:
/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
dipasang. Untuk memastikan bahwa ini 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 melakukan mount /data
.
init.hardware.rc
seharusnya sudah berisi instruksi mount_all
yang memasang /data
sendiri di bait on late-fs
. Sebelum baris ini, tambahkan arahan untuk menjalankan 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, baris 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 diatasi dengan menyetel opsi metadata_encryption
, juga di kolom fs_mgr_flags :
- Pada perangkat yang tidak memiliki akselerasi AES, enkripsi Adiantum dapat diaktifkan dengan mengatur
metadata_encryption=adiantum
. - Pada perangkat yang mendukung kunci yang terbungkus perangkat keras , kunci enkripsi metadata dapat dibuat terbungkus perangkat keras dengan mengatur
metadata_encryption=aes-256-xts:wrappedkey_v0
(atau yang setarametadata_encryption=:wrappedkey_v0
, karenaaes-256-xts
adalah algoritme default).
Karena antarmuka kernel menjadi dm-default-key
berubah di Android 11, Anda juga perlu memastikan bahwa Anda telah menetapkan 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 API dm-default-key
baru terlepas dari tingkat 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. 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 serupa 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 mengatur opsi metadata_encryption
di fstab
perangkat, maka outputnya akan sedikit berbeda dari yang di atas. Misalnya, jika Anda mengaktifkan enkripsi Adiantum , maka bidang ketiga adalah 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 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 durasi panggilan ini, init
diblokir, dan upaya untuk membaca atau menyetel properti init
akan diblokir hingga mount_all
selesai. Jika, pada tahap ini, ada bagian dari pekerjaan vold
yang secara langsung atau tidak langsung diblokir pada pembacaan atau pengaturan suatu properti, akan terjadi kebuntuan. 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 dimulai sepenuhnya saat mount_all
dijalankan, Keymaster 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 seperti yang ditetapkan akan memastikan bahwa Keymaster sepenuhnya berjalan terlebih dahulu sehingga 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, meskipun 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 penerapan yang benar telah dipilih untuk perangkat Anda, pastikan Anda telah menetapkan 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 tingkat API pengiriman:
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
, sama seperti pada penyimpanan internal. Lihat prasyarat di atas untuk mengaktifkan opsi konfigurasi kernel. Perhatikan bahwa perangkat keras enkripsi inline yang berfungsi pada penyimpanan internal perangkat mungkin tidak tersedia pada penyimpanan yang dapat diadopsi, sehingga 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 mengatur properti sistem ro.crypto.volume.metadata.encryption
. Nilai properti ini memiliki sintaks yang sama dengan opsi fstab metadata_encryption
yang dijelaskan di atas. Misalnya, pada perangkat yang tidak memiliki akselerasi AES, enkripsi Adiantum dapat diaktifkan dengan mengatur ro.crypto.volume.metadata.encryption=adiantum
.
Metode warisan
Pada perangkat yang diluncurkan dengan Android 10 atau lebih rendah, enkripsi metadata pada penyimpanan yang dapat diadopsi menggunakan modul kernel dm-crypt
, bukan dm-default-key
:
CONFIG_DM_CRYPT=y
Berbeda dengan metode dm-default-key
, metode dm-crypt
menyebabkan konten file dienkripsi dua kali: sekali dengan kunci FBE dan sekali dengan kunci enkripsi metadata. Enkripsi ganda ini mengurangi performa dan tidak diperlukan untuk mencapai tujuan keamanan enkripsi metadata, karena Android memastikan bahwa kunci FBE setidaknya sama sulitnya untuk disusupi seperti kunci enkripsi metadata. Vendor dapat melakukan penyesuaian kernel untuk menghindari enkripsi ganda, khususnya dengan mengimplementasikan 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 sektor kripto ESSIV dan 512-byte. Hal ini dapat diatasi 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
memilih ukuran sektor kripto. Pilihannya adalah 512, 1024, 2048, dan 4096. Untuk enkripsi Adiantum gunakan 4096.