การล็อค/ปลดล็อค Bootloader

ตามค่าเริ่มต้น อุปกรณ์ Android ส่วนใหญ่จัดส่งมาพร้อมกับ Bootloader ที่ล็อคไว้ ซึ่งหมายความว่าผู้ใช้ไม่สามารถแฟลช Bootloader หรือพาร์ติชันอุปกรณ์ได้ หากจำเป็น คุณ (และผู้ใช้อุปกรณ์ที่เปิดใช้งานตัวเลือกสำหรับนักพัฒนา) สามารถปลดล็อกโปรแกรมโหลดบูตเพื่อแฟลชอิมเมจใหม่ได้

เข้าสู่โปรแกรมโหลดบูต

หากต้องการออกคำสั่ง fastboot คุณต้องอยู่ในโหมด bootloader วิธีหนึ่งในการทำเช่นนี้คือการส่งคำสั่ง adb adb reboot bootloader โทรศัพท์บางรุ่นยังอนุญาตให้คุณรีบูตเข้าสู่ bootloader ได้โดยการกดคีย์ผสม (โดยทั่วไปคือการลดระดับเสียง) ขณะบู๊ตอุปกรณ์

การปลดล็อคบูตโหลดเดอร์

เมื่ออยู่ในโหมด bootloader เพื่อปลดล็อก bootloader และเปิดใช้งานพาร์ติชันที่จะ reflash ให้รันคำสั่ง fastboot flashing unlock บนอุปกรณ์ หลังจากตั้งค่าแล้ว โหมดปลดล็อคจะคงอยู่ตลอดการรีบูต

อุปกรณ์ควรปฏิเสธคำสั่ง fastboot flashing unlock เว้นแต่ว่า get_unlock_ability จะถูกตั้งค่าเป็น 1 หากตั้งค่าเป็น 0 ผู้ใช้จะต้องบูตไปที่หน้าจอหลัก เปิดเมนู การตั้งค่า > ระบบ > ตัวเลือกนักพัฒนา และเปิดใช้งานตัวเลือก การปลดล็อค OEM (ซึ่งตั้งค่า get_unlock_ability เป็น 1 ) หลังจากตั้งค่าแล้ว โหมดนี้จะคงอยู่ตลอดทั้งการรีบูตและการรีเซ็ตข้อมูลเป็นค่าเริ่มต้น

เมื่อมีการส่งคำสั่ง fastboot flashing unlock อุปกรณ์ควรแจ้งให้ผู้ใช้เตือนว่าอาจประสบปัญหากับภาพที่ไม่เป็นทางการ หลังจากที่ผู้ใช้รับทราบคำเตือนแล้ว อุปกรณ์ควรรีเซ็ตข้อมูลเป็นค่าเริ่มต้นเพื่อป้องกันการเข้าถึงข้อมูลที่ไม่ได้รับอนุญาต โปรแกรมโหลดบูตควรรีเซ็ตอุปกรณ์แม้ว่าจะไม่สามารถฟอร์แมตใหม่ได้อย่างถูกต้องก็ตาม หลังจากรีเซ็ตแล้วเท่านั้นจึงจะตั้งค่าสถานะถาวรเพื่อให้สามารถแฟลชอุปกรณ์ได้

ควรรีเซ็ต RAM ทั้งหมดที่ยังไม่ได้เขียนทับในระหว่างกระบวนการ fastboot flashing unlock มาตรการนี้จะป้องกันการโจมตีที่อ่านเนื้อหา RAM ที่เหลือจากการบูตครั้งก่อน ในทำนองเดียวกัน อุปกรณ์ที่ปลดล็อคควรล้าง RAM ทุกครั้งที่บูต (เว้นแต่ว่าสิ่งนี้จะสร้างความล่าช้าที่ยอมรับไม่ได้) แต่ควรปล่อยให้พื้นที่ที่ใช้สำหรับ ramoops ของเคอร์เนล

กำลังล็อคบูตโหลดเดอร์

หากต้องการล็อค bootloader และรีเซ็ตอุปกรณ์ ให้รันคำสั่ง fastboot flashing lock บนอุปกรณ์ อุปกรณ์ที่มีไว้สำหรับการขายปลีกควรจัดส่งในสถานะล็อค (โดยที่ get_unlock_ability ส่งกลับ 0 ) เพื่อให้แน่ใจว่าผู้โจมตีไม่สามารถประนีประนอมอุปกรณ์โดยการติดตั้งระบบหรืออิมเมจสำหรับบูตใหม่

การตั้งค่าคุณสมบัติการล็อค/ปลดล็อค

ควรตั้งค่าคุณสมบัติ ro.oem_unlock_supported ณ เวลาสร้าง โดยขึ้นอยู่กับว่าอุปกรณ์รองรับการปลดล็อคแบบกะพริบหรือไม่

  • หากอุปกรณ์รองรับการปลดล็อคแบบกะพริบ ให้ตั้งค่า ro.oem_unlock_supported เป็น 1
  • หากอุปกรณ์ไม่รองรับการปลดล็อคแบบกะพริบ ให้ตั้งค่า ro.oem_unlock_supported เป็น 0

หากอุปกรณ์รองรับการปลดล็อคแบบกะพริบ Bootloader ควรระบุสถานะการล็อคโดยการตั้งค่าตัวแปรบรรทัดคำสั่งเคอร์เนล androidboot.flash.locked เป็น 1 หากถูกล็อค หรือเป็น 0 หากปลดล็อค ต้องตั้งค่าตัวแปรนี้ใน bootconfig แทนในบรรทัดคำสั่งเคอร์เนลใน Android 12

สำหรับอุปกรณ์ที่รองรับ dm-verity ให้ใช้ ro.boot.verifiedbootstate เพื่อตั้งค่าของ ro.boot.flash.locked เป็น 0 สิ่งนี้จะปลดล็อค bootloader หากสถานะการบูตที่ตรวจสอบแล้วเป็นสีส้ม

การปกป้องส่วนสำคัญ

อุปกรณ์ควรรองรับการล็อคและการปลดล็อคส่วนที่สำคัญ ซึ่งถูกกำหนดให้เป็นอะไรก็ได้ที่จำเป็นในการบู๊ตอุปกรณ์เข้าสู่บูตโหลดเดอร์ ส่วนดังกล่าวอาจรวมถึงฟิวส์ พาร์ติชันเสมือนสำหรับฮับเซ็นเซอร์ บูตโหลดเดอร์ขั้นแรก และอื่นๆ หากต้องการล็อคส่วนสำคัญ คุณต้องใช้กลไกที่ป้องกันโค้ด (เคอร์เนล อิมเมจการกู้คืน รหัส OTA ฯลฯ) ที่ทำงานบนอุปกรณ์จากการแก้ไขส่วนสำคัญใดๆ โดยเจตนา OTA ไม่ควรอัปเดตส่วนสำคัญหากอุปกรณ์อยู่ในสถานะล็อควิกฤติ

การเปลี่ยนจากสถานะล็อคเป็นปลดล็อคควรต้องมีการโต้ตอบทางกายภาพกับอุปกรณ์ การโต้ตอบนี้คล้ายกับเอฟเฟกต์ของการรันคำสั่ง fastboot flashing unlock แต่ต้องการให้ผู้ใช้กดปุ่มบนอุปกรณ์ อุปกรณ์ไม่ควรอนุญาตให้เปลี่ยนจาก lock critical เป็น unlock critical โดยทางโปรแกรมโดยไม่มีการโต้ตอบทางกายภาพ และอุปกรณ์ไม่ควรจัดส่งในสถานะ unlock critical