Android 7.0 dan yang lebih tinggi mendukung enkripsi berbasis file (FBE). FBE memungkinkan berbagai file dienkripsi dengan kunci berbeda yang dapat dibuka kuncinya 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 lain ini dikenal sebagai metadata sistem file.
Android 9 memperkenalkan dukungan untuk enkripsi metadata. Dengan enkripsi metadata, satu kunci yang ada pada waktu booting akan mengenkripsi konten apa pun yang tidak dienkripsi oleh FBE. Kunci ini dilindungi oleh Keymaster, yang selanjutnya dilindungi oleh booting terverifikasi.
Enkripsi metadata selalu diaktifkan di penyimpanan yang dapat diadopsi setiap kali FBE diaktifkan. Enkripsi metadata juga dapat diaktifkan di penyimpanan internal. Perangkat yang diluncurkan dengan Android 11 atau yang lebih tinggi harus mengaktifkan enkripsi metadata pada penyimpanan internal.
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. Akibatnya, 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 yang lebih tinggi,
dm-default-key
didukung oleh kernel umum Android, versi
4.14 dan yang lebih tinggi. Versi dm-default-key
ini menggunakan framework enkripsi hardware dan
vendor independen 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 dalam perjalanan ke/dari perangkat penyimpanan) jika
tersedia. Jika tidak menggunakan hardware enkripsi inline, Anda
juga perlu mengaktifkan penggantian ke API kriptografi kernel:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
Jika tidak menggunakan hardware enkripsi inline, Anda juga harus mengaktifkan akselerasi berbasis CPU yang tersedia seperti yang direkomendasikan dalam dokumentasi FBE.
Di Android 10 dan yang lebih lama, 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 yang dapat dibaca dalam partisi data pengguna hingga kunci enkripsi metadata ada, tabel partisi harus menyisihkan partisi terpisah yang disebut "partisi metadata" untuk menyimpan blob keymaster yang 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 memastikan bahwa partisi tersebut diformat pada waktu booting. 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
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 init mencoba memasang
/data
.
init.hardware.rc
seharusnya sudah berisi petunjuk mount_all
yang memasang /data
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 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 diganti dengan menetapkan
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 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 baru, terlepas dari level API pengiriman:
PRODUCT_PROPERTY_OVERRIDES += \ ro.crypto.dm_default_key.options_format.version=2
Validasi
Untuk memastikan bahwa enkripsi metadata telah diaktifkan dan berfungsi dengan benar, jalankan pengujian yang dijelaskan di bawah ini. Selain itu, perhatikan 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
.
Selanjutnya, jalankan vts_kernel_encryption_test untuk memverifikasi ketepatan 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
yang dienkripsi
metadata, init
akan menjalankan alat vdc. Alat vdc
terhubung ke vold
melalui binder
untuk menyiapkan
perangkat yang dienkripsi 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
diblokir secara langsung atau
tidak langsung saat membaca atau menetapkan properti, deadlock akan terjadi. Penting
untuk 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
akan merespons vold
hingga telah membaca properti tertentu dari
init
, yang menghasilkan deadlock 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 deadlock ini.
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
yang dapat diadopsi: yang tidak digunakan lagi berdasarkan dm-crypt
, dan yang lebih baru berdasarkan
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 baru (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 di penyimpanan yang dapat diadopsi menggunakan modul kernel dm-default-key
, seperti pada penyimpanan internal. Lihat prasyarat di atas untuk mengetahui opsi konfigurasi kernel
yang akan diaktifkan. 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. Algoritma
dapat diganti dengan menetapkan
properti sistem ro.crypto.volume.metadata.encryption
. Nilai properti ini memiliki sintaksis yang sama dengan opsi fstab metadata_encryption
yang dijelaskan di atas. Misalnya, pada perangkat yang tidak memiliki akselerasi
AES, enkripsi Adiantum
dapat diaktifkan dengan menetapkan
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
Tidak seperti 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 sasaran keamanan enkripsi metadata, karena Android
memastikan bahwa kunci FBE setidaknya sama sulitnya untuk disusupi seperti kunci enkripsi
metadata. Vendor dapat membuat penyesuaian kernel untuk menghindari enkripsi
ganda, khususnya dengan menerapkan
opsi allow_encrypt_override
yang diteruskan Android ke
dm-crypt
saat properti sistem
ro.crypto.allow_encrypt_override
ditetapkan 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. Hal ini
dapat diganti dengan menyetel 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.