Linux内核模块签名技术
2026/6/16 10:17:51 网站建设 项目流程
inux 内核运行在系统的最高特权级别(Ring 0)。为了防止恶意代码(如 Rootkit)通过内核模块(.ko文件)直接侵入系统核心,Linux 引入了内核模块签名技术(Kernel Module Signing)
下面为您详细拆解该技术的核心原理、签名流程以及内核运行时的验签过程。

一、 核心技术原理

Linux 内核模块签名其本质是非对称加密算法(如 RSA 或 ECDSA)与散列算法(如 SHA-256)的结合应用

1. 密钥对分工

  • 私钥(Private Key):保留在构建服务器(编译内核的主机)上,用于对生成的内核模块进行数字签名。私钥绝对不能泄露,甚至可以在签名完成后立即销毁。
  • 公钥(Public Key):包装在 X.509 证书中,直接编译进内核镜像(vmlinuz)。内核在运行时只认这个内置的公钥。

2. 追加式签名结构(Appended Signature)

普通的数字签名(如 GPG 签名)通常会生成一个独立的.sig文件,但 Linux 内核模块采用的是追加签名的方式。
  • 签名工具计算完.ko文件的哈希并用私钥加密后,会把这段签名二进制数据(PKCS#7 格式)直接强行追加到.ko文件的末尾。
  • 在文件最末尾,还会追加一个固定的魔法字符串(Magic String)~Module signature appended~以及一个描述签名大小的特殊结构体。这样内核读取文件末尾时,就能瞬间判断该模块是否已被签名。

二、 模块签名过程(编译期 / Build Time)

签名过程发生在内核或模块编译完成之后、发布之前。通常由内核源码树自带的脚本工具sign-file自动化完成。
[编译出的未签名 driver.ko] │ ▼ (使用 SHA-256 计算文件哈希值) [Hash Value] │ ▼ (使用 私钥 MOK.priv 进行加密) [PKCS#7 签名数据] │ ▼ (将签名数据 + 魔法字符串追加到原文件末尾) [已签名的 driver.ko]

详细步骤:

  1. 内核编译系统生成密钥对:如果内核配置了自动签名,编译时会在内核根目录下自动生成signing_key.pem(私钥)和signing_key.x509(包含公钥的证书)。
  2. 提取公钥:编译系统将signing_key.x509证书中的公钥硬编码嵌入到内核镜像的.builtin_trusted_keys密钥环中。
  3. 计算哈希:签名工具(sign-file)读取编译好的.ko文件(不含末尾),使用指定的散列算法(如 SHA-256)计算出整个模块的哈希值。
  4. 生成并追加签名:工具使用私钥对哈希值进行非对称加密,生成符合 PKCS#7 规范的签名数据块,并将其以及魔法字符串~Module signature appended~写入.ko文件的尾部。

三、 模块验签过程(运行期 / Runtime)

当管理员或系统服务执行modprobeinsmod命令加载模块时,系统会发起finit_moduleinit_module系统调用,将模块数据读入内核空间,随后内核展开验签逻辑。

详细步骤:

  1. 检测签名标记:内核模块加载器首先将指针移到读入内存的模块数据末尾,检查是否存在~Module signature appended~魔法字符串。
  • 如果没有:说明这是个未签名模块,内核转入“无签名处理策略”。
  • 如果有:内核根据末尾的结构体解析出签名数据的长度,将签名块和原本的 ELF 模块数据分离。
  1. 提取公钥:内核前往自身的受信任密钥环(Keyring)中查找匹配的公钥证书。
  2. 解密与比对(验签):
  • 内核使用公钥解密签名块,得到由编译期计算的原始哈希值 H_1
  • 内核使用相同的散列算法(如 SHA-256)重新计算当前接收到的 ELF 模块数据的当前哈希值 H_2
  • 比对二者:如果H_1 == H_2,则验签成功,说明模块来源可信且在传输/存储过程中未被篡改;如果H_1 != H_2,则验签失败。

四、 验签失败或无签名时的内核策略

内核验证完签名后,会根据 Linux 内核编译配置文件(.config)中的安全策略以及是否开启了 UEFI 安全启动(Secure Boot)来决定模块的命运:
场景 / 内核配置
策略类型
验签通过
无签名 / 验签失败
CONFIG_MODULE_SIG=y
(未开启强制)
宽松/审计模式
正常加载。
允许加载,但内核会在日志(dmesg)中抛出严重警告,并将内核状态标记为Tainted(受污染)
CONFIG_MODULE_SIG_FORCE=y
(开启强制)
强制锁定模式
正常加载。
直接拒绝加载。系统调用返回错误(通常提示Required key not availableKey was rejected by service)。
开启 UEFI Secure Boot
最高安全模式
正常加载。
此时无论内核如何配置,内核都会强制自动升级为锁定模式,任何签名不对或无签名的模块绝对无法加载。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询