跳转至

DevSecOps for IoT:安全左移的嵌入式实践

难度:🟡 中级 | 领域:安全工程、CI/CD | 阅读时间:约 25 分钟

日常类比

传统流程像装修完才请质检——发现问题只能砸墙。开发安全运维(Development, Security, and Operations, DevSecOps)把检查嵌进每一层砌砖:地基、水电、绝缘随时验。

物联网(Internet of Things, IoT)更难:成千上万台已出货设备像散落各地的小屋,芯片架构各异,空中下载(Over-The-Air, OTA)修补昂贵且有变砖风险。安全问题越晚发现,现场修复成本往往高出开发期一个数量级以上——故强调安全左移(Shift-Left)。

摘要

本文将静态应用安全测试(Static Application Security Testing, SAST)、动态测试(DAST)、软件组成分析(Software Composition Analysis, SCA)、模糊测试(Fuzzing)与威胁建模(STRIDE)嵌入 IoT 固件持续集成/持续交付(CI/CD)流水线,给出门禁、密钥管理与成熟度路径,并明确局限与改进。

1 从 DevOps 到 DevSecOps

传统: 需求→设计→编码→测试→部署→运维 →〔很晚才安全审计〕

DevSecOps: 各阶段嵌入威胁建模、安全设计、SAST/SCA、
           Fuzz/DAST、签名与镜像扫描、运行监控
挑战 传统软件 IoT 固件
目标架构 服务器 CPU Cortex-M / RISC-V 等
OS Linux/容器 RTOS / 裸机 / 嵌入式 Linux
语言 多高级语言 以 C/C++/Rust 为主
更新 蓝绿等 OTA,失败可变砖
测试 容器模拟 常需硬件在环(HIL)
攻击面 网络/API 网络+物理+射频+侧信道
寿命 数年常见 常 5–15 年

2 安全测试工具链

2.1 SAST

工具 类型 IoT 相关 开源
Semgrep 模式/规则 可写 IoT 规则包
CodeQL 语义查询 C/C++ 等 部分
Coverity 深度分析 嵌入式支持较好
cppcheck / Flawfinder 静态/模式 入门可用
# Semgrep 规则示意:硬编码 Wi-Fi、弱随机、明文 MQTT
rules:
  - id: hardcoded-wifi-password
    patterns:
      - pattern: |
          $FUNC("$SSID", "$PASSWORD")
      - metavariable-regex:
          metavariable: $FUNC
          regex: (wifi_connect|WiFi\.begin|esp_wifi_set_config)
    message: "硬编码 WiFi 密码,应从安全存储读取"
    severity: ERROR
    languages: [c, cpp]
  - id: insecure-random
    pattern: rand()
    message: "安全场景应使用硬件 RNG/密码学 CSPRNG"
    severity: WARNING
    languages: [c, cpp]
  - id: plaintext-mqtt
    pattern: mqtt_client_connect($CLIENT, $BROKER, 1883, ...)
    message: "MQTT 1883 明文,应使用 8883/TLS"
    severity: ERROR
    languages: [c, cpp]

2.2 DAST / IAST / SCA

DAST 针对设备 Web 管理面与 API(如 OWASP ZAP 基线扫描)。交互式测试(IAST)在 IoT 上常借助 QEMU 等仿真插桩,成熟度因项目而异。

SCA 扫描软件物料清单(Software Bill of Materials, SBOM)中的已知漏洞(CVE)。固件常见依赖:mbedTLS、lwIP、FreeRTOS 等。

# 生成 SBOM 后扫描(工具名示意)
syft dir:. -o cyclonedx-json > sbom.json
trivy sbom --severity HIGH,CRITICAL sbom.json

3 固件模糊测试

C/C++ 内存不安全仍是固件漏洞主因之一;行业调查中的语言占比随样本变化,重要的是:协议解析与输入边界必须可 fuzz[9][10]。

// libFuzzer 入口示意:随机字节驱动 MQTT 解析
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
    mqtt_packet_t packet;
    if (mqtt_parse_packet(data, size, &packet) == MQTT_OK)
        mqtt_process_packet(&packet);
    mqtt_packet_free(&packet);
    return 0;
}
挑战 原因 缓解
硬件依赖 直操寄存器 HAL + QEMU/外设建模[9]
交叉编译 ARM/MIPS 目标 主机重编译可测模块
有状态协议 MQTT/CoAP AFLNet 等有状态 fuzzer
外设 I2C/SPI Mock
加密固件 难提取 合法获取符号包/调试构建

4 CI/CD 安全流水线与门禁

