编译内核源代码时,可以选择使用CONFIG_MODULE_SIG*
选项对内核模块进行签名。该modinfo
工具应该处理验证模块签名的任务,但多年来一直存在一些错误,该工具根本无法再完成这项工作。我得到的只是以下内容:
sig_id: PKCS#7
signer:
sig_key:
sig_hashalgo: md4
signature: 30:82:02:F4:06:09:2A:86:48:86:F7:0D:01:07:02:A0:82:02:E5:30:
...
所以没有密钥,哈希算法是 md4,甚至没有在内核中编译。
那么如何手动检查和验证模块签名呢?这甚至可能吗?
是的,这是可能的,但它非常复杂。
首先,您必须提取模块签名——您可以使用
extract-module.sig.pl
内核源代码中的脚本:其次,您必须从内核中提取证书和公钥;您可以
extract-sys-certs.pl
为此使用脚本:您还可以从 linux 内核构建目录中的
certs/signing_key.x509
或文件中提取公钥。certs/signing_key.pem
完成此操作后,您就拥有了所需的所有数据
/tmp/modsig
,/tmp/cert.x509
并且可以继续执行十几个必要的步骤来验证 PKCS#7 签名。您可以查看此博客文章以了解整个食谱。
我试图将整个过程(除了
extract-certs.pl
步骤)放在一个 perl 脚本中。你可以像这样使用它:
YMMV。我只尝试过使用 sha512 签名的自定义构建内核。这当然应该通过直接使用 openssl 库来更好地完成,而不是将 slow 和脆弱
openssl x509
的asn1parse
和rsautl
调用混在一起。checkmodsig.pl