签名驱动/模块有什么作用以及有何意义?

签名驱动/模块有什么作用以及有何意义?

最近安装了一个需要手动签名模块的驱动程序,令人困惑的是该模块的签名实际上在做什么以及为什么必须这样做。

关于此过程还有其他问题,但它们更具技术性。关于签名模块的作用、为什么有必要以及替代方案是什么(显然 dkms 可以自动签名模块)的简单解释是什么?

答案1

内核可以配置为在使用未签名或错误签名的模块时发出警告(通过日志消息+在内核上设置污点标志),或者直接拒绝任何没有内核签名的内核模块可以验证。

当使用 BIOS 式引导过程时,或者在禁用安全引导的情况下使用 UEFI 时,这本质上只是一个可选的额外安全过程。这将使入侵者更难向系统添加邪恶的内核模块(例如基于内核的 rootkit,以隐藏入侵者的工具和操作)。

但是,当使用启用了安全启动的 UEFI 时,它是安全启动要求的一部分。安全启动的“精神”是禁止将不受信任的代码加载到内核空间。 UEFI 固件检查引导加载程序上是否存在有效签名(或列入白名单的 SHA256 哈希值);引导加载程序需要检查操作系统内核上的相同情况;并且内核应该将此要求扩展到将在内核空间中执行的所有代码。

当然,实际上操作系统内核可以轻松选择不满足此要求。但开发安全启动的组织已经决定,这种选择退出至少应该需要系统管理员采取明确的行动:默认情况下应该是强制执行签名要求。

(顺便说一句,这也是现代 Windows 要求所有已安装的驱动程序默认进行签名的部分原因。如果要安装未签名的驱动程序,则需要显式更改需要管理员访问权限的设置。)

可以在安全启动系统上启动并允许“开箱即用”执行未签名的内核空间代码的工具将被称为安全启动规避设备并将被归类为恶意软件。

Microsoft 是最著名的安全启动签名者,他们只会shimx64.efi对强制执行签名要求的 shim 引导加载程序版本进行签名。

支持安全启动的 UEFI 固件将具有内置功能,可以检查使用 Microsoft PE+ 二进制格式(文件*.efi使用的格式)的二进制文件的签名。但 Linux 世界通常不使用这种二进制格式:而是使用 ELF 二进制格式。

Linux 内核模块和 GNU GRUB 引导加载程序模块都基于 ELF 格式。这需要引导加载程序和内核为 ELF 二进制文件提供自己的签名检查算法,但显然 UEFI 论坛(管理 UEFI 和安全引导规范的行业联盟)已经决定只要默认要求就可以这样做维护有效签名。

当然,如果您使用 DKMS 自动构建和签署内核模块,这并不完全符合预期:这意味着将有一个带有私钥的证书,可用于自动生成有效签名,因此入侵者也可以也用它来签署任何邪恶的内核模块。它的安全性并不比没有安全启动的系统差,但也没有安全多少。

如果您有多个系统,则可以通过仅在一台主机(可能是受攻击者威胁最小的主机)上拥有模块签名证书的私钥来获得一些安全优势,并使用它来构建任何自定义内核和/或模块您可能需要,并将它们从那里分发到需要它们的任何其他主机。这样,其他主机只需要模块签名证书的公共部分,该部分只能用于验证现有签名,而不能用于创建新签名。

相关内容