推荐阶段:SAST → SCA/SBOM → 交叉编译与签名 →(夜间)Fuzz → 网关容器扫描。门禁示例:

阶段 门禁 级别
提交 无硬编码密钥 强制阻断
SAST 无约定 CRITICAL/HIGH 强制阻断
SCA 无未豁免 CRITICAL CVE 强制阻断
编译 签名成功、体积上限 强制阻断
Fuzz 无新增 crash 回归 警告或阻断(按成熟度)
DAST 管理面基线 合并前阻断

流水线中的签名私钥必须来自密钥管理系统(如 Vault/KMS),禁止写入仓库。

5 密钥与秘密管理

硬编码 MQTT/Wi-Fi 凭据仍是高频问题(与 OWASP IoT 风险列表方向一致[1])。正确做法:产线注入至 OTP/eFuse/安全元件,运行时经安全存储 API 读取;CI 仅持短期构建/签名权限。

6 STRIDE for IoT

威胁 IoT 示例 防御方向
Spoofing 伪造设备身份 证书 / PUF
Tampering 篡改传感数据 签名 / 安全启动
Repudiation 否认控制指令 审计日志
Info Disclosure 明文 MQTT TLS/DTLS
DoS RF 干扰/洪泛 限速/跳频/降级
Elevation 调试口提权 禁用 JTAG、隔离

流程:画数据流图 → 信任边界套 STRIDE → 风险评分 → 缓解措施绑定到 CI 测试用例[6]。

7 工具选型与成熟度

能力 最低 推荐 企业
SAST cppcheck Semgrep Coverity 等
SCA Dependency-Check Trivy/Grype 商业平台
Fuzz libFuzzer AFL++ 协议专业套件
DAST ZAP Burp 等
密钥 受限 CI 密钥 Vault KMS+HSM

成熟度:L1 有 SAST+签名 → L2 门禁+SBOM+定期 Fuzz → L3 威胁建模驱动+度量 → L4 安全可观测与合规即代码。"每升一级响应时间缩短 X%"类调查结论样本依赖强,宜作激励性参考而非 KPI 承诺[8]。

8 局限、挑战与可改进方向

1. 主机 Fuzz 与真机行为不一致

局限:去掉外设与时序后,崩溃集与现场漏洞集合有偏差。 改进:P2IM 类外设建模[9];关键协议加 HIL 种子;发布前真机差分测试。

2. 门禁过严导致影子 IT

局限:一律阻断 HIGH 会催生"关闭检查"旁路。 改进:风险分级豁免(有时限、有责任人);安全债看板;主分支与发布分支策略分离。

3. SBOM 名实不符

局限:供应商组件、静态链接与工具链库常漏报,SCA 假阴性。 改进:从链接图/Yocto 清单生成 SBOM;抽检二进制与声明一致性[7]。

4. 长期设备与 CVE 洪水

局限:在网 10 年+ 设备无法对每个 CVE 热修。 改进:攻击面分级;网关终止 TLS;仅对可达/可利用项建 SLA;与合规支持期限对齐。

5. 安全指标难证明业务价值

局限:扫描告警数不等于风险下降。 改进:跟踪"可利用漏洞平均修复时间、逃逸到生产的缺陷数、Fuzz 新 crash 趋势";用事故复盘反推门禁缺口。

参考文献

[1] OWASP, "Internet of Things Top 10," OWASP Foundation, 相关年度版本. [2] NIST, "SP 800-218: Secure Software Development Framework (SSDF)," 2022. [3] A. Muñoz et al., "DevSecOps for IoT: A Systematic Literature Review," IEEE Internet of Things Journal, 2024. [4] AFL++, "American Fuzzy Lop Plus Plus," https://github.com/AFLplusplus/AFLplusplus [5] Semgrep, "Rule registry / IoT-oriented rules," https://semgrep.dev/ [6] A. Shostack, "Threat Modeling: Designing for Security," Wiley, 2014. [7] CycloneDX, "SBOM Specification," https://cyclonedx.org/ [8] SANS Institute, "IoT Security Survey," 2024 (调查类,注意样本局限). [9] B. Feng et al., "P2IM: Scalable and Hardware-independent Firmware Testing via Automatic Peripheral Interface Modeling," USENIX Security, 2020. [10] J. Chen et al., "IoTFuzzer: Discovering Memory Corruptions in IoT Through App-based Fuzzing," NDSS, 2018. [11] NIST, "SP 800-204D / 供应链与 DevSecOps 相关指南," 参阅现行卷册. [12] M. Muench et al., "What You Corrupt Is Not What You Crash: Challenges in Fuzzing Embedded Devices," NDSS, 2018.