預設情況下,大多數 Android 裝置附帶鎖定的引導程序,這意味著用戶無法刷新引導程式或裝置分割區。如果需要,您(以及啟用了開發人員選項的裝置使用者)可以解鎖引導程式以刷新新映像。
進入引導程式
若要發出fastboot
指令,您必須處於引導程式模式。一種方法是發送 adb 指令adb reboot bootloader
。有些手機還允許您在啟動裝置時按下組合鍵(通常是降低音量)重新啟動到引導程式。
解鎖引導程式
進入引導程式模式後,要解鎖引導程式並啟用分割區重新刷新,請在裝置上執行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
的區域。
鎖定引導程式
若要鎖定引導程式並重設設備,請在裝置上執行fastboot flashing lock
命令。用於零售的設備應在鎖定狀態下發貨( get_unlock_ability
返回0
),以確保攻擊者無法透過安裝新系統或啟動映像來破壞設備。
設定鎖定/解鎖屬性
應根據裝置是否支援快閃記憶體解鎖在建置時設定ro.oem_unlock_supported
屬性。
- 如果裝置支援閃爍解鎖,請將
ro.oem_unlock_supported
設定為1
。 - 如果裝置不支援閃爍解鎖,請將
ro.oem_unlock_supported
設為0
。
如果裝置支援快閃記憶體解鎖,則引導程式應透過將核心命令列變數androidboot.flash.locked
設為1
(如果已鎖定)或設為0
(如果已解鎖)來指示鎖定狀態。在 Android 12 中,必須在 bootconfig 中設定此變量,而不是在核心命令列中設定。
對於支援dm-verity的設備,使用ro.boot.verifiedbootstate
將ro.boot.flash.locked
的值設為0
;如果驗證的啟動狀態為橙色,這將解鎖引導程式。
保護關鍵部分
設備應支援關鍵部分的鎖定和解鎖,關鍵部分被定義為將設備引導到引導程式所需的任何內容。這些部分可能包括保險絲、感測器集線器的虛擬分區、第一階段引導程式等。要鎖定關鍵部分,您必須使用一種機制來防止裝置上執行的程式碼(核心、復原映像、OTA 程式碼等)故意修改任何關鍵部分。如果裝置處於鎖定關鍵狀態,OTA 應該無法更新關鍵部分。
從鎖定狀態轉換到解鎖狀態應該需要與裝置進行實體互動。此互動類似於執行fastboot flashing unlock
命令的效果,但需要使用者按下裝置上的實體按鈕。設備不應允許在沒有實體互動的情況下以編程方式從lock critical
轉換為unlock critical
,並且設備不應以unlock critical
狀態發貨。