Saya baru saja menginstal Marshmallow pada Nexus 5 melalui pembaruan yang didorong. Saya bingung tentang cara enkripsi bekerja. Saya memiliki pengetahuan teknis enkripsi yang baik di komputer. Saya ingin mendapatkan pengetahuan serupa tentang Android 6.
Berikut ini adalah apa yang saya lakukan dan bagaimana saya menjadi bingung. Setelah reset pabrik, saya mengatur PIN kemudian mengenkripsi perangkat. Saat boot, ia meminta PIN saya, yang diharapkan. Saya kemudian menghapus PIN dan memulai kembali perangkat. Itu tidak meminta PIN apa pun saat boot tetapi perangkat masih melaporkan dirinya sebagai terenkripsi dalam menu pengaturan. Yang terakhir inilah yang membingungkan saya karena saya mengharapkan PIN untuk membuka kunci kunci dekripsi.
Pertanyaan:
- Dalam hal enkripsi tanpa PIN, dari mana kunci dekripsi berasal? Saya menganggap itu disimpan pada chip yang mirip dengan TPM, apakah ini benar? Jika demikian, apa yang mencegah seorang hacker meminta kunci ini dari chip? Apakah itu memeriksa hash firmware? Ada yang lain? Detail teknis akan sangat dihargai.
- Dalam hal enkripsi dengan PIN, apakah PIN digunakan sebagai token tambahan untuk mengakses kunci dekripsi? Atau apakah proses dekripsi bekerja persis seperti jika tidak ada PIN.
TL; DL jawaban:
Kunci dekripsi dibuka dengan semua hal berikut:
- PIN (atau kata sandi, dll.) Atau kata sandi standar jika tidak ada
- TEE (generator tanda tangan yang didukung perangkat keras yang menggunakan kunci yang tidak dapat diekstraksi)
- Garam (tersedia tetapi mencegah serangan tabel pelangi)
sumber
Jawaban:
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
dalamcryptfs.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.
dm-verity
. Namun, ini tidak tergantung pada status enkripsi.Sumber: panduan keamanan AOSP di sini .
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 bahwa perangkat Android dienkripsi karena / data tidak dapat dipasang dan salah satu dari bendera
encryptable
atauforceencrypt
diatur.vold
diaturvold.decrypt
ketrigger_default_encryption
, yang memulaidefaultcrypto
layanan.trigger_default_encryption
memeriksa jenis enkripsi untuk melihat apakah / data dienkripsi dengan atau tanpa kata sandi.Membuat
dm-crypt
perangkat melalui perangkat blok sehingga perangkat siap digunakan.vold
kemudian me-mount partisi real / data yang didekripsi dan kemudian menyiapkan partisi baru. Ini set propertivold.post_fs_data_done
untuk0
dan kemudian menetapkanvold.decrypt
untuktrigger_post_fs_data
. Ini menyebabkaninit.rc
menjalankanpost-fs-data
perintahnya. Mereka akan membuat direktori atau tautan yang diperlukan dan kemudian diaturvold.post_fs_data_done
ke1
.Setelah
vold
melihat 1 di properti itu, ia menetapkan propertivold.decrypt
ke:trigger_restart_framework
. Ini menyebabkaninit.rc
untuk memulai layanan di kelasmain
lagi dan juga memulai layanan di kelas late_start untuk pertama kalinya sejak boot.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 bahwa perangkat Android dienkripsi karena bendera
ro.crypto.state = "encrypted"
vold
setelvold.decrypt
ketrigger_restart_min_framework
karena / data dienkripsi dengan kata sandi.init
set lima properti untuk menyimpan opsi mount awal yang diberikan untuk / data dengan parameter yang dilewatiinit.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)Kerangka kerja dimulai dan melihat yang
vold.decrypt
diatur ketrigger_restart_min_framework
. Ini memberitahu kerangka kerja bahwa itu boot padatmpfs /data
disk dan perlu mendapatkan kata sandi pengguna.Pertama, bagaimanapun, perlu memastikan bahwa disk itu dienkripsi dengan benar. Ini mengirimkan perintah
cryptfs cryptocomplete
kevold
.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 untukCRYPTO_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.Setelah
cryptfs cryptocomplete
berhasil, kerangka kerja menampilkan UI yang menanyakan kata sandi disk. UI memeriksa kata sandi dengan mengirimkan perintahcryptfs checkpw
kevold
. 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 propertiro.crypto.fs_crypto_blkdev
dan mengembalikan status 0 ke UI. Jika kata sandi salah, ia mengembalikan -1 ke UI.UI memasang grafik booting crypto dan kemudian memanggil vold dengan perintah
cryptfs restart
.vold
set propertivold.decrypt
ketrigger_reset_main
, yang menyebabkaninit.rc
harus dilakukanclass_reset main
. Ini menghentikan semua layanan dimain
kelas, yang memungkinkantmpfs /data
untuk di-unmount.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 propertivold.post_fs_data_done
untuk0
dan kemudian menetapkanvold.decrypt
untuktrigger_post_fs_data
. Ini menyebabkaninit.rc
menjalankannyapost-fs-data commands
. Mereka akan membuat direktori atau tautan yang diperlukan dan kemudian diaturvold.post_fs_data_done
ke1
. Setelahvold
melihat1
di properti itu, ia menetapkan propertivold.decrypt
untuktrigger_restart_framework
. Ini menyebabkaninit.rc
untuk memulai layanan di kelasmain
lagi dan juga memulai layanan di kelaslate_start
untuk pertama kalinya sejak boot.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:scrypt
untuk kata sandi pengguna dan garam untuk menghasilkan kunci menengah 32-byte 1 (IK1).scrypt
untuk IK2 dan garam (garam yang sama seperti langkah 2) untuk menghasilkan IK3 32-byte.sumber