在這裏插入圖片描述

Android 的 Bootloader 本身通常不直接加密,而是通過一套精密的驗證鏈來保證其完整性和安全性。這套機制的核心是 Verified Boot

讓我詳細解釋這個安全體系是如何工作的。

核心概念:Verified Boot(驗證啓動)

Verified Boot 的目標是確保設備啓動的每個階段都運行經過驗證的、未被篡改的代碼。這是一個"鏈式信任"的過程。

啓動流程與驗證鏈

Power On
    ↓
Boot ROM (硬件只讀) → 驗證 Bootloader 簽名
    ↓
Bootloader (Little Kernel/ABL) → 驗證 Bootloader 其他部分、內核、設備樹
    ↓
Linux Kernel → 驗證系統分區 (system, vendor, odm)
    ↓
Init Process → 驗證其他分區
    ↓
Android System

具體的加密與驗證技術

1. Boot ROM - 信任根

這是整個信任鏈的起點,硬件級別,無法修改。

// Boot ROM 的簡化驗證邏輯(硬件實現)
void boot_rom_main() {
    // 1. 加載第一階段的 Bootloader 到內存
    byte* bootloader_code = load_from_storage(BOOTLOADER_ADDRESS);
    
    // 2. 使用內置的公鑰驗證簽名
    if (!verify_signature(bootloader_code, 
                         HARDCODED_PUBLIC_KEY)) {
        // 驗證失敗:進入下載模式或完全鎖定
        enter_download_mode_or_brick();
    }
    
    // 3. 驗證通過,執行 Bootloader
    jump_to_bootloader(bootloader_code);
}

特點

  • 在芯片製造時燒錄到 CPU 中
  • 完全只讀,無法通過軟件更新
  • 包含一個或多個廠商的公鑰

2. 數字簽名 - 非對稱加密

Bootloader 和後續鏡像都使用非對稱加密算法進行簽名。

# 廠商的構建服務器上進行的簽名過程
# 1. 生成哈希
sha256sum boot.img > boot_hash

# 2. 使用私鑰簽名
openssl dgst -sha256 -sign vendor_private.key -out boot_signature boot.img

# 3. 將簽名附加到鏡像中
cat boot.img boot_signature > boot_signed.img

驗證過程

# 在設備端的驗證(簡化表示)
# 1. 分離鏡像和簽名
split boot_signed.img boot.img boot_signature

# 2. 計算鏡像哈希
calculated_hash = sha256(boot.img)

# 3. 使用公鑰驗證簽名
is_valid = verify_signature(boot_signature, 
                           calculated_hash, 
                           device_public_key)

3. Android Verified Boot (AVB)

這是現代 Android 設備使用的標準驗證機制。

AVB 驗證流程

# AVB 驗證的偽代碼表示
class AndroidVerifiedBoot:
    def verify_boot(self):
        # 1. 驗證 boot/recovery 分區
        if not self.verify_partition("boot", "vbmeta"):
            return VERIFICATION_FAILED
        
        # 2. 驗證 vbmeta 結構
        vbmeta_header = self.load_vbmeta()
        if not self.verify_vbmeta_signature(vbmeta_header):
            return VERIFICATION_FAILED
        
        # 3. 驗證其他分區(system, vendor等)
        for descriptor in vbmeta_header.descriptors:
            if not self.verify_hash_descriptor(descriptor):
                return VERIFICATION_FAILED
        
        return VERIFICATION_SUCCESS
    
    def verify_vbmeta_signature(self, vbmeta):
        # 使用設備中的公鑰驗證
        public_key = self.get_public_key_from_device()
        return rsa_verify(vbmeta.data, vbmeta.signature, public_key)

AVB 實際數據結構

// AVB 描述符結構(簡化)
struct AvbHashDescriptor {
    uint8_t tag[4];              // 'HASH'
    uint64_t partition_size;
    uint8_t hash[32];           // SHA256 hash
    uint8_t partition_name[128];
};

struct AvbVBMetaImageHeader {
    uint8_t magic[4];           // 'AVB0'
    uint32_t required_libavb_version;
    uint64_t authentication_data_block_size;
    uint64_t auxiliary_data_block_size;
    uint8_t algorithm_type[32]; // SHA256_RSA2048, SHA256_RSA4096等
    uint8_t public_key[512];    // 用於驗證的公鑰
    uint8_t signature[512];     // 數字簽名
    // ... 更多描述符
};

4. 密鑰管理與安全存儲

密鑰層級結構

Root of Trust (生產時燒錄)
    ├── Hardware Key (HSM) → 簽名 Device Key
    │   └── Device Key → 簽名 Release Key
    │       ├── Bootloader Signing Key
    │       ├── Kernel Signing Key  
    │       └── System Signing Key
    └── Attestation Key → 設備身份認證

