การบูตที่ยืนยันแล้วกำหนดให้ต้องยืนยันโค้ดและข้อมูลที่เรียกใช้ได้ทั้งหมดที่เข้ารหัส ซึ่งเป็นส่วนหนึ่งในเวอร์ชัน Android ที่จะบูตก่อนใช้งาน ซึ่งรวมถึงเคอร์เนล (โหลดจากพาร์ติชัน boot
), ต้นไม้อุปกรณ์ (โหลดจากพาร์ติชัน dtbo
), พาร์ติชัน system
, พาร์ติชัน vendor
และอื่นๆ
โดยปกติแล้ว พาร์ติชันขนาดเล็ก เช่น boot
และ dtbo
ที่อ่านเพียงครั้งเดียวจะได้รับการยืนยันโดยการโหลดเนื้อหาทั้งหมดลงในหน่วยความจำ แล้วคำนวณแฮช จากนั้นระบบจะเปรียบเทียบค่าแฮชที่คำนวณนี้กับค่าแฮชที่คาดไว้ หากค่าไม่ตรงกัน Android จะไม่โหลด
โปรดดูรายละเอียดเพิ่มเติมที่ขั้นตอนการบูต
พาร์ติชันขนาดใหญ่ที่หน่วยความจําไม่รองรับ (เช่น ระบบไฟล์) อาจใช้ต้นไม้แฮชที่การยืนยันเป็นกระบวนการต่อเนื่องที่เกิดขึ้นขณะที่โหลดข้อมูลลงในหน่วยความจํา ในกรณีนี้ ระบบจะคํานวณแฮชรูทของต้นไม้แฮชระหว่างรันไทม์และตรวจสอบกับค่าแฮชรูทที่คาดหวัง Android มีไดรเวอร์ dm-verity เพื่อยืนยันพาร์ติชันขนาดใหญ่ หากแฮชรูทที่คำนวณแล้วไม่ตรงกับค่าแฮชรูทที่คาดไว้ ระบบจะไม่ใช้ข้อมูลนั้นและ Android จะเข้าสู่สถานะข้อผิดพลาด โปรดดูรายละเอียดเพิ่มเติมที่ dm-verity corruption
โดยปกติแล้ว แฮชที่คาดไว้จะจัดเก็บไว้ที่ส่วนท้ายหรือส่วนต้นของพาร์ติชันที่ยืนยันแล้วแต่ละพาร์ติชัน ในพาร์ติชันเฉพาะ หรือทั้ง 2 อย่าง สิ่งสำคัญคือแฮชเหล่านี้ได้รับการลงนาม (โดยตรงหรือโดยอ้อม) โดยรูทของความน่าเชื่อถือ ตัวอย่างเช่น การใช้งาน AVB รองรับทั้ง 2 แนวทาง โปรดดูรายละเอียดที่การบูตที่ยืนยันแล้วของ Android
การป้องกันการย้อนกลับ
แม้ว่าจะมีกระบวนการอัปเดตที่ปลอดภัยอย่างสมบูรณ์ แต่ช่องโหว่ในเคอร์เนล Android ที่ไม่ถาวรก็อาจติดตั้ง Android เวอร์ชันเก่าที่มีช่องโหว่มากขึ้นด้วยตนเอง รีบูตเป็นเวอร์ชันที่มีช่องโหว่ แล้วใช้ Android เวอร์ชันนั้นเพื่อติดตั้งช่องโหว่ถาวร จากนั้นผู้โจมตีจะเป็นเจ้าของอุปกรณ์อย่างถาวรและทำสิ่งต่างๆ ได้ทั้งหมด รวมถึงปิดใช้การอัปเดต
การป้องกันการโจมตีประเภทนี้เรียกว่าการป้องกันการย้อนกลับ โดยปกติแล้วการป้องกันการย้อนกลับจะใช้พื้นที่เก็บข้อมูลที่ตรวจจับการดัดแปลงได้เพื่อบันทึก Android เวอร์ชันล่าสุดและปฏิเสธการบูต Android หากเวอร์ชันต่ำกว่าเวอร์ชันที่บันทึกไว้ โดยปกติแล้ว ระบบจะติดตามเวอร์ชันตามแต่ละพาร์ติชัน
ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีที่ AVB จัดการการป้องกันการย้อนกลับได้ใน AVB README
จัดการข้อผิดพลาดในการยืนยัน
การยืนยันอาจไม่สำเร็จเมื่อบูต (เช่น หากแฮชที่คำนวณในพาร์ติชัน boot
ไม่ตรงกับแฮชที่คาดไว้) หรือเมื่อรันไทม์ (เช่น หาก dm-verity พบข้อผิดพลาดในการยืนยันในพาร์ติชัน boot
)system
หากการยืนยันไม่สำเร็จเมื่อทำการบูต อุปกรณ์จะบูตไม่ได้ และผู้ใช้ปลายทางจะต้องทำตามขั้นตอนต่างๆ เพื่อกู้คืนอุปกรณ์
หากการยืนยันไม่สำเร็จเมื่อรันไทม์ ขั้นตอนจะซับซ้อนขึ้นเล็กน้อย หากอุปกรณ์ใช้ dm-verity ก็ควรกำหนดค่าในโหมด restart
ในโหมด restart
หากพบข้อผิดพลาดในการยืนยัน ระบบจะรีสตาร์ทอุปกรณ์ทันทีโดยตั้งค่า Flag ที่เฉพาะเจาะจงเพื่อระบุเหตุผล บูตโหลดเดอร์ควรสังเกตเห็น Flag นี้และเปลี่ยน dm-verity ไปใช้โหมดข้อผิดพลาด I/O (eio
) และอยู่ในโหมดนี้จนกว่าจะมีการอัปเดตใหม่
เมื่อบูตในโหมด eio
อุปกรณ์จะแสดงหน้าจอข้อผิดพลาดเพื่อแจ้งให้ผู้ใช้ทราบว่าตรวจพบความเสียหายและอุปกรณ์อาจทำงานไม่ถูกต้อง หน้าจอจะแสดงจนกว่าผู้ใช้จะปิด ในโหมด eio
ไดรเวอร์ dm-verity จะไม่รีสตาร์ทอุปกรณ์หากพบข้อผิดพลาดในการยืนยัน แต่ระบบจะแสดงข้อผิดพลาด EIO แทน และแอปจะต้องจัดการกับข้อผิดพลาดดังกล่าว
เป้าหมายคือเพื่อให้โปรแกรมอัปเดตระบบทำงาน (เพื่อให้ติดตั้งระบบปฏิบัติการใหม่ได้โดยไม่มีข้อผิดพลาดจากการเสียหาย) หรือเพื่อให้ผู้ใช้สามารถดึงข้อมูลออกจากอุปกรณ์ให้ได้มากที่สุด เมื่อติดตั้งระบบปฏิบัติการใหม่แล้ว โปรแกรมโหลดบูตจะตรวจพบระบบปฏิบัติการที่ติดตั้งใหม่และเปลี่ยนกลับไปเป็นโหมด restart