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 的安全不是通過簡單的"加密",而是通過:
- 硬件信任根:Boot ROM 中的不可變代碼和密鑰
- 鏈式驗證:每個啓動階段驗證下一個階段的完整性
- 數字簽名:使用非對稱加密驗證鏡像真實性
- 安全存儲:密鑰存儲在 eFuse、TrustZone 等安全區域
- 狀態管理:通過鎖定/解鎖狀態控制安全策略
這種多層次的安全架構使得:
- 鎖定狀態的設備極難被惡-意軟件瓦解
- 解鎖需要物理接觸和用户確認(且會清除數據)
- 即使硬件被物理訪問,沒有私鑰也無法刷入惡意固件
這才是 Android Bootloader "加密"的真正含義——一個基於密碼學驗證的完整信任鏈體系。
結束語 Flutter是一個由Google開發的開源UI工具包,它可以讓您在不同平台上創建高質量、美觀的應用程序,而無需編寫大量平台特定的代碼。我將學習和深入研究Flutter的方方面面。從基礎知識到高級技巧,從UI設計到性能優化,歡飲關注一起討論學習,共同進入Flutter的精彩世界!