3、威胁模型:未签名固件面临的风险,如模型篡改、恶意注入、中间人攻击等

TinyML 设备通常部署在物理边界模糊、网络环境不可控的场景中,例如智能传感器节点、边缘推理盒子、电池供电的监测终端等。当固件包(尤其是包含模型权重、推理引擎和启动加载器的完整镜像)未经数字签名保护时,攻击者便获得了操纵设备行为的潜在通道。理解这些威胁的具体形态、攻击路径和实际后果,是设计固件签名机制的前提。本章将系统梳理未签名固件面临的核心风险,并给出可操作的威胁建模方法。

未签名固件威胁模型全景图 攻击者入口 网络/物理/供应链 中间人攻击 OTA传输截获/篡改 模型篡改 权重替换/后门注入 恶意固件注入 完整替换/引导链劫持 TinyML 设备 启动加载器 推理引擎 模型权重 配置参数 (无签名校验) 攻击后果 推理结果错误 设备行为劫持 数据泄露 物理破坏 僵尸网络成员 关键风险链路说明 1. 中间人攻击:攻击者在OTA更新通道上截获固件包,修改模型权重或注入恶意代码后重新发送。 2. 模型篡改:攻击者直接修改设备存储中的模型文件,使推理结果产生偏差或植入后门触发条件。 3. 恶意固件注入:攻击者通过物理接口(UART/JTAG)或漏洞利用,将完整恶意固件写入Flash。 4. 所有攻击路径的共同前提:设备无法验证固件来源和完整性,即缺少数字签名校验机制。 防护核心:在启动加载器和OTA更新流程中强制实施签名验证。

3.1 核心原理:为什么签名是TinyML安全的基石

TinyML固件签名机制的本质,是在固件包中附加一段由可信私钥生成的数字签名,设备端使用对应的公钥在加载固件前进行验证。这一机制解决的是完整性和来源可信性两个核心问题:完整性确保固件在传输或存储过程中未被篡改,来源可信性确保固件确实来自合法的开发者或设备制造商。对于资源受限的MCU(通常只有几十KB RAM和几百KB Flash),签名验证通常采用非对称加密算法(如ECDSA P-256)或带密钥的哈希算法(如HMAC-SHA256),前者适用于公钥可公开分发的场景,后者适用于对称密钥预置的场景。

从攻击面来看,未签名固件相当于给攻击者敞开了三扇门:网络通道(OTA更新时的中间人攻击)、物理通道(调试接口或存储芯片的直接读写)、供应链通道(开发工具链或第三方库被污染)。签名机制并不能完全阻止攻击者获取设备物理访问权,但它能显著提高攻击成本——攻击者即使拿到了固件镜像,也无法在不被发现的情况下修改它,因为任何改动都会导致签名验证失败。

关键认知:签名不是加密。签名验证的是“谁写的”和“有没有被改过”,而不是“内容是否保密”。TinyML模型权重通常不是机密,但它们的完整性直接关系到设备的安全决策(如工业停机判断、医疗监测报警)。一个被篡改的模型可能让设备对危险情况视而不见,或对正常情况误报,这种后果往往比数据泄露更严重。

3.2 判断方法:识别未签名固件的风险暴露面

在实际项目中,判断一个TinyML系统是否面临未签名固件风险,可以从以下四个维度进行排查。下表总结了各维度的检查要点和风险等级判定标准。

检查维度 具体检查项 高风险特征 低风险特征
启动链路 Bootloader是否校验App固件签名 Bootloader直接跳转执行,无任何校验 Bootloader内置公钥,逐字节验证签名后才跳转
OTA更新通道 固件下载过程是否使用TLS/签名包 HTTP明文下载,固件包无签名字段 HTTPS+固件包内嵌签名,设备端验签
存储保护 Flash中的固件是否可被外部工具改写 未使能读保护,SWD/JTAG接口开放 使能RDP级别2,调试接口锁定
密钥管理 签名公钥/私钥的存储位置 私钥存放在开发电脑明文目录,公钥可被替换 私钥保存在HSM或安全存储区,公钥烧录在OTP区域

一个实用的判断方法是:尝试从攻击者的视角走一遍攻击路径。假设你获得了设备的物理访问权,能否通过UART进入shell?能否用ST-Link读取Flash内容?能否在OTA更新时用Wireshark抓到明文固件包?如果以上任何一个问题的答案是“能”,那么你的设备就暴露在未签名固件的风险之下。更系统的做法是使用微软的STRIDE威胁建模方法,对每个威胁类型(欺骗、篡改、否认、信息泄露、拒绝服务、权限提升)逐一评估固件更新流程中的对应风险。

