Enkripsi Metadata

Android 7.0 dan yang lebih tinggi mendukung enkripsi berbasis file (FBE). FBE memungkinkan file yang berbeda dienkripsi dengan kunci berbeda yang dapat dibuka mereka dapat bekerja secara mandiri. Kunci ini digunakan untuk mengenkripsi isi file dan nama file. Ketika FBE digunakan, informasi lainnya, seperti tata letak direktori, ukuran file, izin, dan waktu pembuatan/perubahan, tidak dienkripsi. Secara kolektif, informasi lain ini dikenal sebagai {i>metadata <i}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.

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 disiapkan ketika 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 dalam perjalanan ke/dari perangkat penyimpanan) saat yang tersedia. Jika Anda tidak akan 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 {i> kernel<i} umum Android. Oleh karena itu, terserah vendor untuk 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 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 memastikan bahwa proses itu dimulai cukup awal, tambahkan stanza berikut untuk 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 harus sudah berisi mount_all instruksi 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

Mengaktifkan 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. Hal ini dapat diganti dengan menetapkan metadata_encryption, juga di Kolom fs_mgr_flags:

  • Pada perangkat yang tidak memiliki akselerasi AES, enkripsi Adiantum mungkin diaktifkan dengan menyetel metadata_encryption=adiantum.
  • Pada perangkat yang mendukung tombol yang digabungkan dengan hardware, kunci enkripsi metadata dapat dibuat yang dibungkus perangkat keras dengan mengatur metadata_encryption=aes-256-xts:wrappedkey_v0 (atau yang setara dengan metadata_encryption=:wrappedkey_v0, seperti aes-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 diluncurkan dengan Android 11 (level API 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 memastikan bahwa enkripsi metadata telah diaktifkan dan berfungsi dengan benar, jalankan pengujian yang dijelaskan di bawah ini. Perhatikan juga kesalahan masalah yang dijelaskan di bawah ini.

Pengujian

Mulailah dengan menjalankan perintah berikut untuk memverifikasi bahwa enkripsi metadata telah 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 menyetel atribut metadata_encryption di fstab perangkat, lalu {i>output-<i}nya akan sedikit berbeda dari yang di atas. Misalnya, jika Anda mengaktifkan enkripsi Adiantum, akan menjadi 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, init diblokir, dan mencoba membaca atau menyetel init properti akan diblokir hingga mount_all selesai. Jika, pada tahap ini, setiap bagian dari pekerjaan vold secara langsung atau diblokir secara tidak langsung saat membaca atau menyetel properti, akan menyebabkan deadlock. Penting untuk memastikan bahwa vold dapat menyelesaikan tugas membaca kunci, berinteraksi dengan Keymaster, dan memasang direktori data tanpa yang berinteraksi lebih lanjut dengan init.

Jika Keymaster tidak sepenuhnya dimulai saat mount_all berjalan, Keymaster tidak akan respons vold hingga membaca properti tertentu dari init, yang mengakibatkan 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, suatu bentuk enkripsi metadata selalu diaktifkan di penyimpanan yang dapat diadopsi setiap kali FBE diaktifkan, meskipun enkripsi metadata tidak diaktifkan dan 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 bahwa penerapan yang benar untuk perangkat, pastikan Anda telah menyetel nilai yang benar untuk PRODUCT_SHIPPING_API_LEVEL dalam device.mk. Misalnya, jika perangkat 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 pada penyimpanan internal perangkat mungkin tidak tersedia di penyimpanan yang dapat diadopsi, sehingga CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y mungkin wajib diisi.

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

Di perangkat yang diluncurkan dengan Android 10 atau yang lebih rendah, metadata enkripsi pada penyimpanan yang dapat diadopsi menggunakan modul kernel dm-crypt dan 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 opsi yang akan 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 akan menggunakan Algoritma enkripsi AES-128-CBC dengan sektor kripto ESSIV dan 512 byte. Ini dapat diganti dengan mengatur properti sistem berikut (yang juga digunakan untuk FDE):

  • ro.crypto.fde_algorithm memilih enkripsi metadata algoritme. 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.