重新啟動後繼續

在 Android 11 中,您可以使用 A/B 更新虛擬 A/B 更新機制,搭配 RecoverySystem 類別方法套用 OTA 更新。重新啟動裝置以套用 OTA 更新後, 裝置重新啟動後 (RoR) 會解鎖裝置憑證加密 (CE) 儲存空間

雖然合作夥伴也能將此程序與適用的 OTA 系統功能配對 更新並接收來自 Android 版本回應 Android 12 合作夥伴不需要額外的 OTA 系統 而不是每個特徵的分數RoR 程序可在裝置閒置時進行更新,為使用者提供額外的安全性和便利性,而 Android 12 的多用戶端和伺服器更新功能則可共同提供裝置硬體層級的安全性。

但你必須為android.hardware.reboot_escrow提供裝置權限 在 Android 11 中支援 RoR,您不需要執行此操作 Android 12 以上版本中的伺服器型 RoR 請不要使用 HAL

背景

自 Android 7 起,Android 支援「直接啟動」功能,可讓裝置上的應用程式在使用者解鎖 CE 儲存空間前啟動。採用直接啟動支援,為使用者提供更便捷的體驗 熟悉鎖定螢幕知識 (LSKF) 階段 的使用者體驗 執行這些動作

RoR 可解鎖裝置上所有應用程式的 CE 儲存空間,包括 不支援直接啟動應用程式 (在 OTA 更新。這項功能可讓使用者在重新啟動後,收到所有已安裝應用程式的通知。

威脅模型

實作 RoR 時,必須確保裝置落入攻擊者手中時,攻擊者即使開啟裝置、解鎖 CE 儲存空間,並在收到 OTA 更新後解鎖裝置,也難以復原使用者以 CE 加密的資料。內部人士 即使攻擊者取得 廣播加密簽署金鑰。

具體來說,攻擊者必須實際擁有裝置,才能不得讀取 CE 儲存空間,且具備下列功能和限制:

功能

  • 可使用任何供應商或公司的簽署金鑰簽署任意訊息。
  • 這可能會導致裝置接收 OTA 更新。
  • 能修改任何硬體的作業 (例如應用程式處理器、 或 Flash 記憶體) 觸發的廣告,但詳情請參閱下方「限制」一節。 (不過,這類修改會導致至少一小時的延遲,且會造成 RAM 內容毀損的電源週期。)

限制

  • 無法修改防竄改硬體 (例如 Titan M)。
  • 無法讀取即時裝置的 RAM。
  • 無法猜測使用者的憑證 (PIN 碼、解鎖圖案、密碼),或以其他方式要求使用者輸入憑證。

解決方案

Android 12 RoR 更新系統提供安全性 以便防範非常複雜的攻擊者;而這麼做也能使用裝置端密碼和 PIN 碼會保留在裝置上,絕不會傳送至 Google 伺服器,也不會儲存在 Google 伺服器上。以下概略說明這項程序,確保提供的安全性層級與硬體式裝置層級 RoR 系統相似:

  • Android 會對儲存在裝置上的資料套用加密保護。
  • 所有資料都受到保護,因為金鑰儲存在受信任的執行環境 (TEE) 中。
  • TEE 只有在執行中的作業系統通過密碼編譯驗證 (驗證開機) 時,才會釋出金鑰。
  • 在 Google 伺服器上運作的 RoR 服務會儲存密鑰,藉此保護 CE 資料 且限時擷取。 這項做法適用於 Android 生態系統。
  • 使用者 PIN 碼保護的密碼編譯金鑰,可用於解鎖裝置並解密 CE 儲存空間。
    • 當系統排定在半夜重新啟動時,Android 會提示使用者輸入 PIN 碼,然後計算綜合密碼 (SP)。
    • 然後會對 SP 進行兩次加密:一次使用儲存在 RAM 中的金鑰 K_s,另一次使用儲存在 TEE 中的金鑰 K_k
    • 雙重加密的 SP 會儲存在磁碟上,而 SP 會從 RAM 中清除。這兩個鍵都是新產生的,且僅用於一次重新啟動
  • 重新啟動時,Android 會將 K_s 交給伺服器。系統會在將含有 K_k 的收據儲存至磁碟前加密。
  • 重新啟動後,Android 會使用 K_k 解密收據,然後傳送至 要擷取 K_s 的伺服器。
    • K_kK_s 可用來解密儲存在磁碟上的 SP。
    • Android 會使用 SP 解鎖 CE 儲存空間,並允許一般應用程式啟動。
    • K_kK_s 會遭到捨棄。

系統會在你方便的時間,例如睡覺時,執行保護手機安全的更新。

SIM PIN 重播

在特定情況下,系統會透過快取驗證 SIM 卡的 PIN 碼。 執行稱為 SIM 卡 PIN 碼重播程序

啟用 PIN 碼的 SIM 卡在無人值守的重新啟動後,必須進行無縫 PIN 碼驗證 (SIM 卡 PIN 重播),才能恢復行動連線 (通話、簡訊和數據服務都需要)。SIM 卡 PIN 碼和相應的 SIM 卡資訊 (ICCID 和 SIM 卡插槽) 號碼) 會一起安全儲存。可擷取及使用儲存的 PIN 碼 。如果裝置已加密,SIM PIN 碼會與由 LSKF 保護的金鑰一併儲存。如果 SIM 卡已插入 已啟用 PIN 碼,如要與 RoR 伺服器互動,就需要 Wi-Fi 連線 ,與 OTA 更新和伺服器式 RoR 通訊,可確保基本功能 ( 行動網路連線)。

