Linux|嵌入式开发:保护嵌入式Linux设备中的引导顺序

Linux|嵌入式开发:保护嵌入式Linux设备中的引导顺序

文章图片


随着物联网、5G 和嵌入式设备成为每个人日常生活的重要组成部分 , 安全应该成为每个人的心声 。 最重要的是 , 在嵌入式开发中 , 嵌入式设备的安全性和信任是必不可少的 。 然而 , 嵌入式设备并不总是具有良好的安全性 , 在过去的几年中 , 出现了大量引人注目的黑客攻击 。

为什么引导安全很重要?
启动安全是一个基本的安全层 , 可确保我们的设备运行我们希望它们运行的软件 。 如果没有启动安全性 , 受感染的设备可能会修改其内核或应用程序以运行恶意代码 。 如果没有启动安全性 , 即使在重新启动设备后 , 它仍然可能受到威胁 。 在最坏的情况下 , 未经授权的代码更改可能会拒绝远程更新 , 从而永久破坏设备 。 这种缺乏安全性可能会给智能灯泡等小型设备带来不便 , 或者如果家用电器或汽车等物品受到损害 , 则可能会造成经济损失 。
什么是嵌入式 Linux 中的安全启动?
本质上 , 安全启动是确保设备使用 OEM 信任的软件启动和运行的过程 。 这很重要 , 而且令人惊讶的是 , 这不是你的笔记本电脑或许多物联网设备的标准配置 。 安全启动过程使用加密技术 , 即公钥、签名和散列 , 以确保最初指定系统的软件组件 。 在基本层面上 , 安全启动依赖于被称为“信任链”的概念 。
引导序列中的信任链
嵌入式 Linux 的引导过程由一系列不同的步骤组成 。 信任链的基本概念是流程中的每个步骤在启动该步骤之前验证后续步骤是否有效且未经修改 。 如果任何步骤验证失败 , 启动过程将失败 , 设备将无法完成启动 。
【Linux|嵌入式开发:保护嵌入式Linux设备中的引导顺序】
在嵌入式开发中 , 引导嵌入式 Linux 设备的主要步骤是:执行 ROM 代码、运行引导加载程序、启动内核 , 最后挂载根文件系统 。 如前所述 , 每个步骤都负责在继续之前验证下一步 。
只读存储器代码
ROM 代码是启动整个过程的关键 。 电路板制造商提供 ROM 代码 , 其工作是验证和启动引导加载程序 。 它在支持安全启动的板上进行了加密签名 , 并且被认为是信任根 , 因为它是第一步 。 虽然这个阶段通常是安全的 , 但 ROM 代码本身存在安全漏洞并非闻所未闻 , 因此谨慎的开发人员应该了解他们正在开发的电路板当前的关键问题状态 。
在安全引导过程中 , 引导加载程序可执行文件将被签名 。 ROM 代码将有一个公钥 , 用于在启动引导加载程序之前确认它的签名 。 引导加载程序公钥的存储位置取决于电路板实现 , 但可以在例如一次性可编程存储器 (OTP) 或可信平台模块硬件 (TPM) 中 。 一旦 ROM 确认引导加载程序签名 , 它将被启动 。
引导加载程序
引导加载程序是安全引导过程信任链中的下一步 。 它的工作是验证 Linux 内核可执行文件并启动它 。 U-Boot 是许多嵌入式 Linux 系统上使用的引导加载程序的一个示例 。 与信任链中的前一个环节一样 , 内核是经过签名的 。 引导加载程序文件包含用于在启动内核文件之前验证内核文件的公钥 。 由于 ROM 代码已经验证了引导加载程序文件 , 我们可以确定它的内核公钥是正确的 。 一旦内核签名被验证 , 内核就会启动 , 否则启动过程中止 。 在嵌入式开发中 , 一个关键点是安全引导过程的每个阶段只能使用已经验证的资源 , 这将引导加载程序限制在自身和设备 ROM 上 。

核心
内核当然是 Linux OS 的核心 。 它在信任链中的职责是验证根文件系统 。 由于根文件系统通常比引导加载程序文件或内核文件大得多 , 因此对整个文件系统进行加密签名是不切实际的 。 相反 , 它通常被分解成块 , 每个块都被散列成一棵树 , 该树整体包含部分文件系统的有效性 。 然后可以在加载块时根据需要独立验证零件 。 内核模块 dm-verity (Device Mapper Verity) 经常用于这个角色 。