一、前言:内核为何如此脆弱?
Linux 内核是整个操作系统的核心,一旦被注入恶意代码,后果比普通用户空间攻击更严重。
插入一个恶意模块,等于给系统打通了一条“后门通道”。
因此,Linux 从 3.7 开始引入了模块签名机制,目的是在模块加载阶段就验证其合法性,防止未授权代码执行。
二、模块签名机制概览
模块签名的基本原理是:
使用私钥为
.ko
模块生成数字签名,模块加载时由内核使用公钥验证签名是否正确。
这一流程类似于数字证书验证机制(PKI),包括:
-
私钥(签发):你私有,用于签名模块
-
公钥(验证):嵌入内核,只读,用于校验模块
如果验证失败,则模块无法被 insmod 或 modprobe 加载。
三、签名模块的构建流程
1. 开启 CONFIG_MODULE_SIG
修改内核配置文件(.config
):
CONFIG_MODULE_SIG=y
CONFIG_MODULE_SIG_ALL=y
CONFIG_MODULE_SIG_SHA512=y
CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
说明:
-
MODULE_SIG
启用签名支持 -
MODULE_SIG_ALL
编译模块时全部签名 -
MODULE_SIG_KEY
指定私钥路径(默认是certs/signing