每次使用者成功啟用、驗證或修改 SIM 卡 PIN 碼時,系統都會重新加密並儲存 SIM 卡 PIN 碼。只要發生下列任一情況,系統就會捨棄 SIM 卡 PIN 碼 發生:

  • 取出或重設 SIM 卡。
  • 使用者停用 PIN。
  • 發生非 RoR 啟動的重新啟動作業。

儲存的 SIM PIN 只能在 RoR 啟動的重新啟動後使用一次,且只能在非常短的時間 (20 秒) 內使用,前提是 SIM 卡的詳細資料相符。儲存的 SIM 卡 PIN 碼一律不會從 TelephonyManager 應用程式外流 無法由外部模組擷取。

導入指南

在 Android 12 中,多用戶端和伺服器的 RoR 函式可在合作夥伴推送 OTA 更新時,為他們提供較輕的負載。有時需要執行必要的更新,例如裝置停機期間,例如: 指定的睡眠時間。

如要確保這類期間的 OTA 更新作業不會幹擾使用者: 採用深色模式來減少淺色若要進行這項操作,請備妥裝置 系統啟動載入程式搜尋字串原因 unattended。如果 unattendedtrue,請將裝置設為深色模式。請注意,每家原始設備製造商 (OEM) 都有責任減少聲響和光線的排放量。

如果您要升級到 Android 12 或 Android 12 裝置,您無需採取任何行動 實作新的 RoR 功能

在多用戶端流程中,有一個新的呼叫 isPreparedForUnattendedUpdate,如下所示:

@RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
            android.Manifest.permission.REBOOT})
public static boolean isPreparedForUnattendedUpdate(@NonNull Context context)

您不需要實作此功能,因為 HAL 已在 Android 12 中淘汰。

TelephonyManager

當即將重新啟動時,OTA 用戶端會叫用 TelephonyManager 系統 API 在 Android 12 中。這個 API 會將所有快取 PIN 碼從 將 AVAILABLE 狀態轉換為 REBOOT_READY 狀態。TelephonyManager 系統 API 受現有 REBOOT 保護 資訊清單權限。

 /**
    * The unattended reboot was prepared successfully.
    * @hide
    */
   @SystemApi
   public static final int PREPARE_UNATTENDED_REBOOT_SUCCESS = 0;

   /**
    * The unattended reboot was prepared, but the user will need to manually
    * enter the PIN code of at least one SIM card present in the device.
    * @hide
    */
   @SystemApi
   public static final int PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED = 1;

   /**
    * The unattended reboot was not prepared due to generic error.
    * @hide
    */
   @SystemApi
   public static final int PREPARE_UNATTENDED_REBOOT_ERROR = 2;

   /** @hide */
   @Retention(RetentionPolicy.SOURCE)
   @IntDef(prefix = {"PREPARE_UNATTENDED_REBOOT_"},
           value = {
                   PREPARE_UNATTENDED_REBOOT_SUCCESS,
                   PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED,
                   PREPARE_UNATTENDED_REBOOT_ERROR
           })
   public @interface PrepareUnattendedRebootResult {}

   /**
    * Prepare TelephonyManager for an unattended reboot. The reboot is
    * required to be done shortly after the API is invoked.
    *
    * Requires system privileges.
    *
    * <p>Requires Permission:
    *   {@link android.Manifest.permission#REBOOT}
    *
    * @return {@link #PREPARE_UNATTENDED_REBOOT_SUCCESS} in case of success.
    * {@link #PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED} if the device contains
    * at least one SIM card for which the user needs to manually enter the PIN
    * code after the reboot. {@link #PREPARE_UNATTENDED_REBOOT_ERROR} in case
    * of error.
    * @hide
    */
   @SystemApi
   @RequiresPermission(android.Manifest.permission.REBOOT)
   @PrepareUnattendedRebootResult
   public int prepareForUnattendedReboot()

