Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Enkripsi Metadata

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 ekuivalen metadata_encryption=:wrappedkey_v0 , sebagai aes-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 adalah aes-128-cbc dan adiantum . 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.