鎖定/解鎖引導程式

預設情況下,大多數 Android 裝置附帶鎖定的引導程序,這意味著用戶無法刷新引導程式或裝置分割區。如果需要,您(以及啟用了開發人員選項的裝置使用者)可以解鎖引導程式以刷新新映像。

解鎖引導程式

若要解鎖引導程式並啟用分割區重新刷新,請在裝置上執行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.verifiedbootstatero.boot.flash.locked的值設為0 ;如果驗證的啟動狀態為橙色,這將解鎖引導程式。

保護關鍵部分

設備應支援關鍵部分的鎖定和解鎖,關鍵部分被定義為將設備引導到引導程式所需的任何內容。這些部分可能包括保險絲、感測器集線器的虛擬分區、第一階段引導程式等。要鎖定關鍵部分,您必須使用一種機制來防止裝置上執行的程式碼(核心、復原映像、OTA 程式碼等)故意修改任何關鍵部分。如果裝置處於鎖定關鍵狀態,OTA 應該無法更新關鍵部分。

從鎖定狀態轉換到解鎖狀態應該需要與裝置進行實體互動。此互動類似於執行fastboot flashing unlock命令的效果,但需要使用者按下裝置上的實體按鈕。設備不應允許在沒有實體互動的情況下以編程方式從lock critical轉換為unlock critical狀態,並且設備不應以unlock critical狀態發貨。