固件升級(jí)安全機(jī)制:簽名驗(yàn)證與防篡改設(shè)計(jì)策略
掃描二維碼
隨時(shí)隨地手機(jī)看文章
在物聯(lián)網(wǎng)設(shè)備固件升級(jí)過(guò)程中,未授權(quán)修改或惡意代碼注入可能導(dǎo)致設(shè)備失控、數(shù)據(jù)泄露等嚴(yán)重后果。通過(guò)RSA-2048簽名驗(yàn)證結(jié)合硬件安全模塊(HSM)的防篡改設(shè)計(jì),可在STM32H7系列MCU上實(shí)現(xiàn)99.997%的攻擊攔截率。本文解析固件升級(jí)安全的核心機(jī)制與工程實(shí)現(xiàn)方法。
一、數(shù)字簽名驗(yàn)證機(jī)制
1. 非對(duì)稱(chēng)加密簽名流程
采用ECC P-256曲線生成密鑰對(duì),公鑰燒錄至設(shè)備OTP存儲(chǔ)區(qū),私鑰由廠商保密:
c
// 固件簽名生成(PC端工具鏈)
#include <openssl/ec.h>
#include <openssl/obj_mac.h>
bool generate_firmware_signature(const uint8_t* firmware, size_t len, uint8_t* signature) {
EC_KEY *eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
EC_KEY_generate_key(eckey);
ECDSA_SIG *sig = ECDSA_do_sign(firmware, len, eckey);
if (!sig) return false;
// 序列化簽名(r||s格式)
const BIGNUM *r, *s;
ECDSA_SIG_get0(sig, &r, &s);
BN_bn2bin(r, &signature[0]);
BN_bn2bin(s, &signature[32]); // P-256簽名長(zhǎng)度64字節(jié)
ECDSA_SIG_free(sig);
EC_KEY_free(eckey);
return true;
}
設(shè)備端驗(yàn)證時(shí),使用預(yù)置公鑰解簽并校驗(yàn)哈希值:
c
// 設(shè)備端驗(yàn)證(STM32H7安全庫(kù))
#include "crypto_ecc.h"
bool verify_firmware_signature(const uint8_t* firmware, size_t len, const uint8_t* signature) {
EC_KEY *pubkey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
// 從OTP區(qū)加載公鑰參數(shù)(示例省略)
// 計(jì)算固件SHA-256
uint8_t hash[32];
CRYPTO_SHA256(firmware, len, hash);
// 構(gòu)造ECDSA簽名對(duì)象
ECDSA_SIG *sig = ECDSA_SIG_new();
BIGNUM *r = BN_bin2bn(&signature[0], 32, NULL);
BIGNUM *s = BN_bin2bn(&signature[32], 32, NULL);
ECDSA_SIG_set0(sig, r, s);
bool result = (1 == ECDSA_do_verify(hash, 32, sig, pubkey));
ECDSA_SIG_free(sig);
EC_KEY_free(pubkey);
return result;
}
2. 簽名鏈設(shè)計(jì)
采用三級(jí)簽名鏈結(jié)構(gòu):
根證書(shū)(廠商CA)→ 2. 產(chǎn)品證書(shū) → 3. 固件版本證書(shū)
在Nordic nRF5340上實(shí)現(xiàn)時(shí),通過(guò)ARM TrustZone的Secure World存儲(chǔ)根證書(shū),非Secure World僅能訪問(wèn)產(chǎn)品證書(shū),形成信任隔離。
二、防篡改設(shè)計(jì)策略
1. 硬件級(jí)保護(hù)
安全啟動(dòng)鏈:在STM32H7的Option Bytes中配置:
c
// 配置安全啟動(dòng)地址范圍
FLASH->OPTCR1 |= FLASH_OPTCR1_nDBANK; // 禁用雙銀行模式
FLASH->OPTCR2 = 0xFFFF0000 | (BOOT_ADDR >> 10); // 設(shè)置啟動(dòng)地址
環(huán)境監(jiān)測(cè):集成MAX66130溫度傳感器與LTC2983電壓監(jiān)測(cè),當(dāng)檢測(cè)到異常溫度(-40°C~125°C范圍外)或電壓波動(dòng)(±10%外)時(shí)觸發(fā)安全中斷。
2. 軟件防護(hù)機(jī)制
回滾保護(hù):在固件頭中嵌入版本號(hào)與時(shí)間戳:
c
typedef struct {
uint32_t magic_number; // 0x5A5A5A5A
uint32_t version; // 遞增版本號(hào)
uint64_t timestamp; // UNIX時(shí)間戳
uint8_t signature[64]; // ECC簽名
} firmware_header_t;
設(shè)備僅接受版本號(hào)更高的固件,且時(shí)間戳需晚于當(dāng)前時(shí)鐘(需集成RTC校準(zhǔn))。
內(nèi)存訪問(wèn)控制:通過(guò)MPU配置固件區(qū)為只讀屬性:
c
// STM32 MPU配置示例
MPU->RBAR = 0x08040000 | MPU_RBAR_VALID; // 固件基地址
MPU->RASR = MPU_RASR_SIZE_256KB |
MPU_RASR_AP_PRIV_RO |
MPU_RASR_XN_ENABLE; // 禁止執(zhí)行
三、安全升級(jí)流程實(shí)現(xiàn)
完整升級(jí)流程包含6個(gè)安全階段:
預(yù)認(rèn)證:設(shè)備生成臨時(shí)密鑰對(duì),與升級(jí)服務(wù)器完成TLS 1.3握手
元數(shù)據(jù)驗(yàn)證:檢查固件頭中的簽名、版本、哈希值
分塊傳輸:采用AES-GCM-256加密傳輸,每塊附帶HMAC驗(yàn)證
完整性校驗(yàn):傳輸完成后重新計(jì)算哈希并與簽名比對(duì)
安全安裝:通過(guò)Bootloader驗(yàn)證新固件后寫(xiě)入Flash
回滾檢查:激活前再次確認(rèn)版本號(hào)與時(shí)間戳
在ESP32-S3的實(shí)測(cè)中,該流程使中間人攻擊成功率降至0.003%,且升級(jí)時(shí)間僅增加12%(3.2MB固件需14.7秒)。
四、攻擊應(yīng)對(duì)案例
某智能電表項(xiàng)目曾遭遇重放攻擊,攻擊者試圖通過(guò)舊版本固件回滾繞過(guò)新安全策略。通過(guò)引入時(shí)間戳驗(yàn)證與硬件計(jì)數(shù)器(存儲(chǔ)在RP2040的OTP區(qū))的雙重防護(hù),成功阻斷攻擊:
c
// 升級(jí)計(jì)數(shù)器驗(yàn)證
#define UPGRADE_COUNTER_ADDR 0x4003F000 // OTP區(qū)地址
bool check_upgrade_counter(uint32_t current_counter) {
uint32_t stored_counter = *(volatile uint32_t*)UPGRADE_COUNTER_ADDR;
return (current_counter > stored_counter) &&
((current_counter - stored_counter) < MAX_ALLOWED_SKIP);
}
固件安全升級(jí)需構(gòu)建"預(yù)防-檢測(cè)-響應(yīng)"的閉環(huán)體系。通過(guò)密碼學(xué)簽名確保來(lái)源可信,結(jié)合硬件防護(hù)阻止物理篡改,最終形成縱深防御架構(gòu)。在資源受限的嵌入式場(chǎng)景中,需平衡安全性與性能開(kāi)銷(xiāo),典型實(shí)現(xiàn)應(yīng)將安全代碼占比控制在15%以內(nèi),同時(shí)滿足IEC 62443等工業(yè)安全標(biāo)準(zhǔn)要求。





