Boot terverifikasi memerlukan verifikasi kriptografis semua kode dan data yang dapat dieksekusi yang merupakan bagian dari versi Android yang di-boot sebelum digunakan. Ini termasuk kernel (dimuat dari partisi boot
), pohon perangkat (dimuat dari partisi dtbo
), partisi system
, partisi vendor
, dan sebagainya.
Partisi kecil, seperti boot
dan dtbo
, yang hanya dibaca sekali biasanya diverifikasi dengan memuat seluruh konten ke dalam memori dan kemudian menghitung hashnya. Nilai hash yang dihitung ini kemudian dibandingkan dengan nilai hash yang diharapkan . Jika nilainya tidak cocok, Android tidak akan dimuat. Untuk detail selengkapnya, lihat Alur Booting .
Partisi yang lebih besar yang tidak muat ke dalam memori (seperti, sistem file) dapat menggunakan pohon hash di mana verifikasi adalah proses berkelanjutan yang terjadi saat data dimuat ke dalam memori. Dalam hal ini, hash root dari pohon hash dihitung selama waktu berjalan dan diperiksa terhadap nilai hash root yang diharapkan . Android menyertakan driver dm-verity untuk memverifikasi partisi yang lebih besar. Jika pada titik tertentu hash root yang dihitung tidak sesuai dengan nilai hash root yang diharapkan , data tidak digunakan dan Android memasuki status kesalahan. Untuk detail lebih lanjut, lihat korupsi dm-verity .
Hash yang diharapkan biasanya disimpan di akhir atau awal setiap partisi yang diverifikasi, di partisi khusus, atau keduanya. Yang terpenting, hash ini ditandatangani (baik secara langsung maupun tidak langsung) oleh akar kepercayaan. Sebagai contoh, implementasi AVB mendukung kedua pendekatan tersebut, lihat Android Verified Boot untuk detailnya.
Perlindungan rollback
Bahkan dengan proses pembaruan yang benar-benar aman, eksploitasi kernel Android yang tidak persisten dimungkinkan untuk menginstal versi Android yang lebih lama dan lebih rentan secara manual, mem-boot ulang ke versi yang rentan, dan kemudian menggunakan versi Android tersebut untuk menginstal eksploit yang persisten. Dari sana penyerang memiliki perangkat secara permanen dan dapat melakukan apa saja, termasuk menonaktifkan pembaruan.
Perlindungan terhadap serangan kelas ini disebut Rollback Protection . Perlindungan rollback biasanya diimplementasikan dengan menggunakan penyimpanan yang dapat dirusak untuk merekam versi terbaru Android dan menolak untuk mem-boot Android jika lebih rendah dari versi yang direkam. Versi biasanya dilacak pada basis per-partisi.
Untuk detail selengkapnya tentang cara AVB menangani proteksi rollback, lihat AVB README .
Menangani kesalahan verifikasi
Verifikasi dapat gagal saat boot (seperti, jika hash yang dihitung pada partisi boot
tidak cocok dengan hash yang diharapkan) atau saat dijalankan (seperti, jika dm-verity menemukan kesalahan verifikasi pada partisi system
). Jika verifikasi gagal saat boot, perangkat tidak dapat boot dan pengguna akhir harus melalui langkah-langkah untuk memulihkan perangkat.
Jika verifikasi gagal saat run-time, alurnya sedikit lebih rumit. Jika perangkat menggunakan dm-verity, perangkat harus dikonfigurasi dalam mode mulai restart
. Dalam mode mulai restart
, jika terjadi kesalahan verifikasi, perangkat segera dimulai ulang dengan tanda tertentu yang disetel untuk menunjukkan alasannya. Pemuat boot harus memperhatikan tanda ini dan mengalihkan dm-verity untuk menggunakan mode Kesalahan I/O ( eio
) dan tetap dalam mode ini hingga pembaruan baru telah diinstal.
Saat boot dalam mode eio
, perangkat menampilkan layar kesalahan yang memberi tahu pengguna bahwa kerusakan telah terdeteksi dan perangkat mungkin tidak berfungsi dengan benar. Layar ditampilkan sampai pengguna mengabaikannya. Dalam mode eio
, driver dm-verity tidak akan memulai ulang perangkat jika terjadi kesalahan verifikasi, sebaliknya kesalahan EIO dikembalikan dan aplikasi perlu menangani kesalahan tersebut.
Tujuannya adalah agar pembaru sistem akan berjalan (sehingga OS baru tanpa kesalahan korupsi dapat diinstal) atau pengguna dapat mengambil data mereka sebanyak mungkin dari perangkat. Setelah OS baru telah diinstal, boot loader memperhatikan OS yang baru diinstal dan beralih kembali ke mode restart
.