3.3 案例拆解:智能电表模型篡改攻击实录

为更具体地说明未签名固件的危害,这里拆解一个典型的攻击案例。某电力公司部署了10万只基于TinyML的智能电表,用于窃电检测。电表内置一个轻量级神经网络,输入为电压、电流、功率因数等时序特征,输出为“正常/疑似窃电”的二分类结果。固件通过GPRS网络进行OTA升级,但升级包未做任何签名保护。

攻击过程:

  1. 嗅探与逆向:攻击者用软件无线电设备嗅探GPRS通信,捕获到一个完整的OTA固件包(约200KB)。通过binwalk分析,提取出模型权重文件(约80KB的float32数组)。
  2. 模型篡改:攻击者使用TensorFlow加载原始模型,将最后一层全连接层的权重矩阵乘以0.1,使模型的输出概率整体降低。重新打包固件后,计算新的CRC32校验值并替换原值。
  3. 中间人注入:攻击者在电表附近架设伪基站,迫使电表连接到攻击者的GPRS网关。当电表请求OTA更新时,攻击者将篡改后的固件包发送给电表。
  4. 结果:电表Bootloader未校验签名,直接跳转到新固件执行。此后,该电表对窃电行为的检测准确率从92%下降到34%,大量窃电行为被漏报。攻击者在三个月内窃取了价值约15万元的电能。

复盘与教训:

  • 如果固件包带有ECDSA签名,攻击者在没有私钥的情况下无法生成有效签名,篡改后的固件会在Bootloader阶段被拒绝加载。
  • 即使攻击者无法篡改模型,仅通过重放旧版本固件(降级攻击)也可能造成安全漏洞。因此签名机制还应包含版本号防回滚逻辑。
  • 该案例中,攻击者利用的是OTA通道的明文传输和Bootloader的“无脑信任”。修复方案是双管齐下:传输层启用TLS,固件包增加签名校验。
风险提示:不要以为“我们的设备是专网,攻击者进不来”就忽略签名。专网也可能被渗透,内部人员也可能成为攻击者。签名机制是纵深防御体系中的最后一道闸门,即使网络层被突破,固件层的完整性校验仍然能阻止恶意代码执行。

3.4 常见误区与总结复盘

在辅导多个TinyML项目落地固件签名时,我发现团队常陷入以下四个误区,这些误区往往导致签名机制形同虚设或实施失败。

误区 错误认知 正确做法
签名=加密 认为固件签名会暴露模型权重,因此拒绝实施 签名不改变固件内容,只附加验证信息;如需保密,可叠加加密层
只在OTA时验签 认为下载时验证过签名就万事大吉 必须在Bootloader加载固件时再次验签,防止Flash被直接改写后绕过OTA流程
公钥随意存储 将公钥放在文件系统或外部EEPROM中 公钥应烧录在芯片OTP区域或安全Flash区,防止被替换为攻击者的公钥
忽略回滚保护 只验证签名不检查版本号 在签名结构中包含版本号字段,Bootloader拒绝加载低于当前版本的固件

总结复盘:未签名固件的威胁模型可以概括为“一个前提、三条路径、四类后果”。一个前提是设备缺少对固件来源和完整性的验证能力;三条路径分别是网络中间人攻击、物理存储篡改、供应链投毒;四类后果包括推理结果错误、设备行为劫持、敏感数据泄露、设备沦为僵尸网络节点。在设计TinyML产品时,建议将签名验证作为启动流程的强制步骤,而不是可选项。具体实施时,优先选择硬件加速的加密引擎(如ARM TrustZone、NXP EdgeLock),在资源允许的情况下使用ECDSA P-256而非RSA-2048,因为前者在MCU上的验证速度更快且密钥更短。最后,务必建立密钥轮换和吊销机制,防止私钥泄露后整个设备群面临风险。

经验之谈:在项目早期就引入签名机制,比后期补救要节省大量成本。如果产品已经量产,再想添加签名验证,往往需要更换Bootloader、重新烧录公钥,甚至需要物理召回设备。对于资源极受限的MCU(如Cortex-M0,Flash仅64KB),可以考虑使用HMAC-SHA256对称签名方案,虽然密钥管理不如非对称灵活,但计算开销和代码体积都更小。