重新啟動時繼續執行

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

雖然合作夥伴可以將這個程序與 OTA 系統功能配對,在裝置處於 Android 11 的閒置狀態時套用更新,但在 Android 12 中,合作夥伴不需要額外的 OTA 系統功能。RoR 程序能為使用者提供多一層的安全性和便利性。 如果是 Android 12 裝置,則可在裝置閒置時更新 多重用戶端和伺服器型更新功能同時提供裝置 硬體層級類型安全性

雖然您必須為 android.hardware.reboot_escrow 功能提供裝置權限,才能在 Android 11 中支援 RoR,但在 Android 12 以上版本中,您不必這樣做,因為這些版本不會使用 HAL。

背景

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

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

威脅模型

RoR 實作必須確保裝置成為攻擊者 攻擊者很難恢復使用者的 CE- 加密資料 (即使裝置開機) 且 CE 儲存空間處於解鎖狀態 使用者收到 OTA 更新後,就會解鎖裝置。內部人士 即使攻擊者取得 廣播加密簽署金鑰。

具體來說,攻擊者「不得」讀取 CE 儲存空間 下載裝置,並且提供下列功能和限制:

功能

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

限制

  • 無法修改防竄改硬體 (例如 Titan M) 的運作方式。
  • 無法讀取使用中裝置的 RAM。
  • 無法猜測使用者的憑證 (PIN 碼、解鎖圖案、密碼) 或其他原因 輸入的名稱

解決方案

Android 12 RoR 更新系統可防範非常複雜的攻擊者,並在裝置密碼和 PIN 碼留在裝置上時提供安全性,不會傳送至或儲存在 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 更新不會干擾使用者,請採用深色模式來減少光線發射量。為此,請讓裝置引導程式搜尋字串 reason 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

在 Android 12 中,OTA 用戶端會在即將重新啟動時叫用 TelephonyManager 系統 API。這個 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

這個指令只有在殼層以根使用者的身分執行 (adb root) 時才有效。

僅限 Android 11

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

截至 2020 年 7 月,RoR HAL 實作項目可分為兩類:

  1. 如果 SoC 硬體支援在重新啟動時保留 RAM,原始設備製造商 (OEM) 可以使用 AOSP 中的預設實作方式 (預設 RAM 擔保)。
  2. 如果裝置硬體或 SoC 支援安全硬體區塊 (具有專屬 RAM 和 ROM 的獨立安全輔助處理器),則必須執行下列操作:
    • 能夠偵測主 CPU 重新啟動。
    • 硬體計時器來源會在重新啟動後持續存在。也就是說,Enclave 必須能夠偵測重新啟動,並在重新啟動前讓計時器到期。
    • 支援將託管金鑰儲存在特區 RAM/ROM 中,以便在離線攻擊中無法復原。其儲存 RoR 金鑰的方式 因此內部人員或攻擊者無法予以復原。

預設的 RAM 擔保金

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

使用 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

預設重新啟動 Escrow HAL 實作

如要使用預設實作,您必須保留 65536 (0x10000) 位元組。請勿將這些位元組寫入非揮發性儲存空間,以確保安全性屬性持續存在。

Linux 核心裝置樹狀結構異動

在 Linux kernel 的裝置樹狀結構中,您必須為 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