特權 APK 會使用 TelephonyManager 系統 API。

測試

如要測試新 API,請執行下列指令:

    adb shell cmd phone unattended-reboot

只有在殼層以 root 權限 (adb root) 執行時,這個指令才會生效。

僅限 Android 11

本頁其餘部分適用於 Android 11。

自 2020 年 7 月起,RR HAL 的導入可分為兩大類:

  1. 如果 SoC 硬體在重新啟動時支援 RAM 持續性,原始設備製造商 (OEM) 便可使用 Android 開放原始碼計畫的預設實作方式 (預設 RAM Escrow)。
  2. 如果裝置硬體或 SoC 支援安全硬體安全區 (獨立的 搭載專屬 RAM 和 ROM 的安全輔助處理器,還須 包括:
    • 能夠偵測主 CPU 重新啟動。
    • 硬體計時器來源會在重新啟動後持續存在。也就是說, 安全規則必須能夠偵測重新啟動,並在 。
    • 支援將託管金鑰儲存在安全區 RAM/ROM 中,以防該金鑰無法 遭到離線攻擊復原必須以無法讓內部人員或攻擊者復原的方式儲存 RoR 金鑰。

預設 RAM 託管

Android 開放原始碼計畫已實作使用 RAM 持久性的 RoR HAL。為使這項功能正常運作,原始設備製造商 (OEM) 必須確保其 SoC 支援在重新啟動時保留 RAM。部分 SoC 無法在重新啟動後保留 RAM 內容,因此 建議原始設備製造商 (OEM) 諮詢 SoC 合作夥伴,再啟用這個預設 HAL。 下一節的標準參考資料。

使用 RoR 進行 OTA 更新流程

手機上的 OTA 用戶端應用程式必須具備 Manifest.permission.REBOOTManifest.permission.RECOVERY 權限,才能呼叫實作 RoR 所需的方法。在完成上述先決條件後,更新流程會依照下列步驟進行:

  1. OTA 用戶端應用程式會下載更新。
  2. OTA 用戶端應用程式會呼叫 RecoverySystem#prepareForUnattendedUpdate,觸發系統在下次解鎖時,在鎖定畫面上提示使用者輸入 PIN 碼、圖案或密碼。
  3. 使用者在螢幕鎖定畫面解鎖裝置,裝置即可開始套用更新。
  4. OTA 用戶端應用程式會呼叫 RecoverySystem#rebootAndApply,並立即觸發重新啟動。

這項流程結束後,裝置會重新啟動,且 RoR 機制會解鎖憑證加密 (CE) 儲存空間。應用程式: 顯示為一般使用者解鎖,因此他們能收到所有信號,例如 ACTION_LOCKED_BOOT_COMPLETEDACTION_BOOT_COMPLETED 讓他們按照平常的方式使用介面

修改產品設定

標示為支援 Android 11 中 RoR 功能的產品,必須包含 RebootEscrow HAL 的實作項目,並納入功能標記 XML 檔案。如果裝置採用暖重新啟動 (當 重新啟動時,DRAM 仍會保持開啟狀態)。

重新啟動託管地圖項目標記

也必須使用地圖項目標記:

PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.hardware.reboot_escrow.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.reboot_escrow.xml

預設的重新啟動擔保 HAL 實作

如要使用預設實作方式,您必須保留 65536 (0x10000) 個位元組。一律不刪除 將這些位元組寫入非揮發性儲存空間,以確保安全屬性 持續性。

Linux 核心裝置樹狀架構變更

在 Linux 核心的裝置樹狀結構中,您必須為 pmem 區域保留記憶體。以下範例顯示保留 0x50000000

  reserved-memory {
    my_reservation@0x50000000 {
      no-map;
      reg = <0x50000000 0x10000>;
    }
  }

  reboot_escrow@0 {
    compatible = "pmem-region";
    reg = <0x50000000 0x10000>;
  };

確認 block 目錄中是否有名稱為 /dev/block/pmem0 的新裝置 (例如 pmem1pmem2)。

Device.mk 變更

假設您在前一個步驟中建立的新裝置名稱為 pmem0,請務必確保下列新項目會新增至 vendor/<oem>/<product>/device.mk

# Resume on Reboot support
PRODUCT_PROPERTY_OVERRIDES += \
    ro.rebootescrow.device=/dev/block/pmem0
PRODUCT_PACKAGES += \
    android.hardware.rebootescrow-service.default
SELinux 規則

將下列新項目新增至裝置的 file_contexts

/dev/block/pmem0  u:object_r:rebootescrow_device:s0
/vendor/bin/hw/android\.hardware\.rebootescrow-service\.default  u:object_r:hal_rebootescrow_default_exec:s0