安全密鑰存儲

// 密鑰可能存儲在的安全區域
typedef enum {
    KEY_STORAGE_TZ = 0,      // TrustZone 安全世界
    KEY_STORAGE_EFUSE,       // eFuse 一次性可編程存儲器
    KEY_STORAGE_SE,          // 安全元素芯片
    KEY_STORAGE_KEYMASTER    // Android Keymaster HAL
} key_storage_type_t;

// eFuse 示例:存儲公鑰哈希
struct efuse_data {
    uint8_t root_public_key_hash[32];  // 燒錄在 eFuse 中
    bool bootloader_locked;            // 解鎖狀態標誌
    uint8_t device_state;              // 設備安全狀態
};

實際實現示例

1. 啓動時的驗證代碼

// 實際 Bootloader 中的驗證邏輯(簡化)
bool aboot_verification() {
    // 1. 檢查設備鎖定狀態
    if (is_device_locked()) {
        // 2. 加載 vbmeta 分區
        AvbVBMetaData* vbmeta = load_vbmeta_partition();
        
        // 3. 驗證 vbmeta 簽名
        if (!avb_verify_vbmeta_signature(vbmeta)) {
            display_warning_message("Verification failed!");
            return false;
        }
        
        // 4. 驗證 boot 分區
        AvbHashDescriptor* boot_descriptor = find_descriptor(vbmeta, "boot");
        if (!verify_partition_hash("boot", boot_descriptor)) {
            display_warning_message("Boot verification failed!");
            return false;
        }
        
        // 5. 驗證其他關鍵分區
        if (!verify_system_partitions(vbmeta)) {
            return false;
        }
    } else {
        // 設備已解鎖:跳過驗證或僅進行基本完整性檢查
        log("Device unlocked, verification bypassed");
    }
    
    return true;
}

2. Fastboot 命令中的驗證

# 在已鎖定的設備上嘗試刷機
fastboot flash boot custom_boot.img
# 輸出: FAILED (remote: 'Partition flashing is not allowed')

fastboot getvar unlocked
# 輸出: unlocked: no

fastboot oem unlock
# 輸出: FAILED (remote: 'OEM unlock is disabled')

不同安全狀態的 Bootloader

1. 鎖定狀態

// 鎖定 Bootloader 的行為
void locked_bootloader_behavior() {
    // 嚴格驗證所有分區
    enforce_strict_verification();
    
    // 拒絕所有刷寫操作
    block_all_flash_commands();
    
    // 僅允許啓動經過簽名的官方鏡像
    allow_only_signed_images();
}

2. 解鎖狀態

// 解鎖 Bootloader 的行為  
void unlocked_bootloader_behavior() {
    // 跳過驗證或僅進行基本檢查
    bypass_verification_or_minimal_check();
    
    // 允許刷寫自定義鏡像
    allow_custom_images_flashing();
    
    // 顯示安全警告
    display_security_warning();
}

加密算法的演進

Android 版本 驗證機制 主要算法
Android 4.4 及之前 無或基本驗證 SHA1/RSA1024
Android 5.0-7.x DM-verity SHA256/RSA2048
Android 8.0+ AVB 1.0 SHA256/RSA2048, RSA4096
Android 10+ AVB 2.0 支持更多哈希算法
Android 11+ AVB 2.0 + 回滾保護 增加抗量子算法選項

總結

Android Bootloader 的安全不是通過簡單的"加密",而是通過:

  1. 硬件信任根:Boot ROM 中的不可變代碼和密鑰
  2. 鏈式驗證:每個啓動階段驗證下一個階段的完整性
  3. 數字簽名:使用非對稱加密驗證鏡像真實性
  4. 安全存儲:密鑰存儲在 eFuse、TrustZone 等安全區域
  5. 狀態管理:通過鎖定/解鎖狀態控制安全策略

這種多層次的安全架構使得:

  • 鎖定狀態的設備極難被惡-意軟件瓦解
  • 解鎖需要物理接觸和用户確認(且會清除數據)
  • 即使硬件被物理訪問,沒有私鑰也無法刷入惡意固件

這才是 Android Bootloader "加密"的真正含義——一個基於密碼學驗證的完整信任鏈體系。


結束語 Flutter是一個由Google開發的開源UI工具包,它可以讓您在不同平台上創建高質量、美觀的應用程序,而無需編寫大量平台特定的代碼。我將學習和深入研究Flutter的方方面面。從基礎知識到高級技巧,從UI設計到性能優化,歡飲關注一起討論學習,共同進入Flutter的精彩世界!