编辑推荐: |
本文主要介绍了MCU安全启动相关内容。希望对您的学习有所帮助。
本文来自于微信公众号凯文的汽车之旅,由火龙果软件Linda编辑、推荐。 |
|
01 MCU安全启动介绍
MCU(Microcontroller Unit,微控制器单元)安全启动是指在微控制器上实现一种机制,确保系统在启动过程中不被恶意代码或未授权的修改所影响。安全启动可以防止不受信任的固件或操作系统的加载,从而增强系统的安全性。下面是一些实现
MCU 安全启动的关键概念和方法:
1. 安全启动(Secure Boot)的基本概念
安全启动是一种硬件和软件相结合的机制,其目的是在系统启动时验证启动代码(通常是固件、引导加载程序等)的完整性和真实性。这样可以防止不安全、篡改或恶意的代码在启动过程中运行。其基本流程如下:
引导加载程序验证:MCU的启动程序会首先通过硬件(如内置的安全引导功能)验证引导加载程序的签名。
固件验证:如果引导加载程序的签名验证通过,它会加载系统固件(如操作系统镜像),并对固件的签名进行验证。
加载应用程序:如果固件验证通过,它会加载和执行系统应用程序。
2. 实现安全启动的基本方法
以下是一些常见的技术和方法,可以用于在 MCU 上实现安全启动:
(1) 硬件支持的安全启动
许多现代 MCU 都配备了硬件加速的安全启动功能。例如,ARM Cortex-M 系列微控制器可以通过
TrustZone 技术支持安全启动。常见的硬件支持包括:
OTP(One-Time Programmable)存储器:一些MCU在生产时可以将密钥或加密证书存储在不可修改的
OTP 存储器中。这些密钥可以用来验证固件签名。
加密硬件引擎:许多MCU配备硬件加速的加密引擎(如AES或 RSA),用于签名验证过程。这样可以提高安全启动的效率。
内置安全引导功能:某些MCU自带安全引导功能,可以在启动时自动验证固件的完整性。如果固件不匹配或未通过验证,MCU会停止启动过程。
(2) 使用数字签名
数字签名是确保固件或启动程序未被篡改的重要手段。常见的流程包括:
签名生成:在开发过程中,使用私钥对固件或启动程序进行签名。通常,开发者会使用 RSA 或 ECC(椭圆曲线加密)等加密算法来生成签名。
签名验证:在 MCU 启动时,使用公钥验证固件的签名。公钥可以存储在 MCU 的内存中(如非易失性存储器或
OTP),或者存储在外部安全模块中。
(3) 固件加密
除了数字签名,固件本身也可以进行加密,以保护固件的机密性和完整性。加密后的固件只能在提供相应解密密钥的情况下加载。
加密与解密过程:MCU在启动时首先加载加密的固件,然后使用内置的加密模块(如 AES 引擎)解密固件,最后进行签名验证。
密钥管理:加密密钥的管理非常重要,通常通过硬件安全模块(如 HSM)或使用可信平台模块(TPM)来保证密钥的安全。
(4) 多阶段启动
多阶段启动通常会在安全启动中使用多层次的安全措施,确保每一阶段的代码都经过验证:
阶段 1:硬件引导加载程序(Boot ROM):通常是内置在 MCU 中的,只执行非常基础的操作(如初始化硬件和加载初始启动程序)。它会先验证阶段
2 的启动代码(如加载程序)的签名。
阶段 2:引导加载程序:这部分代码负责加载操作系统或应用程序,它会验证操作系统映像的签名,并加载验证通过的系统映像。
3. 常见的 MCU 安全启动平台和标准
许多现代 MCU 提供了内置的安全启动支持,以下是一些常见的 MCU 安全启动平台和标准:
ARM TrustZone:ARM 的 TrustZone 技术为处理器提供了硬件隔离的安全区域。利用
TrustZone,可以确保在启动过程中,只有经过验证的固件能够运行。
TPM(Trusted Platform Module):TPM 是一个硬件安全模块,提供强大的密钥管理和加密支持,可以用来实现安全启动。
Intel Boot Guard:Intel 提供的硬件安全功能,用于确保在启动过程中只运行经过验证的固件。
U-Boot:U-Boot 是一种流行的开源引导加载程序,可以支持多种启动验证和安全启动功能。它支持通过签名和验证启动映像来实现安全启动。
4. MCU 安全启动的实施步骤
设计和配置安全启动功能:选择支持硬件加密和安全启动的 MCU,配置其安全引导功能。
生成密钥对:为固件签名生成私钥和公钥对,确保只有授权人员能够生成有效的固件签名。
签署固件映像:使用私钥对固件进行签名。
固件加密(可选):如果需要,可以对固件进行加密处理。
在MCU上配置公钥:将公钥或证书配置到 MCU 上,以便在启动时进行签名验证。
验证启动过程:在每次启动时,MCU会验证引导加载程序和固件的签名,确保只有经过授权的代码能够运行。
5. 注意事项
密钥保护:密钥的保护是安全启动的关键。如果密钥泄露或被篡改,安全启动机制就失去了作用。因此,密钥必须存储在安全的硬件模块中。
固件更新:安全启动机制需要确保固件更新的安全性。可以使用安全的固件更新协议来确保更新过程不会被篡改。
系统性能:安全启动引入的验证过程可能会增加启动时间和计算负担,因此需要在安全性和性能之间找到平衡。
MCU 安全启动的核心目标是确保系统启动时,只加载可信的固件和代码,从而增强设备的抗攻击能力。通过硬件加速的加密和签名验证机制,MCU
安全启动可以有效防止恶意代码的加载,保护系统的完整性和安全性。
安全启动目标
CIA安全属性:安全启动为了保护固件、程序等的完整性,;
安全启动时间要求:代码在运行前需完成验证,此外上电后NM报文也有时效性要求,如50-100ms内接收到第一帧信号;
安全启动安全要求:密钥生成和保存的安全性,信任锚的安全
安全模块:HSM、TPM等
这里展开讲解一下信任锚
信任锚的基本概念
在大多数安全模型中,信任锚是一个被认为是绝对可信的元素或组件。它通常不依赖于其他系统或过程的验证,意味着信任锚一旦被验证或信任,它能够为后续的验证链提供基础。
常见的信任锚应用
1. 硬件安全模块(HSM)
硬件安全模块(HSM)是一种专门设计的设备,用于加密操作、密钥存储和签名验证等任务。在HSM中,存储的私钥和根证书通常被视为信任锚。它们是整个加密过程的基础,确保在加密和解密过程中,密钥不会被泄露或篡改。
2. 可信平台模块(TPM)
TPM是一种用于计算机和嵌入式系统的专用硬件设备,它为设备提供硬件级的安全功能,常用于验证系统的完整性、生成和存储加密密钥等。在TPM中,存储的根密钥(Root
Key)就是信任锚。TPM提供了可信的启动、远程认证和数据保护等功能,是许多安全架构的基础。
示例:当计算机启动时,TPM可以用来验证启动固件(如BIOS或UEFI)的完整性,确保没有恶意修改。这时,TPM中存储的密钥或证书充当信任锚,验证启动过程的安全性。
3. 数字证书体系中的信任锚
在公钥基础设施(PKI)中,信任锚通常是根证书。根证书是由一个受信的证书颁发机构(CA)签发的,它验证证书链的真实性。根证书本身是不需要进一步验证的,因为它是整个证书信任体系的起点。
示例:在浏览器中访问一个HTTPS网站时,浏览器会使用内置的根证书来验证网站的SSL/TLS证书。如果证书链从根证书到网站证书是完整的并且没有被篡改,浏览器就会认为该网站是可信的。
4. 嵌入式系统中的安全启动
在嵌入式设备(如MCU)中,信任锚通常是存储在芯片上的密钥或证书,用于验证引导加载程序(Bootloader)或固件的签名。在安全启动过程中,信任锚帮助验证启动代码的完整性,确保系统不会被恶意修改。
示例:在使用安全启动(Secure Boot)的系统中,MCU的信任锚可能是一个存储在硬件中的公钥,启动时它用于验证固件映像的数字签名。如果签名有效,设备才会继续启动。
5. 移动设备中的信任锚
在移动设备(如智能手机)中,信任锚通常与硬件安全模块(如Secure Enclave或Trusted
Execution Environment,TEE)一起使用,来保护敏感数据、支付信息和身份认证等。
示例:在一个Android或iOS设备中,信任锚可能是嵌入式在处理器中的一个唯一ID或者是加密密钥。这些信任锚用于确保设备的启动、认证、应用程序的下载和执行等操作的安全性。
信任锚的作用
提供根信任:信任锚是所有后续验证的根源。通过它可以建立信任链,逐步验证其他组件的可信度。
保证数据完整性和防篡改:信任锚帮助验证固件、操作系统、证书等的数据完整性,防止恶意篡改。
加密密钥管理:信任锚通常涉及密钥管理,它负责密钥的生成、存储和使用,确保密钥不会泄露或被滥用。
支持远程认证:信任锚能够帮助设备进行远程认证,确保设备与可信的服务器之间的通信没有遭到中间人攻击(MITM)。
信任锚的实现方式
硬件信任锚:存储在专用硬件中,通常不容易被提取或修改。硬件信任锚的优势是它们不依赖于操作系统或软件的安全性,能够提供更高的安全性。
例子:TPM、HSM、ARM TrustZone、Secure Enclave、Intel TXT等。
软件信任锚:在操作系统或应用程序中实现,通过软件技术(如加密、签名验证)提供基础信任。虽然它们相对容易被攻击或绕过,但在某些场景下,软件信任锚仍然是有效的。
例子:证书链中的根证书、操作系统内存中的加密密钥等。
可信启动与信任锚的关系
在安全启动(Secure Boot)过程中,信任锚起到了至关重要的作用。信任锚通常是固件或硬件中存储的密钥、证书或者根公钥,系统通过验证这些信任锚来确保启动过程中的各个阶段都是可信的。
根信任:例如,系统会通过存储在硬件中的公钥来验证启动代码的签名。只有签名正确的代码才能被执行,这样可以防止恶意代码或篡改的固件被加载。
链式验证:在多阶段的启动过程中,信任锚作为每个阶段的基础,逐步验证加载的代码和固件。
信任根、信任锚、信任链三者关系
信任链
安全启动的实现方式
硬件支持的安全启动:
使用专门的硬件模块(如HSM)来存储和管理加密密钥。
HSM可以提供更高的安全性,因为密钥存储在硬件中,难以被篡改或窃取。
例如,英飞凌的Tc3xx系列的HSM模块。
软件级安全启动:
不依赖专门的硬件模块,而是通过软件算法和机制来实现安全启动。
软件方案的优点是成本较低且易于扩展,但相对而言安全性可能略低。
通常会使用最底层的BootLoader作为可信根,通过密码学方法(如MAC校验)来验证后续加载的软件。
顺序启动和并行启动(参考 Mir的异想世界)
02 安全启动示例
MCU通用软件架构
示例1:安全启动过程
启动时间要求(参考)
对于所有 CAN 节点, 从通讯控制电源通电时刻起到发送第一帧应用报文的最大时间为:200ms;
对于所有 CAN 节点, 从通信控制电源通电时刻起到准备好 ACK 置位的时间的最大时间为:130ms;
对于所有 CAN 节点, 应尽可能快地发出真实值, 且从通信控制电源通电时刻起到发送报文的所有信号值为真实值的最大时间为:1000ms
安全启动校验时间长度超出了系统启动时间要求
这一块是红线
针对启动时间的要求,如果严苛,可以采用校验部分核心代码、或并行启动的方式。
启动时间:
逐级验证方式可能导致启动时间过长,不适用于有严格启动时间要求的应用。
解决方案包括并行启动和部分校验方式,以缩短启动时间同时兼顾安全性。
示例2:
如下案例我觉得比较有实操性
大家针对自家产品的芯片,多看芯片手册和相关论坛,梳理不同芯片的安全启动方案。
英飞凌TC3XX系列代表了典型的MCU安全启动
英飞凌安全启动的主要步骤
信任根(Root of Trust):
信任根通常是芯片内的一个不可变的固件模块,比如BootRom。
这个模块在系统上电后首先运行,并负责验证后续启动阶段的代码。
验证阶段(Verification Stages):
BootRom:作为信任根,BootRom首先验证Secondary Program Loader(SPL)的完整性和真实性。
SPL:一旦SPL被验证并通过,它会继续验证U-Boot或其他引导加载程序。
U-Boot:U-Boot进一步验证操作系统内核和其他必要的组件。
加密和签名:
各个阶段的代码通常会被加密和签名。签名用于验证代码的来源和完整性,而加密则防止代码被篡改。
使用的加密算法可能包括AES、ECC等,具体取决于芯片型号和配置。
通信机制:
在启动过程中,Host CPU和HSM(Hardware Security Module)之间需要进行通信。
通信机制可能包括专用寄存器、内存映射接口(MMIO)等,用于传递启动地址、验证结果等信息
示例3:
这块有很多挖掘和可借鉴的点,尤其是屌丝MCU级别不是很高的,在没有HSM作为信任根的前提条件下,通过OTP方式实现安全启动的方案;
在物理层关闭debug口,而且OTP又仅支持一次刷写,不能更新,看OEM的认可度也未尝不可;
采用OTP还是efuse方案,都存在一个问题,由于是一次刷写后,不可更新,如果固件漏洞扫描扫出bug了,得更新固件,岂不是der了。
那怎么搞,从扫五大域控制器的经验来说,大多数CVE/CWE分布在座舱或联网带操作系统的件上,前面也说了,对于比较屌丝的MCU功能较为简单,用广东话说的吊毛MCU,本身功能就非常稳定,基本后期无需更新,如果发生问题,可采用换件的形式,在售后端进行换件操作。
当然也有一种方案可供大家参考:
使用一个独立的、不可更改的“引导固件”(Bootloader),它存储在OTP中,而后续的应用程序固件存储在其他可更新的存储区(如eMMC、NAND闪存等)。这种情况下,固件本身依旧可以更新,但不涉及OTP存储的内容。
尽管OTP是不可修改的,但它可以与其他存储器(如eMMC、NAND Flash)结合使用,确保固件的安全更新。更新固件时,Bootloader需要验证新固件的签名,并通过OTP存储的密钥来确保固件的完整性。
OTP配置示例
读取OTP数据示例
OTP也有局限性,如下说明:
1)从otp读取公钥,对固件的杂凑值进行验签;
2)从otp读取解密密钥,对固件进行解密;
3)使用杂凑算法计算明文固件的杂凑值,并与otp中杂凑值进行对比。
上述安全启动机制存在以下缺陷:
1)公钥长度较长,比如sm2算法公钥为512bits,rsa2048算法公钥为2048bit,但otp存储空间普遍无法存储多个公钥;
2)若在otp只存储了一个公钥,无法应对所对应私钥泄露的风险
OTP空间
2KB、1KB居多
OTP Address示例
03 总结
MCU安全启动的目的、实现方法、依赖项、总结
MCU(微控制器单元)安全启动 是为了确保系统从启动的第一刻起就能够防止未授权的固件或恶意软件的加载,从而保障系统的安全性,尤其在嵌入式设备和物联网设备中显得尤为重要。以下是MCU安全启动的目的、实现方法、依赖项和总结。
1. MCU安全启动的目的
MCU安全启动的主要目的是防止恶意代码在设备启动时被加载,确保设备从可靠的、授权的固件开始运行。具体目的包括:
防止固件篡改:避免恶意软件或未授权固件替换设备原始固件,确保设备运行的是受信任的代码。
保护设备免受恶意攻击:在系统启动阶段,防止加载被植入的恶意引导程序或系统启动程序。
确保数据完整性与机密性:通过验证固件签名、加密数据等手段,防止数据泄露或篡改。
设备身份验证:确保设备仅在验证通过的情况下启动,防止设备被盗用或篡改。
增强系统可靠性:通过验证引导程序的正确性,减少由于错误或恶意软件引发的启动失败。
2. MCU安全启动的实现方法
MCU的安全启动实现方法通常包括以下几个关键步骤:
2.1 硬件支持
硬件根信任(Root of Trust, RoT):大多数MCU安全启动依赖于硬件根信任。这是一个不可篡改的信任模块,通常在芯片内部,负责提供加密密钥、固件验证功能等。硬件根信任可以是一个专用的安全模块(如Secure
Boot ROM),也可以是芯片的某些特定区域。
2.2 启动过程中的固件验证
签名验证:在启动时,MCU会验证引导程序(如Bootloader)和操作系统镜像的数字签名。使用公钥算法,MCU验证固件是否由可信的签名密钥签名,以确保固件未被篡改。
固件加密:固件通常会被加密存储,MCU在启动时首先解密固件并验证其完整性,以防止固件在存储介质上被恶意修改。
2.3 多阶段安全启动
第一级Bootloader:最初的Bootloader通常位于MCU的内部存储(如ROM或OTP)中,并且是不可修改的。这个阶段通常会进行基本的硬件初始化和存储验证。
第二级Bootloader:如果第一级Bootloader通过验证,接下来会加载第二级Bootloader(如U-Boot),并验证其签名。这一阶段会进行更深层次的固件验证,加载主操作系统或应用程序。
2.4 反向工程与攻击防护
防止调试:为了避免固件被反向工程,许多MCU提供了调试口禁用功能,以防止通过硬件调试接口(如JTAG)对系统进行恶意操作。
代码混淆与加密:在某些设计中,固件可能通过混淆或加密保护,增加反向工程的难度,确保即使固件被窃取,攻击者也无法轻易分析出其功能。
2.5 设备密钥管理
设备密钥存储:设备的私钥通常存储在专用的安全模块中,或硬件密钥存储器(如TPM、HSM等)。这些私钥仅用于加密和签名操作,并不会暴露给外部应用程序。
3. MCU安全启动的依赖项
实现MCU安全启动需要依赖以下几个要素:
3.1 硬件安全模块
硬件根信任(RoT):许多现代MCU具有内建的硬件根信任,它是MCU安全启动的核心,提供密钥存储、签名验证等功能。
安全存储(Secure Storage):用于安全存储私钥、加密密钥等敏感信息,防止它们在非授权情况下被访问。
3.2 加密算法与签名技术
公钥加密和签名:在安全启动过程中,使用公钥加密算法(如RSA、ECC)对固件进行签名,并通过私钥进行验证。
哈希算法:如SHA-256,用于计算固件的完整性哈希值,确保固件在存储和传输过程中的数据未被篡改。
3.3 可信的启动过程
Bootloader的安全性:安全启动依赖于Bootloader的安全性,包括对固件和系统组件的完整性和签名验证。如果Bootloader存在漏洞,安全启动的保障将会失效。
3.4 防篡改与反调试技术
物理防护:一些MCU支持物理防护功能,限制对内存的访问和调试接口的控制,以防止攻击者通过调试接口注入恶意代码。
3.5 操作系统与固件的支持
支持安全启动的操作系统:操作系统(如Zephyr、FreeRTOS等)需要具备与硬件安全启动机制兼容的特性,如固件签名验证、加密功能等。
固件更新机制:固件更新时也需要考虑安全性,确保新的固件是由可信源发布,并且不会破坏系统的安全性。
4. 总结
MCU安全启动是一种确保设备从开机到操作过程中能够运行可靠、未被篡改的固件的重要机制。其目标是防止恶意软件的加载、保障系统完整性和防止安全漏洞的发生。实现安全启动的核心方法包括硬件支持的安全机制、数字签名验证、加密存储、反调试技术等。
|