Saya mengutip dari Manual Android di sini , tetapi:
CATATAN:
Sumber yang saya gunakan tidak secara langsung relevan dengan Marshmallow tetapi relevan untuk Lollipop dan lebih tinggi.
TL: DR
Saya hanya akan menjawab pertanyaan OP sekarang. Rincian teknis akan mengikuti.
Kunci enkripsi default berasal dari sumber perangkat keras (chip yang mirip dengan TPM) dan kata sandi standar AOSP didefinisikan seperti default_password
dalam cryptfs.c
file sumber, lihat di bawah.
Ya, bukan hanya default, tetapi kata sandi apa pun dibuat menjadi kunci dan disimpan pada chip mirip TPM, disebut TEE (kependekan dari "Lingkungan Eksekusi Tepercaya", lihat di bawah untuk perincian lebih lanjut).
Seorang hacker dengan akses UART / JTAG ke chip pada SoC perangkat secara teknis bisa mendapatkan akses ke kunci TEE, atau kernel kustom dapat membocorkan informasi ini ke seorang hacker. Beberapa agensi 3 huruf dalam teori konspirasi mungkin dapat bermitra dengan OEM untuk mendapatkan kernel yang tidak aman ini digunakan dalam perangkat produksi, tapi saya tidak akan meletakkan banyak toko olehnya. Sekali lagi, lihat bagian terakhir dari jawaban ini untuk perincian lebih lanjut.
Satu-satunya hal yang menghentikan seorang hacker dari mendapatkan akses ke kunci adalah banyaknya upaya yang diperlukan untuk melakukannya.
- Memeriksa hash of (checksumming) firmware (disebut "Boot Terverifikasi" oleh Google) sebenarnya dilakukan pada dan di atas Lollipop secara default (dan tersedia dari JellyBean 4.3 dan seterusnya), oleh modul kernel yang disebut
dm-verity
. Namun, ini tidak tergantung pada status enkripsi.
Sumber: panduan keamanan AOSP di sini .
- Tentang proses yang terlibat dalam mendekripsi sistem dengan kata sandi khusus, lihat di bawah. Saya hanya akan memberi tahu Anda di sini bahwa kata sandi pengguna terlibat dalam pembuatan dan penggunaan kunci enkripsi.
Gambaran
Saat boot pertama, perangkat membuat kunci master 128-bit yang dihasilkan secara acak dan kemudian mem-hash-nya dengan kata sandi default dan garam yang disimpan. Kata sandi default adalah: "default_password" Namun, hash yang dihasilkan juga masuk melalui TEE (seperti TrustZone), yang menggunakan hash tanda tangan untuk mengenkripsi kunci master.
Anda dapat menemukan kata sandi default yang ditentukan dalam file cryptfs.c Android Open Source Project .
Ketika pengguna menetapkan PIN / pass atau kata sandi pada perangkat, hanya kunci 128-bit yang dienkripsi ulang dan disimpan. (mis. perubahan PIN / pass / pola pengguna TIDAK menyebabkan enkripsi ulang partisi data pengguna.)
Mulai perangkat terenkripsi dengan enkripsi default
Inilah yang terjadi ketika Anda mem-boot perangkat terenkripsi tanpa kata sandi. Karena perangkat Android 5.0 dienkripsi pada boot pertama, seharusnya tidak ada kata sandi yang ditetapkan dan oleh karena itu ini adalah status enkripsi default.
- Mendeteksi data terenkripsi / tanpa kata sandi
Mendeteksi bahwa perangkat Android dienkripsi karena / data tidak dapat dipasang dan salah satu dari bendera encryptable
atau forceencrypt
diatur.
vold
diatur vold.decrypt
ke trigger_default_encryption
, yang memulai defaultcrypto
layanan. trigger_default_encryption
memeriksa jenis enkripsi untuk melihat apakah / data dienkripsi dengan atau tanpa kata sandi.
- Dekripsi / data
Membuat dm-crypt
perangkat melalui perangkat blok sehingga perangkat siap digunakan.
- Mount / data
vold
kemudian me-mount partisi real / data yang didekripsi dan kemudian menyiapkan partisi baru. Ini set properti vold.post_fs_data_done
untuk 0
dan kemudian menetapkan vold.decrypt
untuk trigger_post_fs_data
. Ini menyebabkan init.rc
menjalankan post-fs-data
perintahnya. Mereka akan membuat direktori atau tautan yang diperlukan dan kemudian diatur vold.post_fs_data_done
ke 1
.
Setelah vold
melihat 1 di properti itu, ia menetapkan properti vold.decrypt
ke: trigger_restart_framework
. Ini menyebabkan init.rc
untuk memulai layanan di kelas main
lagi dan juga memulai layanan di kelas late_start untuk pertama kalinya sejak boot.
- Mulai kerangka kerja
Sekarang framework mem-boot semua layanannya menggunakan dekripsi / data, dan sistem siap digunakan.
Memulai perangkat terenkripsi tanpa enkripsi default
Inilah yang terjadi ketika Anda mem-boot perangkat terenkripsi yang memiliki kata sandi yang ditetapkan. Kata sandi perangkat dapat berupa pin, pola, atau kata sandi.
- Mendeteksi perangkat terenkripsi dengan kata sandi
Mendeteksi bahwa perangkat Android dienkripsi karena bendera ro.crypto.state = "encrypted"
vold
setel vold.decrypt
ke trigger_restart_min_framework
karena / data dienkripsi dengan kata sandi.
- Pasang tmpfs
init
set lima properti untuk menyimpan opsi mount awal yang diberikan untuk / data dengan parameter yang dilewati init.rc
. vold
menggunakan properti ini untuk mengatur pemetaan crypto:
ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags
(ASCII 8 digit angka hex didahului dengan 0x)
- Mulai kerangka kerja untuk meminta kata sandi
Kerangka kerja dimulai dan melihat yang vold.decrypt
diatur ke trigger_restart_min_framework
. Ini memberitahu kerangka kerja bahwa itu boot pada tmpfs /data
disk dan perlu mendapatkan kata sandi pengguna.
Pertama, bagaimanapun, perlu memastikan bahwa disk itu dienkripsi dengan benar. Ini mengirimkan perintah cryptfs cryptocomplete
ke vold
. vold
mengembalikan 0 jika enkripsi berhasil diselesaikan, -1 pada kesalahan internal, atau -2 jika enkripsi tidak berhasil diselesaikan. vold
menentukan ini dengan melihat metadata crypto untuk CRYPTO_ENCRYPTION_IN_PROGRESS
bendera. Jika disetel, proses enkripsi terputus, dan tidak ada data yang dapat digunakan di perangkat.
Jika vold
mengembalikan kesalahan, UI harus menampilkan pesan kepada pengguna untuk reboot dan mengatur ulang perangkat, dan memberi pengguna tombol untuk menekan untuk melakukannya.
- Dekripsi data dengan kata sandi
Setelah cryptfs cryptocomplete
berhasil, kerangka kerja menampilkan UI yang menanyakan kata sandi disk. UI memeriksa kata sandi dengan mengirimkan perintah cryptfs checkpw
ke vold
. Jika kata sandi itu benar (yang ditentukan dengan berhasil memasang yang didekripsi /data
di lokasi sementara, lalu melepaskannya), vold menyimpan nama perangkat blok yang didekripsi di properti ro.crypto.fs_crypto_blkdev
dan mengembalikan status 0 ke UI. Jika kata sandi salah, ia mengembalikan -1 ke UI.
- Hentikan kerangka kerja
UI memasang grafik booting crypto dan kemudian memanggil vold dengan perintah cryptfs restart
. vold
set properti vold.decrypt
ke trigger_reset_main
, yang menyebabkan init.rc
harus dilakukan class_reset main
. Ini menghentikan semua layanan di main
kelas, yang memungkinkan tmpfs /data
untuk di-unmount.
- Mount / data
vold
lalu pasang /data
partisi nyata yang didekripsi dan menyiapkan partisi baru (yang mungkin tidak pernah disiapkan jika dienkripsi dengan opsi penghapusan, yang tidak didukung pada rilis pertama). Ini set properti vold.post_fs_data_done
untuk 0
dan kemudian menetapkan vold.decrypt
untuk trigger_post_fs_data
. Ini menyebabkan init.rc
menjalankannya post-fs-data commands
. Mereka akan membuat direktori atau tautan yang diperlukan dan kemudian diatur vold.post_fs_data_done
ke 1
. Setelah vold
melihat 1
di properti itu, ia menetapkan properti vold.decrypt
untuk trigger_restart_framework
. Ini menyebabkan init.rc
untuk memulai layanan di kelas main
lagi dan juga memulai layanan di kelas late_start
untuk pertama kalinya sejak boot.
- Mulai kerangka kerja penuh
Sekarang framework mem-boot semua layanannya menggunakan sistem file decrypted / data, dan sistem siap digunakan.
Menyimpan kunci terenkripsi
Kunci terenkripsi disimpan dalam metadata crypto. Dukungan perangkat keras diimplementasikan dengan menggunakan kemampuan penandatanganan TEE (Trusted Execution Environment). Sebelumnya, kami mengenkripsi kunci master dengan kunci yang dibuat dengan menerapkan scrypt
kata sandi pengguna dan garam yang disimpan.
Untuk membuat kunci ini tahan terhadap serangan off-box, kami memperluas algoritma ini dengan menandatangani kunci yang dihasilkan dengan kunci TEE yang tersimpan. Tanda tangan yang dihasilkan kemudian diubah menjadi kunci panjang yang sesuai oleh satu aplikasi lagi scrypt
. Kunci ini kemudian digunakan untuk mengenkripsi dan mendekripsi kunci master. Untuk menyimpan kunci ini:
- Menghasilkan kunci enkripsi disk 16-byte acak (DEK) dan garam 16-byte.
- Berlaku
scrypt
untuk kata sandi pengguna dan garam untuk menghasilkan kunci menengah 32-byte 1 (IK1).
- Pad IK1 dengan nol byte dengan ukuran kunci pribadi yang terikat perangkat keras (HBK). Secara khusus, kami mengisi sebagai: 00 || IK1 || 00.00; satu nol byte, 32 IK1 byte, 223 nol byte.
- Masuk IK1 empuk dengan HBK untuk menghasilkan 256 byte IK2.
- Berlaku
scrypt
untuk IK2 dan garam (garam yang sama seperti langkah 2) untuk menghasilkan IK3 32-byte.
- Gunakan 16 byte pertama IK3 sebagai KEK dan 16 byte terakhir sebagai IV.
- Enkripsi DEK dengan AES_CBC, dengan kunci KEK, dan inisialisasi vektor IV.