嵌入式安全机制

一、硬件级安全机制

1. 安全存储与加密加速

  • eFuse技术
    功能:熔断一次性可编程存储器,存储根密钥、设备指纹。
    应用:STM32MP1系列通过eFuse存储Secure Boot公钥哈希。
    代码示例

    1
    2
    3
    // 读取eFuse中的密钥(伪代码)
    uint8_t root_key[32];
    HAL_EFUSE_Read(EFUSE_KEY_SLOT0, root_key, 32);
  • HSM(硬件安全模块)
    芯片型号:ATECC608A(加密协处理器)
    功能

    • AES-128/256加密
    • ECC P-256签名验证
    • 防物理探测(Tamper-proof)

2. 隔离执行环境

  • ARM TrustZone
    原理:将CPU划分为安全世界(Secure World)和普通世界(Normal World)。
    实现

    1
    2
    // 安全世界服务调用(SMC指令)
    __smc(0x81000000); // 触发安全监控模式调用

    应用场景:指纹识别、支付认证(如智能锁)。

  • RISC-V PMP(物理内存保护)
    配置:设置内存区域权限(RWX)

    1
    2
    csrw pmpaddr0, 0x80000000  # 设置地址范围
    csrw pmpcfg0, 0x0F # 权限:RWX + 锁定位

二、启动安全

1. Secure Boot流程

1
上电 → BootROM验签一级引导程序 → 验签内核 → 验签应用 → 启动完成

实现要素

  • 非对称签名(RSA-2048/ECDSA)
  • 链式验证(每个阶段验证下一级哈希)

代码示例(U-Boot签名验证)

1
2
3
4
5
# 生成镜像签名
openssl dgst -sha256 -sign private.pem u-boot.bin > u-boot.sig
# 验签流程
if (rsa_verify(u_boot_bin, hash, signature, public_key) != SUCCESS)
halt_cpu();

2. 防回滚攻击

  • 版本计数器:存储于安全区域,固件版本号必须递增。

    1
    2
    uint32_t current_ver = read_otp(VERSION_OTP_ADDR);
    if (new_ver <= current_ver) abort();

三、数据安全

1. 加密存储

  • 透明加密(Flash加密)
    技术:AES-XTS模式(适合Flash块设备)
    实现:NXP LPC55S6x支持片上Flash加密引擎。
  • 密钥轮换
    方案:定期更新加密密钥,旧数据异步解密后重新加密。

2. 安全认证

  • 挑战-响应协议
    流程

    1. 设备生成随机数Nonce发送至服务器
    2. 服务器用共享密钥计算HMAC(Nonce)并返回
    3. 设备验证HMAC合法性

    代码片段

    1
    2
    3
    4
    uint8_t nonce[16];
    generate_secure_nonce(nonce); // 使用TRNG生成
    send_to_server(nonce);
    hmac_sha256(key, nonce, received_hmac);

四、通信安全

1. 协议层加密

  • TLS/DTLS
    优化:mbedTLS + 预共享密钥(PSK)降低资源消耗。
    配置

    1
    mbedtls_ssl_conf_psk(&conf, psk, psk_len, identity, identity_len);
  • LoRaWAN安全
    机制

    • 入网时生成NwkSKey(网络会话密钥)和AppSKey(应用会话密钥)
    • 每帧数据带MIC(消息完整性码)

2. 防重放攻击

  • 序列号+时间戳

    实现:

    1
    2
    3
    4
    5
    6
    typedef struct {
    uint32_t seq; // 单调递增序列号
    uint32_t timestamp;
    uint8_t data[50];
    uint8_t mac[32]; // HMAC-SHA256
    } SecurePacket;

五、运行时防护

1. 内存保护

  • MPU(内存保护单元)
    配置:FreeRTOS-MPU划分任务内存区域,阻止越界访问。
    示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 定义任务内存区域
    static StackType_t task_stack[1024] __attribute__((aligned(32)));
    TaskParameters_t params = {
    .pvTaskCode = task_func,
    .usStackDepth = 1024,
    .pvParameters = NULL,
    .uxPriority = 1,
    .puxStackBuffer = task_stack,
    .xRegions = { { (void*)0x20000000, 32, portMPU_REGION_READ_WRITE }, }
    };
  • ASLR(地址空间随机化)
    实现:启动时随机化代码/数据基址(需MMU支持)。

2. 异常监控

  • 看门狗(WDT)
    级联看门狗

    • 窗口看门狗(WWDG):检测软件逻辑错误
    • 独立看门狗(IWDG):防硬件故障

    配置

    1
    2
    3
    4
    5
    IWDG_HandleTypeDef hiwdg;
    hiwdg.Instance = IWDG;
    hiwdg.Init.Prescaler = IWDG_PRESCALER_256;
    hiwdg.Init.Reload = 4095; // 超时约30s
    HAL_IWDG_Init(&hiwdg);

六、物理攻击防护

1. 防侧信道攻击

  • 恒定时间算法

    示例:密码比较避免短路求值

    1
    2
    3
    4
    5
    6
    7
    bool secure_compare(const uint8_t *a, const uint8_t *b, size_t len) {
    uint8_t result = 0;
    for (size_t i = 0; i < len; i++) {
    result |= a[i] ^ b[i];
    }
    return (result == 0);
    }

2. 光传感器屏蔽

  • 金属屏蔽层:覆盖关键芯片,防止激光注入攻击。

七、安全开发实践

1. 工具链加固

  • 编译器选项:

    1
    2
    CFLAGS += -fstack-protector-strong -Wformat-security -D_FORTIFY_SOURCE=2
    LDFLAGS += -Wl,-z,now,-z,relro

2. 漏洞扫描

  • 静态分析:

    1
    2
    # 使用Cppcheck检测漏洞
    cppcheck --enable=all --suppress=missingIncludeSystem .

3. 安全认证

  • 标准合规:
    • ISO/SAE 21434(汽车网络安全)
    • UL 2900(物联网设备)

八、典型攻击与防御对照

攻击类型 防御机制 实现示例
固件提取 Flash加密 + 安全调试接口锁定 STM32 RDP级别2
中间人攻击 TLS 1.3 + 证书固定 MbedTLS证书指纹校验
缓冲区溢出 MPU分区 + Stack Canary FreeRTOS-MPU配置
时序侧信道 恒定时间算法 OpenSSL BN_CTX结构

九、资源受限设备优化

  • 轻量级加密
    • 算法选择:ChaCha20-Poly1305(比AES-GCM省50%资源)
    • 硬件加速:使用芯片内置AES引擎(如ESP32)
  • 最小化可信计算基(TCB)
    仅安全引导加载程序和关键服务运行在TrustZone。

通过硬件安全模块、加密协议、内存保护和持续监控的多层防御,可显著提升嵌入式设备对抗恶意攻击的能力,满足工业控制、医疗设备等高安全场景需求。