嵌入式安全第一关:Secure Boot是怎么保护你的设备的?

你有没有想过一个问题:如果攻击者直接拿编程器夹住你的Flash芯片,把固件全部读出来,你的加密算法就算再强,又有什么用?

这不是假设。我们团队之前做过一个测试------市面上售价百元以内的几款物联网终端设备,超过六成没有做任何物理层面的安全防护。一把夹子、一条杜邦线、一个半小时,固件就能完整dump出来。

很多人把嵌入式安全简单等同于"在代码里用AES加密数据",但在这个连Flash都可以热风枪吹下来放在编程器上读的物理世界里,代码加密的前提是------别人读不到你的代码。

所以要理解嵌入式安全,首先得理解一个概念:信任根。

先看一段典型的MCU启动流程:

c 复制代码
void boot_sequence(void) {
    uint32_t *app_entry = (uint32_t *)APP_START_ADDR;

    // 1. 读取复位向量
    if (*app_entry != 0xFFFFFFFF) {
        // 2. 计算当前固件哈希
        uint8_t hash[32];
        sha256_calculate(APP_START_ADDR, APP_SIZE, hash);

        // 3. 与存储在OTP区域的签名对比
        if (memcmp(hash, (void *)OTP_HASH_ADDR, 32) == 0) {
            // 4. 签名验证通过,正常启动
            jump_to_app(app_entry);
        } else {
            // 固件被篡改,进入安全模式
            enter_safe_mode();
        }
    }
}

这段代码呈现的是一个典型的Secure Boot流程,但关键不在于代码怎么写,而在于"OTP区域的签名"是怎么来的。

OTP,全称One Time Programmable,是信任链的第一环。

芯片出厂时,厂商在OTP区域烧录一个公钥哈希或者设备证书。这个区域只能写一次,且物理上无法被外部接口读取。信任从这里开始------如果连OTP的内容都可以被篡改,那么整个安全体系就崩塌了。

真正的问题是:OTP里的根密钥怎么保证安全?

一个有意思的设计是,很多MCU厂商在芯片内部集成了一个硬件不可克隆函数,英文叫Physically Unclonable Function,简称PUF。PUF利用芯片制造过程中硅片掺杂浓度的微小差异来生成一个唯一的、不可复制的"指纹"。这个指纹被用来派生加密密钥,密钥从不出芯片,只在需要时由PUF实时生成。

绕了一圈,本质逻辑其实是:与其拼命保护一把密钥,不如让这把密钥根本就不存在。不存在的东西,自然偷不走。

再往上一层看,即使Secure Boot和无密钥存储都做好了,还有另一个常被忽视的环节------固件更新通道。

c 复制代码
/* 不安全的固件更新 */
if (receive_packet(&pkt) == SUCCESS) {
    write_flash(UPDATE_ADDR, pkt.data, pkt.len);
    reboot();
}

/* 稍微可靠的版本 */
if (receive_packet(&pkt) == SUCCESS) {
    if (verify_signature(pkt.data, pkt.len, pkt.sig) == VALID) {
        if (decrypt_in_place(pkt.data, pkt.len, session_key) == OK) {
            write_flash(UPDATE_ADDR, pkt.data, pkt.len);
            reboot();
        }
    }
}

两种实现的差别不只是多几行if判断。前一种在OTA升级时,任何人只要在无线信号范围内发送一个伪造的固件包,就能让所有设备变砖------更糟糕的是,如果攻击者植入一个恶意固件,设备就成了别人手里的僵尸。

后一种实现多做了两件事:签名验证保证固件来源可信,会话密钥解密保证传输过程中不会被窃听。这里使用session_key而不是固定密钥的原因是------如果设备所有者的通信都用同一把对称密钥加密,密钥在设备出厂后就无法更换,一旦泄漏就全盘皆输。

从信任根出发,到Secure Boot验证,再到安全固件更新,这三层构成了一条完整的信任链。但有个容易被忽略的细节:信任链的强度取决于最弱的一环。如果生产环节中固件烧录器可以直接跳过签名验证,那前面所有工作都白做了。

生产安全本身就是一个不小的课题。

相关推荐
Kuakewei8882 小时前
4056充电芯片:28V高耐压+电池反接保护+热调节功能
嵌入式硬件
三品吉他手会点灯2 小时前
嵌入式机器学习 - 学习笔记1.1.1 - 什么是机器学习?
c语言·人工智能·笔记·嵌入式硬件·学习·机器学习
woohuwan2 小时前
CST 匝数比和采样电阻怎么算?
单片机·嵌入式硬件
长风2303 小时前
Day14: 极限异常演练 —— 验证系统韧性与错误告警生成
人工智能·安全
王光环4 小时前
STM32H750串口一直进IRQ问题解决
stm32·单片机·嵌入式硬件
技术不好的崎鸣同学4 小时前
Windows 命令提示符(CMD)恶意脚本分析篇
网络·windows·安全·系统安全
Sagittarius_A*5 小时前
Docker:渗透前置容器化核心基础
运维·安全·docker·容器
2401_854151555 小时前
STM32 选项字节与读写保护(RDP)
stm32·单片机·嵌入式硬件
孟郎郎5 小时前
AI 辅助开发编程敏感信息保护安全规范
人工智能·安全·ai·风险·隐患