在设计嵌入式系统时,考虑安全性已经成为许多行业的需要。将设备连接到互联网的驱动器允许对系统进行远程攻击。想要构建安全嵌入式系统的嵌入式开发人员必须确保他们的设备实现信任链。在这篇文章中,我们将探讨什么是信任链,以及嵌入式系统信任链中的关键元素。
什么是信任链?
信任链是一系列身份验证和完整性检查,可确保只有经过批准的软件才能在系统上运行——对于嵌入式系统,开发信任链需要开发人员分阶段启动他们的系统。每个阶段都使用加密密钥、证书和哈希来验证以下加载的软件组件未被修改(完整性)以及它们来自开发人员(身份验证)。
多年来,在运行Linux的应用处理器上工作的嵌入式软件开发人员一直采用多阶段引导过程。然而,使用微控制器、实时操作系统或裸机系统的嵌入式开发人员最初可能会发现这非常不同。一般来说,建立信任链看起来像下图:
信任根——The Root of Trust (RoT)
每个系统都必须有一个锚,形成信任的基础。然后,该锚点用于验证系统上加载的每一个软件。RoT是用作信任链中第一个实体的不可变过程或身份。一个好的RoT利用硬件来建立信任锚。例如,加密PUF是从微控制器的RAM中生成安全密钥对的软件算法。
一般来说,RoT是密钥和证书的集合,它们验证运行在系统上的软件是完整的和经过认证的。RoT通常还会为系统提供安全服务,如安全存储、证明和应用程序分区。
当系统首次启动时,它会建立RoT。接下来,RoT将认证和验证安全引导加载程序的完整性。首先,引导装载程序有公司创建的数字签名。接下来,嵌入式开发人员使用在引导装载程序上计算的散列来验证应用程序签名。成功的验证表明,引导加载程序是由该公司未经修改就放在那里的。
安全引导加载程序——Secure Bootloaders
安全引导加载程序有几个用途。首先,它们用于认证和验证在它之后加载的安全和用户应用程序的完整性。如果身份验证或完整性失败,引导加载程序将不会加载这些应用程序。该设备将不会正常运行,而是将在安全引导加载程序中保持安全状态。通常,安全和用户应用将被验证并加载到存储器中以执行它们的主要功能。
其次,引导加载程序也用于更新安全和用户应用程序代码。当软件更新时,引导装载程序检索新版本,存储它,然后验证和确认它。例如,如果新的应用程序来自公司并且有效,引导装载程序将执行固件更新。
安全应用程序(安全代码域)——Secure App
有几种方法可以创建硬件隔离的执行环境。首先,嵌入式开发人员可以使用多核微控制器。一个核心用于安全执行环境,而另一个核心是用户应用程序。接下来,开发人员可以使用单核微控制器,这些微控制器使用Arm的Trustzone等技术。最后,开发人员可以利用内存保护单元(MPU)在其应用中提供不同的隔离级别。
用户应用程序(非安全代码域)——User App
在大多数嵌入式设备的信任链实现中,用户应用程序区域是最后一个环节。用户应用程序通常在引导期间被验证和认证,但是是不安全的。用户应用程序是通常与外界交互的代码,遵循嵌入式开发人员常用的软件模型。如果发生安全事故,预计会发生在用户应用程序代码中。虽然有人可能会立即认为这是不可接受的,但理解用户代码中的确切内容是非常重要的。
用户数据、密钥和任何需要保护的东西都不会放在用户应用程序区域。用户应用是与安全执行环境分离的硬件隔离的执行环境。如果有人设法注入代码或进入这个区域,他们将无法访问设备的任何秘密。
结论
安全性对于各种各样的嵌入式系统已经变得至关重要。在大多数情况下,公司不能再忽视设备的安全性需求。虽然安全性初看起来令人望而生畏,但是有各种各样的工具和示例可供嵌入式开发人员用来保护他们的嵌入式系统。每个安全系统的一个关键组件是建立信任链,该信任链利用信任根、安全引导加载程序,并将应用程序分为安全和非安全执行空间。