LoadPin

LoadPin 是一个 Linux 安全模块,它确保所有内核加载的文件(模块、固件等)都源自同一个文件系统,并期望该文件系统由只读设备(如 dm-verity 或 CDROM)支持。这使得具有经过验证和/或不可更改的文件系统的系统能够强制执行模块和固件加载限制,而无需单独签署文件。

LSM 在构建时使用 CONFIG_SECURITY_LOADPIN 进行选择,并且可以在启动时使用内核命令行选项 “loadpin.enforce” 进行控制。默认情况下,它是启用的,但可以在启动时禁用(“loadpin.enforce=0”)。

LoadPin 在看到加载的第一个文件时开始固定。如果支持文件系统的块设备不是只读的,则会创建一个 sysctl 来切换固定:/proc/sys/kernel/loadpin/enabled。(拥有可变的文件系统意味着固定也是可变的,但拥有 sysctl 允许在具有可变文件系统的系统上轻松进行测试。)

也可以使用内核命令行选项 “loadpin.exclude” 从 LoadPin 中排除特定的文件类型。默认情况下,包含所有文件,但可以使用内核命令行选项(例如 “loadpin.exclude=kernel-module,kexec-image”)将其排除。这允许使用不同的机制(例如 CONFIG_MODULE_SIGCONFIG_KEXEC_VERIFY_SIG)来验证内核模块和内核映像,同时仍然使用 LoadPin 来保护内核加载的其他文件的完整性。有效文件类型的完整列表可以在 include/linux/kernel_read_file.h 中定义的 kernel_read_file_str 中找到。