安全启动是在使用之前针对硬件验证代码和图像的过程。这个想法是系统不应该信任任何代码或图像,直到它被验证为真实并且其完整性得到确认。如前所述,系统应该使用基于硬件的信任根 (RoT) 来验证代码。我在职业生涯中遇到的许多系统只是假设其闪存中的代码是正确的,并在处理器启动的那一刻开始执行它,几乎没有检查(如果有的话)。如果嵌入式开发人员想要保护他们的系统,这是一种可以长期遵循的做法。系统需要安全启动并验证将要加载和执行的所有代码。
从信任根引导
安全启动可能是我们一直在讨论的第一个使用基于硬件的隔离和 RoT 的元素。在第一阶段,建立 RoT 的 ROM 代码用于计算引导代码内容的哈希值并验证其内容。计算出的散列通常与不可变的散列进行比较,并且在制造过程中已“烧录”到闪存中。初始安全启动阶段将内置配置信息,然后允许启动序列验证后续启动阶段。
例如,该阶段可能会经过并计算引导加载程序上的散列,并将该散列与存储在闪存中的另一个散列进行比较,以帮助在该阶段建立信任。然后可以验证和执行引导加载程序,然后在运行应用程序之前通过并验证其应用程序映像。一个示例过程如下所示:
安全启动阶段
现在,如你所见,安全启动是分阶段发生的,但安全启动也经常发生在隔离的内存区域中。安全系统通常会首先启动到被认为是安全执行环境的内存区域。有几种不同的方法可以做到这一点。一种方法是使用多核微控制器,其中一个内核专用于安全功能和代码执行,另一个内核分配给应用丰富的代码。在此设置中,处理器间通信 (IPC) 用于在内核之间进行通信。
或者,嵌入式开发人员可以使用单核技术将内存和执行环境分为安全和非安全环境。一个例子是 Arm TrustZone。使用 TrustZone,开发人员能够指定哪些内存区域应该分配给安全处理,哪些不应该。这些区域不仅包括代码,还包括外设、闪存和 RAM 存储器。应用程序将运行其执行丰富的代码,当它需要调用安全功能时,处理器将转换到隔离的安全模式并允许执行安全功能。这有助于确保如果黑客获得对功能丰富的执行环境的访问权限,则无法访问诸如私钥、数据等安全信息。
安全处理
在隔离环境中使用安全启动时,安全处理区域通常最先开始执行。换句话说,安全启动操作是从安全执行环境中执行的,这是有道理的。一旦安全环境启动并运行,将在应用程序丰富的代码上计算另一个哈希值,以确保其完整性和真实性。通过此检查后,安全执行环境将允许该代码运行。
在启动序列中的每个点,安全启动都必须验证下一个将要执行的代码或映像并验证其完整性。从 RoT 开始,然后通过引导加载程序进入执行映像。在多核系统中,甚至可能有多个图像需要跨多个处理器进行验证。
安全启动不仅仅是简单地向系统添加一个软件。安全启动需要嵌入式开发人员仔细考虑启动顺序并开发源自信任根的信任链。在系统启动时,每个映像和代码都经过验证,然后才允许在系统上执行。如果检测到问题,系统可以停止引导序列,甚至可以恢复到早期已知的工作代码版本。为了恢复代码或将其更新到新版本,这需要系统具有安全的引导加载程序。
发表评论 取消回复