Android 7.0 dan yang lebih tinggi mendukung enkripsi berbasis file (FBE). FBE memungkinkan file yang berbeda dienkripsi dengan kunci yang berbeda yang dapat dibuka secara independen. Kunci ini digunakan untuk mengenkripsi isi 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 lainnya ini dikenal sebagai metadata sistem file.
Android 9 memperkenalkan dukungan untuk enkripsi metadata. Dengan enkripsi {i>metadata<i}, satu kunci yang ada pada saat {i>booting<i} mengenkripsi konten tidak dienkripsi oleh FBE. Kunci ini dilindungi oleh Keymaster, yang terletak di pada gilirannya dilindungi oleh {i>booting<i} yang terverifikasi.
Enkripsi metadata selalu diaktifkan di penyimpanan yang dapat diadopsi setiap kali FBE diaktifkan. Enkripsi metadata juga dapat diaktifkan di penyimpanan internal. Perangkat diluncurkan dengan Android 11 atau yang lebih tinggi harus memiliki enkripsi metadata di penyimpanan internal diaktifkan.
Penerapan pada penyimpanan internal
Anda dapat menyiapkan enkripsi metadata di penyimpanan internal perangkat baru dengan
menyiapkan sistem file metadata
, mengubah urutan init, dan
mengaktifkan enkripsi metadata dalam file fstab perangkat.
Prasyarat
Enkripsi metadata hanya dapat disiapkan saat partisi data pertama kali diformat. Oleh karena itu, fitur ini hanya tersedia untuk perangkat baru. ini tidak sesuatu yang harus diubah oleh OTA.
Enkripsi metadata mengharuskan modul dm-default-key
di {i>kernel<i}. Di Android 11 dan yang lebih tinggi,
dm-default-key
didukung oleh kernel umum Android, versi
4.14 dan yang lebih tinggi. Versi dm-default-key
ini menggunakan hardware dan
framework 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 hardware enkripsi inline (hardware yang
mengenkripsi/mendekripsi data saat sedang dalam perjalanan ke/dari perangkat penyimpanan) jika
tersedia. Jika Anda tidak menggunakan hardware enkripsi inline,
juga diperlukan untuk mengaktifkan fallback ke API kriptografi kernel:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
Jika tidak menggunakan hardware enkripsi inline, Anda juga harus mengaktifkan semua hardware yang tersedia Akselerasi berbasis CPU 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
.
Menyiapkan sistem file metadata
Karena tidak ada apa pun dalam partisi {i>userdata<i} yang dapat dibaca hingga {i>metadata<i} ada kunci enkripsi, tabel partisi harus menyisihkan partisi yang disebut "partisi metadata" untuk menyimpan blob keymaster melindungi kunci ini. Partisi metadata harus berukuran 16 MB.
fstab.hardware
harus menyertakan entri untuk sistem file metadata
yang ada di partisi tersebut yang memasangnya di /metadata
, termasuk
flag formattable
untuk memastikannya diformat pada saat booting. Tujuan
Sistem file f2fs tidak berfungsi pada partisi yang lebih kecil; sebaiknya gunakan ext4
sebagai gantinya. 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
Jika enkripsi metadata digunakan, vold
harus dijalankan sebelum
/data
telah dipasang. Untuk memastikannya 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 percobaan init dipasang
/data
.
init.hardware.rc
seharusnya sudah berisi petunjuk mount_all
yang memasang /data
itu sendiri dalam stanza on
late-fs
. Sebelum baris ini, tambahkan perintah 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
Aktifkan enkripsi metadata
Terakhir tambahkan keydirectory=/metadata/vold/metadata_encryption
ke
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
AES-256-XTS. Anda dapat menggantinya dengan menetapkan
opsi metadata_encryption
, 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 yang digabungkan dengan hardware,
kunci enkripsi metadata dapat digabungkan dengan hardware dengan menetapkan
metadata_encryption=aes-256-xts:wrappedkey_v0
(ataumetadata_encryption=:wrappedkey_v0
yang setara, karenaaes-256-xts
adalah algoritma default).
Karena antarmuka kernel ke dm-default-key
berubah di Android
11, Anda juga harus 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 menetapkan properti sistem berikut untuk memaksa penggunaan
dm-default-key
API 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. Perhatikan juga masalah umum yang dijelaskan di bawah.
Pengujian
Mulai dengan menjalankan perintah berikut untuk memverifikasi bahwa enkripsi metadata diaktifkan di penyimpanan internal:
adb root
adb shell dmctl table userdata
Output 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 mengganti setelan enkripsi default dengan menetapkan
opsi metadata_encryption
di fstab
perangkat,
output akan sedikit berbeda dari yang di atas. Misalnya, jika Anda mengaktifkan enkripsi Adiantum, kolom ketiga
adalah xchacha12,aes-adiantum-plain64
, bukan
aes-xts-plain64
.
Berikutnya, jalankan vts_kernel_encryption_test untuk memverifikasi keakuratan 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 data yang dienkripsi
/data
, init
akan menjalankan alat vdc. VDC
alat terhubung ke vold
melalui binder
untuk menyiapkan
perangkat yang dienkripsi dengan metadata
dan memasang partisi. Selama durasi panggilan
ini, init
diblokir, dan mencoba membaca atau menetapkan
blok properti init
hingga mount_all
selesai.
Jika, pada tahap ini, bagian mana pun dari pekerjaan vold
secara langsung atau
diblokir secara tidak langsung saat membaca atau menyetel properti, hasil deadlock. Anda
harus memastikan bahwa vold
dapat menyelesaikan tugas membaca
kunci, berinteraksi dengan Keymaster, dan memasang direktori data tanpa
berinteraksi lebih lanjut dengan init
.
Jika Keymaster tidak dimulai sepenuhnya saat mount_all
berjalan, Keymaster tidak
merespons vold
hingga telah membaca properti tertentu dari
init
, yang menghasilkan deadlock persis seperti yang dijelaskan. Menempatkan
exec_start wait_for_keymaster
di atas nilai relevan
Pemanggilan mount_all
seperti yang ditetapkan memastikan bahwa Keymaster sepenuhnya
berjalan di muka sehingga dapat
menghindari {i>deadlock<i}.
Konfigurasi pada penyimpanan yang dapat diadaptasi
Sejak Android 9, bentuk enkripsi metadata selalu diaktifkan di penyimpanan yang dapat diadopsi setiap kali FBE diaktifkan, meskipun enkripsi metadata tidak diaktifkan di penyimpanan internal.
Di AOSP, ada dua implementasi enkripsi metadata pada
penyimpanan: penyimpanan yang tidak digunakan lagi berdasarkan dm-crypt
, dan penyimpanan yang lebih baru berdasarkan
pada dm-default-key
. Untuk memastikan penerapan yang benar
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 menetapkan properti sistem berikut untuk memaksa penggunaan metode enkripsi metadata volume (dan versi kebijakan FBE default baru) terlepas dari API level 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 yang lebih tinggi,
enkripsi metadata pada penyimpanan yang dapat diadopsi menggunakan dm-default-key
modul {i>kernel<i}, seperti pada
penyimpanan internal. Lihat prasyarat di atas untuk konfigurasi kernel yang mana
mengaktifkan opsi. Perhatikan bahwa hardware enkripsi inline yang berfungsi di
penyimpanan internal perangkat mungkin tidak tersedia di 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. Tujuan
algoritma ini dapat diganti
dengan menyetel atribut
Properti sistem ro.crypto.volume.metadata.encryption
. Ini
nilai properti memiliki sintaksis yang sama dengan metadata_encryption
opsi fstab yang dijelaskan di atas. Misalnya, pada perangkat yang tidak memiliki AES
akselerasi, Enkripsi adiantum
dapat diaktifkan dengan menyetel
ro.crypto.volume.metadata.encryption=adiantum
.
Metode lama
Pada perangkat yang diluncurkan dengan Android 10 atau yang lebih lama, 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 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 sasaran keamanan enkripsi metadata, karena Android
memastikan bahwa kunci FBE setidaknya sama sulitnya untuk disusupi
kunci enkripsi. Vendor dapat membuat penyesuaian {i>
kernel<i} untuk menghindari
enkripsi, khususnya dengan menerapkan
allow_encrypt_override
yang diteruskan Android
dm-crypt
saat 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 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.