默認情況下,大多數 Android 設備都帶有鎖定的引導加載程序,這意味著用戶無法刷新引導加載程序或設備分區。如果需要,您(和啟用了開發人員選項的設備用戶)可以解鎖引導加載程序以刷新新映像。
解鎖引導加載程序
要解鎖引導加載程序並啟用要重新刷新的分區,請在設備上運行fastboot flashing unlock
命令。設置後,解鎖模式在重新啟動後仍然存在。
除非get_unlock_ability
設置為1
,否則設備應拒絕fastboot flashing unlock
命令。如果設置為0
,用戶需要啟動到主屏幕,打開Settings > System > Developer options菜單並啟用OEM 解鎖選項(將get_unlock_ability
設置為1
)。設置後,此模式會在重新啟動和恢復出廠數據後持續存在。
當發送fastboot flashing unlock
命令時,設備應提示用戶警告他們可能會遇到非官方圖像的問題。用戶確認警告後,設備應執行出廠數據重置以防止未經授權的數據訪問。即使無法正確重新格式化,引導加載程序也應該重置設備。只有在重置後才能設置持久標誌,以便可以重新刷新設備。
在快速啟動fastboot flashing unlock
過程中,應重置所有尚未覆蓋的 RAM。此措施可防止從上次引導中讀取剩餘 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
(如果已解鎖)來指示鎖定狀態。此變量必須在 bootconfig 中設置,而不是在 Android 12 的內核命令行中設置。
對於支持dm-verity 的設備,使用ro.boot.verifiedbootstate
將ro.boot.flash.locked
的值設置為0
;如果驗證的引導狀態為橙色,這將解鎖引導加載程序。
保護關鍵部分
設備應支持關鍵部分的鎖定和解鎖,關鍵部分定義為將設備引導到引導加載程序所需的任何內容。這些部分可能包括熔斷器、傳感器集線器的虛擬分區、第一階段引導加載程序等。要鎖定臨界區,您必須使用一種機制來防止在設備上運行的代碼(內核、恢復映像、OTA 代碼等)故意修改任何臨界區。如果設備處於鎖定關鍵狀態,OTA 應該無法更新關鍵部分。
從鎖定狀態轉換到解鎖狀態需要與設備進行物理交互。這種交互類似於運行fastboot flashing unlock
命令的效果,但需要用戶按下設備上的物理按鈕。設備不應允許在沒有物理交互的情況下以編程方式從關鍵鎖定轉換為lock critical
unlock critical
,並且設備不應在unlock critical
狀態下交付。