1. 项目概述:为微控制器上的机器人系统筑起第一道防线
在机器人、无人机和各类工业物联网设备中,微控制器单元(MCU)正扮演着越来越核心的角色。它们负责执行实时控制、数据采集和边缘计算,是连接物理世界与数字世界的神经末梢。随之而来的一个严峻挑战是:我们如何确保这些资源极度受限的设备,其内部运行的软件是可信、未被篡改的?想象一下,一个被植入恶意代码的机械臂控制器,或是一个固件被修改的物流机器人,它们一旦接入网络,就可能成为破坏生产、窃取数据甚至造成物理伤害的“特洛伊木马”。
传统的网络安全方案,如传输层加密(TLS)或基于策略的访问控制(如ROS 2的SROS2),主要保护的是“通信管道”和“访问权限”。它们默认了一个前提:通信的端点本身是可信的。然而,如果设备本身的固件在启动时就被动了手脚,那么所有后续的加密通信和权限检查都建立在流沙之上。这就是“固件完整性”问题的核心——在允许设备加入网络、开始通信之前,我们必须先验明它的“正身”。
远程证明(Remote Attestation)正是解决这一问题的关键技术。它允许一个远程的验证者(如服务器或网关)向一个设备(证明者)发起挑战,要求其提供密码学证据,证明自己正在运行预期的、未经篡改的软件。这个过程依赖于设备内部一个不可篡改的硬件“信任根”(Root of Trust, RoT),由它来测量固件并生成可信的证据。
然而,将这套理论应用于MCU和机器人操作系统(如micro-ROS)时,我们遇到了双重困境。一方面,主流的远程证明方案(如基于TPM的DDS-Security+)依赖专用安全芯片,在成本、功耗和尺寸都受限的MCU上难以落地。另一方面,尽管学术界提出了许多针对MCU的证明方案,但它们大多是独立的研究原型,并未与micro-ROS所依赖的通信中间件——Micro XRCE-DDS——深度集成。这意味着,在micro-ROS生态中,缺乏一个标准化的、在网络准入时刻强制执行固件完整性的机制。
SERA(Secure Micro XRCE-DDS Establishment with Remote Attestation for Micro-ROS)正是为了填补这一空白而生。它不是一个全新的密码学协议,而是一个精巧的“安全网关”设计。SERA的核心思想,是将远程证明过程无缝地嵌入到Micro XRCE-DDS的会话建立握手流程中。简单来说,当一个micro-ROS客户端(运行在MCU上)试图连接代理(Agent)并加入DDS网络时,它不能像以前那样直接“握手成功”。代理会先抛出一个随机数挑战,客户端必须利用其硬件信任根,生成一个能证明自身固件完整性的“令牌”来回应该挑战。只有令牌验证通过,握手才完成,客户端才被允许进入网络。这就好比进入一个高端俱乐部,不仅要出示会员卡(身份认证),还要通过一个即时的人脸识别(固件证明),双重确认无误后方可入内。
2. 核心设计思路:将证明变为握手的一部分
SERA的设计哲学非常明确:安全不应是事后补救,而应是准入前提。它的目标不是取代通信加密或访问控制,而是在它们生效之前,建立一个更基础、更底层的信任基石。为了实现这一目标,SERA的架构围绕几个核心原则展开。
2.1 威胁模型与安全目标定义
在设计任何安全机制前,明确“防谁”和“防什么”至关重要。SERA的威胁模型主要针对两类攻击者能力:
- 网络攻击者:遵循经典的Dolev-Yao模型,攻击者完全控制客户端与代理之间的通信信道。他可以窃听、篡改、重放、丢弃或任意注入消息。但他无法破解标准的密码学原语(如ECDSA签名)。
- 设备物理攻击者:攻击者可以暂时物理接触设备,并对其闪存进行离线修改,刷入被篡改的恶意固件。但他无法攻破设备内部的硬件信任根(如安全启动ROM、唯一的设备密钥)。
基于此,SERA主要抵御两种具体攻击,对应STRIDE威胁模型中的“篡改”和“欺骗”:
- 固件篡改攻击:攻击者修改了MCU上的固件镜像。SERA必须能检测到这种篡改,并阻止该设备加入网络。
- 重放/冒充攻击:攻击者窃听并录下了一次合法设备的完整握手(包括证明令牌),然后试图在另一个设备或稍后的时间点重放这个令牌来通过验证。SERA必须确保证明的“新鲜性”,使旧令牌无效。
SERA的安全目标可以概括为一句话:确保只有运行着经过验证的、未经篡改的固件的合法设备,才能成功完成Micro XRCE-DDS握手,加入DDS网络。所有不满足此条件的设备,无论其网络行为如何,都应在握手阶段被拒之门外。
2.2 信任根的标准化选择:DICE与Arm PSA
在MCU上实现远程证明,最大的挑战在于建立一个低成本、高可信的信任根。SERA没有另起炉灶,而是明智地选择了两个工业界成熟且标准化的方案作为基础:DICE和Arm PSA。
DICE更像是为没有专用安全硬件的MCU设计的一套“软件定义”的信任链构建方法论。它的核心流程如同一个精密的信任传递仪式:
- 设备出厂时烧录一个唯一的设备秘密(Unique Device Secret, UDS),这个秘密永远不出芯片。
- 在启动时,一个不可变的引导加载程序(Bootloader)计算整个待运行固件镜像的密码学哈希值。
- 将这个哈希值与UDS一起,输入一个密钥派生函数(如HKDF),生成一个复合设备标识符(Compound Device Identifier, CDI)。
- 从CDI可以派生出各种密钥,包括用于远程证明的证明密钥(Attestation Key, AK)。
这个过程的美妙之处在于,证明密钥与固件哈希是强绑定的。只要固件有一个字节被改动,哈希值就变,CDI就变,最终派生出的证明密钥也就完全不同。因此,用这个密钥签名的令牌,天然就证明了“是哪个设备”以及“运行着哪个版本的固件”。
Arm PSA则是一套更完整的、由Arm主导的物联网安全框架。它通常依赖于像Arm TrustZone-M这样的硬件安全扩展,将系统划分为“安全世界”和“非安全世界”。关键的密码学操作和密钥存储都在受硬件隔离保护的安全世界中完成。PSA定义了一套标准的证明服务API,设备可以通过调用这些API,获得一个格式标准的初始证明令牌(Initial Attestation Token, IAT)。对于开发者而言,使用PSA意味着更少的底层开发工作,因为复杂的密钥管理和令牌生成都被TF-M(Trusted Firmware-M)这样的参考实现封装好了。
SERA选择这两者,体现了其实用主义的设计思路:为不同硬件能力的MCU提供可选的、标准化的信任根方案。低端MCU可用DICE,而具备TrustZone-M的高端MCU则可直接利用PSA提供的“交钥匙”服务。
2.3 握手协议的增强:挑战-响应三部曲
SERA最核心的创新,在于它如何将上述信任根与Micro XRCE-DDS握手协议融合。标准的握手流程很简单:客户端发送创建会话请求,代理回复确认,会话建立。SERA在其中插入了远程证明的“挑战-响应”环节,将其转变为一个安全的三阶段协议:
第一阶段:创建挑战当micro-ROS客户端发起标准的CREATE会话请求时,代理不会立刻回复CREATE确认。相反,它会生成一个密码学安全的随机数(Nonce),并将其封装在一个修改过的握手响应消息中,发回给客户端。这个Nonce就是本次证明的“挑战”,它确保了每次证明的独一无二性,是防御重放攻击的关键。
第二阶段:令牌生成与响应客户端收到挑战Nonce后,会调用本地的证明逻辑。根据所采用的信任根方案(DICE或PSA),客户端的RoT会使用其证明私钥,对“固件哈希值”和“收到的Nonce”进行签名(通常使用确定性ECDSA,算法为secp256r1 with SHA-256)。生成的数字签名就是“证明令牌”。客户端将此令牌随同一个最终的握手消息发送给代理。
注意:这里的“固件哈希值”是在设备启动时由信任根计算并安全存储的,不是临时计算的。这保证了即使运行时的应用被攻破,也无法伪造一个正确的哈希值。
第三阶段:验证与会话门控代理收到令牌后,进行三重验证:
- 密码学验证:使用预先配置的、与该设备对应的公钥,验证ECDSA签名的有效性。
- 新鲜性验证:检查签名中的Nonce是否与自己刚才发出的挑战值一致。
- 完整性验证:提取签名数据中的固件哈希值,与代理本地白名单中该设备对应的预期哈希值进行比对。
只有这三项全部通过,代理才认为该客户端是可信的,继而完成Micro XRCE-DDS会话的建立。任何一项失败,握手都会立即终止,客户端无法创建任何DDS实体(如发布者、订阅者),相当于被挡在了网络大门之外。
这个设计将安全验证的时机提到了最早的可能的时刻——网络接入时。它创造了一个清晰的信任边界:网络内部的所有通信,都建立在端点初始可信的基础上。
3. 三种实现方案:从基线到硬件强隔离
SERA并非一个僵化的单一实现,而是提供了一套渐进的安全实施方案,我们称之为“配置方案”。这三种方案在抵御我们定义的威胁模型(固件篡改、重放攻击)方面同样有效,它们的核心区别在于运行时对证明密钥和逻辑的保护强度。这为开发者根据MCU的硬件能力和项目的安全需求进行选择提供了灵活性。
3.1 方案一:基于DICE的基线方案
这是兼容性最广、对硬件要求最低的方案,适用于几乎所有MCU,甚至是那些没有任何内存保护单元(MPU)或TrustZone的廉价芯片。
架构与流程: 在此方案中,整个系统运行在单一的、无特权的执行环境中。启动流程如下:
- 一个具备DICE功能的引导加载程序(作为RoTM)在启动时计算整个应用固件(包括RTOS、Micro XRCE-DDS客户端库和用户代码)的SHA-256哈希。
- 引导加载程序使用HKDF-SHA-512,将固件哈希与设备唯一的UDS结合,派生出CDI。
- 从CDI派生出用于证明的ECDSA密钥对(secp256r1)。私钥(AK)被存储在MCU的某个存储区(如Flash)。
- 引导加载程序将控制权移交给主应用程序。
当需要进行远程证明时,应用程序代码直接读取存储的证明私钥,并使用它和代理发来的Nonce、以及启动时计算好的固件哈希,生成ECDSA签名令牌。
优势与局限:
- 优势:实现简单,无需特殊硬件支持,为最广泛的设备提供了基础的固件完整性验证能力。
- 局限:证明私钥与应用程序共存于同一内存空间。如果应用程序在证明完成后,在运行时被漏洞利用攻破,攻击者有可能窃取到证明私钥,或者干扰未来的证明过程。此方案提供了“启动时完整性”,但无法保证“运行时的机密性”。
3.2 方案二:基于DICE与MPU的软件强制隔离方案
此方案面向大多数现代Cortex-M系列MCU,它们通常都配备了内存保护单元。MPU允许我们将内存划分为不同区域,并设置不同的访问权限(如只读、只写、不可执行)和特权级别(特权模式、非特权模式)。
架构与流程: 此方案在方案一的基础上,引入了运行时隔离:
- 启动和密钥派生过程与方案一相同。
- 关键的一步是,在应用程序启动前,系统配置MPU,将包含证明私钥和证明服务代码的内存区域标记为“仅特权模式可访问”。
- 随后,主应用程序(包括micro-ROS客户端)被降级到非特权模式运行。
- 当需要生成证明令牌时,运行在非特权模式的应用无法直接访问密钥。它必须通过发起一个“监管调用”(Supervisor Call, SVC)陷入到特权模式。
- 特权模式下的证明服务处理程序(作为RoTR)在受保护的内存空间中执行签名操作,然后将生成的令牌返回给非特权应用。
优势与局限:
- 优势:通过MPU实现了特权级隔离。即使非特权应用被完全攻破,攻击者也无法直接读取或修改受保护的证明私钥,因为MPU硬件会阻止非法访问。这显著提升了运行时密钥的机密性。
- 局限:隔离依赖于软件对MPU的正确配置。如果配置存在漏洞,或者攻击者通过其他方式(如利用特权代码漏洞)提升了权限,隔离仍可能被绕过。这是一种“软件强制”的隔离。
3.3 方案三:基于PSA与TrustZone-M的硬件强制隔离方案
这是安全性最高的方案,要求MCU支持Arm TrustZone-M技术。TrustZone-M在硬件层面将处理器、内存和外设划分为“安全世界”和“非安全世界”,两个世界之间的访问受到严格限制。
架构与流程: 此方案基于Arm PSA框架及其参考实现TF-M:
- 安全世界:运行TF-M,它包含安全启动、安全存储和PSA证明服务。TF-M在启动时测量非安全世界的固件镜像(作为RoTM),并将证明私钥安全地存储在其加密的安全存储中(作为RoTS)。
- 非安全世界:运行普通的Zephyr RTOS和micro-ROS客户端应用。
- 当需要证明时,非安全世界的应用通过一个定义好的“安全网关”(Secure Gateway)接口,调用安全世界中的PSA证明服务(作为RoTR)。
- 证明服务使用安全存储中的密钥,对Nonce和固件测量值进行签名,生成标准的PSA初始证明令牌(IAT),然后通过安全网关返回给非安全世界。
优势与局限:
- 优势:提供了硬件强制的隔离。非安全世界的代码被完全阻挡在安全世界的边界之外。即使非安全世界被彻底攻陷,攻击者也无法触及安全世界中的密钥或篡改证明逻辑。这提供了接近专用安全芯片(如TPM)的安全保障。
- 局限:依赖于特定的硬件特性(TrustZone-M),且软件栈更复杂(需要集成和维护TF-M)。这会带来额外的开发复杂性和可能的内存开销。
选择指南: 对于开发者而言,选择哪种方案是一个典型的“安全-成本-复杂度”权衡:
- 追求最大兼容性和最低成本:选择方案一(DICE基线)。
- 使用主流Cortex-M3/M4/M7等芯片,希望提升运行时安全:选择方案二(DICE+MPU)。
- 使用Cortex-M23/M33/M55等支持TrustZone的芯片,且项目对安全性要求极高:选择方案三(PSA+TrustZone)。
4. 实现细节与关键考量
将SERA从设计图纸变为可运行的代码,涉及到一系列工程上的关键决策和细节处理。这些细节往往决定了方案的可行性、安全性和性能。
4.1 密钥生命周期管理:从出厂到验证
证明系统的安全性,归根结底依赖于密钥的安全���SERA为不同方案设计了相应的密钥管理流程。
对于DICE方案(方案一、二):
- 设备唯一秘密:每个MCU在出厂时,都需要注入一个全球唯一的设备秘密(UDS)。这个秘密通常存储在芯片的OTP(一次性可编程)存储器或受保护的Flash区域,永远不能离开芯片。
- 证明密钥派生:在每次设备启动时,由可信引导加载程序执行DICE流程。使用UDS和本次启动的固件哈希,通过HKDF派生出本次运行的证明密钥对。私钥永远停留在芯片内存中,用于签名;公钥则需要在设备部署前,提供给代理端。
- 代理端白名单:代理需要维护一个“白名单”,其中记录了每个合法设备的标识符(如序列号)、其对应的预期固件哈希值、以及从该固件版本派生出的公钥(或公钥证书)。验证时,代理就是根据设备标识符查找这些信息进行比对。
对于PSA方案(方案三):
- 密钥置备:证明密钥对通常在TF-M的安全世界内生成,或由设备制造商注入。私钥被安全地存储在PSA安全存储中,永不暴露给非安全世界。
- 证书链:通常,设备会拥有一张由制造商或信任根CA签发的证明证书。这张证书(或整个证书链)需要预先部署到代理端,作为验证令牌签名的信任锚。
- 令牌验证:代理收到PSA IAT后,不仅验证签名,还要验证证书链的有效性,并最终确认签发者是否可信。
实操心得:在实际部署中,管理成千上万个设备的公钥和白名单是一个运维挑战。一个可行的实践是引入一个轻量级的公钥基础设施(PKI)或使用证书透明度(CT)日志。设备在首次入网时,可以向一个中央注册服务进行证明,由该服务验证其证书后,再将其公钥信息同步给负责该区域的代理。
4.2 性能开销的量化与分析
任何安全机制都会引入开销,在资源受限的MCU上,量化并评估这些开销至关重要。SERA团队在NUCLEO-L552ZE-Q(Cortex-M33)开发板上进行了详尽的测试。
握手延迟: 这是最直观的体验指标——设备从发起连接到加入网络,需要多等多久?
- 基线(无证明):约15毫秒。这只是建立Micro XRCE-DDS会话的基本通信和处理时间。
- 方案一(DICE):约383毫秒。主要开销来自在MCU上计算ECDSA签名。
- 方案二(DICE+MPU):约452毫秒。比方案一多了约70毫秒,这主要是MPU上下文切换和SVC调用的开销。
- 方案三(PSA+TrustZone):约795毫秒。开销显著增加,主要原因是世界切换(从非安全世界到安全世界再返回)的成本,以及在安全世界内执行密码学操作的额外开销。
解读:尽管方案三的延迟最高(接近800毫秒),但对于大多数机器人或物联网应用来说,这是一个发生在设备启动阶段的一次性开销。对于一个需要持续运行数小时甚至数天的机械臂或自动驾驶小车来说,不到1秒的额外启动时间,换取端点的固件完整性保证,通常是可接受的权衡。值得注意的是,这个延迟与在x86平台上使用TPM 2.0进行远程证明的耗时(约520毫秒)处于同一数量级,这表明SERA在资源受限的MCU上实现了相当高效的证明。
初始化开销与固件大小:
- 初始化开销:指从系统上电到主应用开始运行所消耗的CPU周期。由于SERA引入了安全启动、固件哈希计算、密钥派生等操作,其初始化周期数比基线增加了16到24倍。这同样是一次性成本,不影响运行时的性能。
- 固件大小:SERA的代码会显著增加固件体积。基线测试固件约124KB,而三个方案的固件大小分别增加到215KB、271KB和291KB。增加的部分主要来自密码学库(如mbedTLS)、DICE逻辑或TF-M运行时。对于现代MCU(通常拥有512KB甚至1MB的Flash)而言,这个增长是可控的。有趣的是,方案二和方案三的大小差距不大(约20KB),说明从MPU隔离升级到TrustZone隔离,在存储空间上的边际成本较低。
4.3 安全有效性验证
理论设计再完美,也需要实践检验。SERA通过两组针对性实验,验证了其抵御核心威胁的能力。
对抗固件篡改: 研究人员修改了客户端的固件镜像,例如改变其发布的ROS话题名称,或增加额外的恶意功能模块。这些修改虽然不影响设备基本启动和运行,但改变了固件的二进制内容,从而导致其哈希值与代理白名单中记录的值不匹配。实验结果表明,所有运行被篡改固件的设备,在握手阶段都被SERA代理成功拦截,无法创建任何DDS实体,彻底被隔绝在网络之外。
对抗重放与冒充攻击:
- 简单重放:攻击者录制一次合法握手的完整消息(包括证明令牌),然后在一个新会话中,当代理发出新的Nonce挑战时,尝试重放旧的令牌。由于SERA的令牌是将Nonce和固件哈希一起签名的,用旧令牌应答新Nonce,签名验证必然失败。
- 跨设备冒充:攻击者窃取设备A的合法令牌,试图用在设备B的握手过程中。代理在验证时,会根据设备B的标识符去查找对应的公钥和预期哈希。用设备A的私钥签名的令牌,无法通过设备B的公钥验证,攻击同样失败。
这些实验强有力地证明了SERA能够实现其设计目标:在网络准入关口,有效筛除固件被篡改或身份伪造的恶意设备。
5. 部署考量、局限与未来方向
SERA为micro-ROS在MCU上的安全部署提供了一个强大的基础组件,但在实际应用和未来演进中,仍有诸多问题需要思考。
5.1 当前方案的局限性与适用场景
单次证明与持续监控:SERA目前只在会话建立时进行一次证明。如果一个设备在成功加入网络后,在运行时被攻破(例如通过软件漏洞提权),SERA是无法检测的。这是一个设计上的权衡,旨在平衡安全性与复杂性和性能。对于许多静态功能、启动后代码不变的嵌入式设备来说,启动时的一次性证明已经提供了巨大的安全提升。但对于需要动态加载代码或面临高级持续威胁的系统,这显然不够。
传输层与可扩展性:目前的原型实现和评估基于UART串口通信。UART是点对点或通过集线器连接少量设备的常见方式。在UART场景下,代理串行处理多个客户端的握手,延迟随客户端数量线性增加。对于需要连接数十上百个设备的大规模集群,或者使用UDP/TCP网络传输的场景,代理的处理模型和性能需要重新评估。未来的工作需要考虑支持并发处理和高吞吐量的传输层。
白名单管理的挑战:当前SERA依赖代理维护一个静态的白名单。在敏捷开发环境中,固件频繁更新,管理这个白名单会成为运维负担。一个更优雅的解决方案是与固件签名基础设施(如MCUboot)集成。代理不再需要存储每个固件的哈希值,而是只信任一个或多个根证书。客户端在证明时,除了提供运行时哈希,还可以提供一个由可信方签名的固件清单,代理只需验证签名即可。这能将固件版本管理从网络准入策略中解耦出来。
5.2 与其他安全机制的关系与定位
理解SERA在整体安全架构中的位置非常重要,它不是替代品,而是补充和基石。
- 与SROS2的关系:SROS2是ROS 2的官方安全框架,提供基于身份的认证、通信加密和主题级的访问控制。但SROS2假设“节点的软件本身是善意的”。SERA的作用就是在SROS2的访问控制策略生效之前,先确保这个假设成立。可以理解为:SERA是“入场安检”,确保进来的人是健康的;SROS2是“场馆内的��限管理”,规定健康的人能在哪里活动、做什么。
- 与传输层安全(TLS)的关系:有研究(如Nandi等人的工作)为Micro XRCE-DDS实现了基于TLS的安全传输。TLS保护的是通信通道的机密性和完整性,防止窃听和篡改。但它同样不验证端点本身的完整性。一个理想的纵深防御体系是:首先用SERA验证设备固件完整性并建立会话,然后在该会话上启用TLS加密所有后续的DDS通信数据。
5.3 未来演进方向
基于现有基础,SERA有几个明确的演进方向:
- 运行时再证明与动态信任:引入周期性的或由事件触发的再证明机制。例如,代理可以定期(如每小时)或当检测到节点行为异常时(通过轻量级异常检测),要求客户端重新进行证明。这可以将“一次性信任”扩展为“持续信任”。
- 双向证明:目前是客户端向代理证明自己。在未来,也可以让代理向客户端证明自己,建立双向的信任关系,防止客户端连接到恶意的“钓鱼”代理。
- 群组证明与可扩展性:对于大规模设备集群,让代理逐个验证每个设备效率低下。可以研究集成群组证明或 swarm 证明协议,允许代理一次性验证一组设备的整体状态,或者通过抽样方式进行验证,大幅提升可扩展性。
- 支持更多传输方式:将SERA适配到UDP和TCP传输,以支持更灵活的网络拓扑和更高效的并发处理。
SERA的提出,标志着MCU和微ROS生态在安全方面迈出了从“通信安全”到“端点安全”的关键一步。它通过巧妙的协议集成和务实的方案选择,证明了在资源受限的设备上实施强固件完整性验证不仅是必要的,而且是可行的。随着物联网和机器人系统的进一步普及,这种在源头建立信任的“安全左移”思想,将成为构建真正可信的智能系统的基石。