大家好,我是瑞萨电子汽车安全首席工程师 Phil Lapczynski。我在 Renesas 的安全团队工作了 4 年,在此之前,我在汽车安全、OTA 解决方案和引导加载程序方面工作了十多年。我很高兴地发布一系列博客文章,介绍安全启动的概念并描述如何使用我们的瑞萨汽车 MCU 和 SoC 设备实现这些概念。这篇博客文章是三部分系列的第一部分,旨在让读者基本了解什么是安全启动以及为什么需要它。期待来自同事 Satoshi Yamanaka-san 和我的更多安全引导文章。
1. 日益严峻的挑战
自 1960 年代后期将微处理器引入车辆架构以来,现代汽车的复杂性呈指数级增长。车载计算机最初用于电控燃油喷射,现在可以控制现代车辆的各个方面,从加热座椅到半自动驾驶。今天的汽车有 100 多台车载计算机执行超过 1 亿行代码。从复杂性的角度来看,1亿正在接近像老鼠这样的小动物的DNA碱基对总数(人类大约有33000亿碱基对)。未来的自动驾驶汽车将拥有超过 3 亿行代码。
随着这种复杂性的增加,网络安全成为汽车设计中持续关注的问题。随着更多的驾驶控制权被赋予计算机,网络安全事件的影响更加复杂。为了使事情更具挑战性,安全架构师需要平衡隐私和安全与功能安全要求。对于安全和安保来说,在车辆中运行的代码必须是真实的和不变的。这就是安全启动的用武之地。安全启动回答了“我怎么知道软件在执行之前是真实的?”和“我怎么知道软件在执行之前没有改变?”的问题。
2. 安全训练营
安全启动是现代多层嵌入式系统安全的基础性第一步。安全启动是一种安全机制,通过它在执行之前验证软件的完整性和真实性。换句话说,安全启动允许在启动嵌入式设备时检测(并且可能不允许执行)不真实或修改的软件。安全启动降低了攻击者在设备中获得持久性的能力。
在最基本的层面上,如果预期的软件不是预期的,则会执行一组定义的制裁。制裁可能包括禁止访问加密密钥或外围设备、重置 CPU 或执行后备或设备恢复程序。虽然从最高级别来看,这个概念似乎很简单,但确保安全启动正常工作涉及许多步骤。
3. 建立信任根
要执行安全启动,需要“信任根”。这实质上为所有进一步的步骤建立了基本事实,并将信任链锚定到不可变的东西上。“信任根”,有时称为“信任锚”,植根于设备硬件的不可变部分。虽然有几种方法可以实现这一概念,但它们通常都有两个关键特征:1)必须能够安全地控制复位向量。2) 复位向量指向的代码必须是安全的。
复位后执行的常见解决方案包括:
无法更改的固定掩码 ROM
已编程和锁定的一次性可编程 (OTP) 代码闪存
在以受保护内存为引导核心的专用安全核心上执行软件
第一个代码块必须执行安全启动逻辑。其目标是为下一个引导阶段准备系统并对其进行验证。这个关键的代码块必须经过严格的审计,并将复杂性保持在最低限度。作为系统的不可变部分,这部分代码中的任何漏洞或错误通常只能通过完全更换硬件来修复。
4.验证软件镜像
构建安全启动实施的下一步是验证软件映像。通常有两种不同的方法用于检查安全启动中的真实性和完整性。选择的方法基于设计要求或启动时间等因素。
4.1 方法一:使用对称算法进行安全启动验证
验证引导代码的一种方法是使用称为消息验证代码的密钥对称加密算法。如果硬件设备具有用于所用算法的加速器,则可以实现此方法的好处。使用 CMAC 或 HMAC 算法可以缩短启动时间。该解决方案的最大挑战是加密密钥和参考 MAC 的存储。用于对称算法的私钥需要安全地存储在受保护的安全环境(如 HSM)中。此外,由于 MAC 生成和 MAC 验证使用相同的密钥,因此默认情况下不提供不可否认性属性。为了解决这个缺点,可以将密钥配置为具有由硬件强制执行的 MAC 生成或仅验证属性。
4.2 方法二:使用非对称算法进行安全启动验证
在这种方法中,代码使用非对称加密算法(也称为公钥加密)进行验证。非对称算法基于称为单向函数的数学问题。两种流行的解决方案是RSA和ECDSA。虽然基础数学和算法不同,但两种解决方案都依赖于公钥和私钥对。
FlippyFlink,CC BY-SA 4.0,来自维基共享资源
要验证图像,必须由签名机构使用私钥对图像进行签名。这是在设备外部完成的。在设备上,安全启动代码使用公钥验证映像。由于密钥是公开的,并且私钥不能轻易地从公开密钥的知识中推导出来,因此公开密钥的私密性不是必需的。虽然为了密钥的安全不需要公钥的隐私,但系统仍然必须确保公钥不能在未经授权的情况下被修改或替换。
4.2.1 签名生成
要生成签名,需要根据输入数据计算消息摘要(哈希)。这通常是在嵌入式设备之外的企业环境中创建的。签名者用他们的私钥加密消息摘要。加密的摘要称为签名。签名的类型取决于算法和填充方案(例如 RSA-PSS)。原始图像数据和签名被编程到设备中。
4.2.2 签名验证
签名验证是根据代码签名验证数据的完整性和真实性的过程。验证涉及计算数据的消息摘要(散列)并将其与解密签名中收到的摘要进行比较。
5. 建立信任链
在进行安全启动时,存在多种构建信任链的方法。选择的策略主要由启动时间要求驱动。
执行安全启动的最简单方法是单片方法,其中整个映像由第一阶段启动验证。虽然干净简单,但由于启动时间要求,单片启动很少在现实世界中工作。嵌入式设备通常需要在上电复位后的几毫秒内启动并执行其主要任务。在这些情况下,必须采取分阶段的方法。
更先进的解决方案允许部分执行和验证并行运行。这在多核系统上最为常见。
随着图像大小和复杂性的增加,加密硬件加速器成为满足时序要求的必要条件。
6. 当幸福的道路不那么幸福时……制裁
到目前为止,我们只讨论了验证通过时的一般流程,但是如果其中一个阶段验证失败会发生什么?在这种情况下,需要实施制裁。系统设计者必须决定在验证阶段失败时该怎么做。根据阶段和其他系统要求,可能会发生一种或多种可能的制裁:
系统重置
以降低的权限执行下一个阶段
例如,禁止使用加密密钥或某些外围设备
执行备用验证应用程序
将执行更改为后备或备用应用程序
这种情况在 OTA 或诊断更新失败的情况下特别有用
停留在当前启动阶段
7. 如何更新软件?
好的,所以我们知道安全启动将确保应用程序是真实的和不变的,但是我们如何解决使用新(真实)软件更新设备的需求?软件更新允许新功能并允许修复错误和安全漏洞。关键是保护这些更新的能力。每次新软件发布,新软件都必须辞职。已发布软件的签名需要成为生产软件开发的构建/发布过程的一部分。解决此过程的复杂性和安全性并非易事。我们不会在本文中讨论软件更新安全,但是有像TUF和Uptane这样的项目直接关注这个话题。我们计划在未来发布一篇关于软件更新的深入文章。
8. 结论
总之…
安全启动对于创建安全的信任链系统是不可或缺的。
它提供:
#1 - 身份验证(未经授权的图像不允许运行)
#2 - 完整性(应检测到“篡改”图像)
它通常使用:
数字签名
确保身份验证和完整性
私钥 -》 用于签名
公钥 -》 用于验证
(可选)图像/数据加密
用于保密
用于防克隆/防伪
当验证失败时,将应用制裁
安全启动需要与软件更新策略共存
审核编辑:郭婷
-
汽车电子
+关注
关注
3027文章
7979浏览量
167237 -
瑞萨电子
+关注
关注
37文章
2868浏览量
72246
发布评论请先 登录
相关推荐
评论