您的嵌入式系统上的软件从何而来?你能证明吗?您能安全地在现场更新系统吗?密码学提供了验证软件和数据完整性和来源的工具。有一个关于用户如何验证软件来源的过程,软件是否在传输过程中被篡改,以及安装后是否被修改。
军事系统受到许多攻击,包括对向系统提供软件的软件供应链的攻击。为了确保防范这些攻击,管理人员应该问三个问题:软件组件的来源是什么?软件是否被篡改或修改?他们能证明吗?
密码学通过软件签名和哈希来解决此问题,它们协同工作以验证源和文件。软件签名使用公钥/私钥对来验证软件的来源。使用私钥对软件进行签名,然后使用该公钥验证软件是否已使用该特定私钥进行签名。签名者和软件是否可以信任是单独的讨论;软件签名验证软件的来源,以及签名后是否未被篡改。
哈希是一种处理任意长度的文件或数据集并生成该文件唯一的固定长度校验和的技术。对文件的任何更改都会产生一个全新的校验和 - 例如,更改 10 GB 文件中的一位将产生不同的校验和。流行的(虽然有些弱)sha1 哈希产生 40 个字符的校验和,而更安全的 sha256 哈希产生 64 个字符的校验和。使用文件及其校验和,您可以验证文件是否未以任何方式损坏或篡改。哈希运行速度很快,即使在大文件上也是如此,使其成为文件验证的有效工具。
这些技术可以应用于任何文件。文件是否包含源代码、可执行映像、数据或其他文件并不重要;可以使用任何文件或数据集。
源头可以控制吗?
所有软件的起点都是源代码,源代码通常由多个人在一段时间内编写和修改,并作为产品的多个版本和更新发布。代码分布在数百或数千个文件中,并且不断变化。有效的代码管理使用版本控制的代码存储库,例如 git1。git 存储库是一个补丁数据库,每个补丁都有一个唯一的标识符。在 git 中,这个唯一标识符是补丁内容的哈希值——结果是每个补丁都由其内容标识。对修补程序内容的任何更改都会立即可见,因为修补程序不再与其标识符匹配。
git 补丁包括有关应用它的上一个补丁的信息以及提交补丁的人员的身份。与区块链类似,git 补丁包含基于加密的一组后台指针,使某人无法在不被发现的情况下更改历史记录。补丁也可以使用前面描述的技术进行签名,从而验证谁制作了补丁。此技术在任何需要验证贡献的环境中都是有用的工具。
版本控制的软件存储库是任何安全软件供应链的基础,因为它提供了软件所有更改的历史记录以及更改者。它还提供了构建特定版本的软件包的可靠方法。
建立可验证的出处
使用来自已知和可信来源的软件对于维护嵌入式系统的完整性非常重要。但是你怎么知道一个可安装的软件实际上来自已知的源代码呢?
源代码存储库与 Jenkins2 等自动化构建系统相结合,使用户能够从一组已知的源文件构建可执行映像。生成映像后,生成系统可以对其进行签名和哈希处理。这使用户既知道软件的来源,又知道生产软件的确切版本。例行版本使用测试密钥签名,而生产版本使用发布密钥签名,需要特殊授权和批准,并且通常在单独的安全系统上签名。这使用户能够确定软件的来源以及它是否是正式版本。
组成一个软件的所有文件都合并到一个包中,用于分发、安装和更新。Linux 中使用的打包系统是 rpm3。rpm 是单个文件,其中包含多个文件的压缩存档以及用于安装、配置、更新和删除其关联应用程序的命令。rpm 文件还包括存档中所有文件的清单,包括它们的名称、版本号和校验和。此清单信息包含在 rpm 数据库中,该数据库维护系统上安装的所有基于 rpm 的软件的信息。
软件通常包含第三方组件。当这些第三方组件包含在 rpm 中时,rpm 元数据和校验和可确保这是供应商包含的软件。应签署第三方组件以确保其完整性;如果它们只是从其他供应商传递,则应由其他供应商签名。
通常,rpm 包本身是经过签名的。创建和签署 rpm 包的工具包含在 Linux 中,每个开发软件的人都应该使用,包括内部开发人员。默认情况下,rpm 安装程序会在允许安装之前检查软件包是否使用已知密钥进行签名。尝试安装未签名的软件或使用未知密钥签名的软件将失败,除非它们被覆盖。rpm 安装程序还会检查软件包的完整性:如果软件包的内容已被修改,无论是通过数据损坏还是恶意篡改,安装都将失败。
操作系统供应商将在操作系统 (OS) 中包含其公钥。此添加使用户能够确保软件包、更新和安全勘误表实际上来自操作系统供应商,并且未被任何外部方篡改。
用户必须将每个已批准供应商的软件密钥添加到系统中。根据特定的安全要求,用户可能需要采取措施来确保供应商密钥的有效性,尤其是在从镜像或其他中间源(如系统集成商)下载软件时。密钥应直接从供应商网站获取。有些人甚至随身携带来自已知来源的密钥的硬拷贝列表。
此外,签名的 rpm 包允许通过邮件使用不安全的传输,例如互联网或 CD-ROM,因为 rpm 工具可以验证 rpm 的来源以及它是否已损坏或篡改。
安装后的使用寿命
在安装之前和安装期间检查软件是一个良好的开端,但在安装完成后继续维护非常重要。可以做些什么来验证正在运行的系统?
rpm 的一个强大功能是它允许用户验证正在运行的系统上文件的完整性。rpm 数据库包括每个 rpm 中包含的所有文件的校验和。系统实用程序使用户能够计算系统上每个文件的校验和,将其与rpm数据库进行比较,并识别已更改的任何文件。rpm 数据库是一种快速有效的方法。实现此目的的另一种方法是返回到已签名的 rpm 包并直接从 rpm 使用校验和。虽然这种方式较慢并且需要访问原始安装文件,但它非常安全。
主要的 Linux 发行版使用这些技术来确保它们从已知来源安装和运行未经修改的软件。了解系统上安装的所有软件的来源以及是否已更改至关重要。这些知识是在现场部署和更新系统时建立和维护系统完整性的有力起点。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !