Linux内核运行时保护-LKRG
2025-09-12 12:16:44 阿炯

Linux Kernel Runtime Guard (英文缩写为LKRG) 是一个内核模块,充当 Linux 内核的安全层,它的主要作用是在内核运行时对其进行监控,并捕获任何可疑或不安全的行为。支持x86-64、x86、AArch64 (ARM64)和32位ARM CPU架构。由 Openwall 项目小组于2018年首发的 Linux 内核运行时保护 (也译作Linux内核运行时哨兵),于2025年9月发布 1.0 版本。

LKRG performs runtime integrity checking of the Linux kernel and detection of security vulnerability exploits against the kernel.


LKRG是一个内核模块(而非内核补丁),因此它可以构建并加载在许多主线和发行版的内核之上,而不需要给它们打补丁。目前支持的内核版本从早至RHEL7(及其许多克隆/修订版)到最新的主流和发行版内核。其作用并不是替代 SELinux、AppArmor 这样的安全框架,而是作为额外的防护层,直接在内核层面进行监控和防御。

如攻击者试图通过覆盖内核凭据或更改内核内存来利用内核漏洞,LKRG 可以检测到该行为。当它发现异常时,便会记录日志、终止违规进程,或根据其配置采取其他防御措施。换言之,LKRG 不会取代 SELinux 或 AppArmor 等其他安全功能,而是通过在内核级别添加检查来补充它们。


应用案例:
如果攻击者尝试通过某个漏洞篡改内核内存或凭据,LKRG 能立即发现异常。一旦检测到可疑行为,它可以根据预设策略:
记录详细日志;
直接终止相关进程;
或采取其他防御措施,防止攻击进一步扩散。

这种机制让系统在面对零日漏洞或未知攻击时,多了一层实时保护。

最新版本:1
经过 7 年多的研发,终于于2025年9月上旬发布了 1.0 版本,引入了对内核 6.17 的支持、错误修复、性能增强和代码清理。在 0.9.9 版本和 1.0 版本之间进行了多项重大改进。LKRG 现在支持最新的主流 Linux 内核,最高测试版本为 6.17-rc4。此外还针对 Linux 6.13 及更高版本进行了调整,包括删除override_creds()和 的钩子方法revert_creds(),并在其他位置扩展了针对旧内核的凭证指针覆盖检查。v1.0 的到来标志着该项目正式步入成熟阶段。它不是为了替代已有的安全框架,而是作为补充,提供了一层内核级的“最后防线”。通过性能优化、容器兼容改进以及对最新内核的支持,LKRG v1.0 让 Linux 系统在面对复杂攻击时具备了更强的防御力。

另外,OverlayFS 兼容性也得到了改进,尤其是在 6.10 到 6.12 版本上运行容器时避免了误报。因此这一版本的代码库现在更加精简,比以前减少了约 2,400 行。在性能方面,每个任务的影子数据查找现在都无需锁定,并且影子数据锁定本身也进行了彻底改进,新增了更细粒度的锁。许多钩子从 kretprobes 切换到 kprobes,提高了可靠性和速度,同时减少了重复代码。完整性违规检查被封装在unlikely()中,使热路径免受不必要的缓存混乱的影响。

此外,LKRG v1.0 还修复了多个“竞争条件”,包括涉及 SECCOMP 过滤器、命名空间验证和 sysctl 更改的竞争条件。与较新内核上的 seccomp 模式损坏相关的误报也得到了解决。此外 LKRG 改进了与 x86_64 上 Intel CET IBT 和 Clang 的 KCFI 的兼容性,尽管现在 GCC 仍然是官方支持的编译器。其他值得注意的更新包括 LKRG 用户空间记录工具的强化版本、更优的错误报告以及对 CI 测试的调整。

LKRG项目的核心开发者还介绍说,测试现已覆盖搭载最新主线内核的 Fedora、Ubuntu 24.04 LTS 至 25.10 版本,以及已停产的旧版 CentOS 7。更新的软件包已通过 Rocky Linux SIG/Security 仓库提供,Rocky Linux 9.6 和 8.10 的版本即将推出。这些软件包还兼容其他企业级 Linux 发行版,包括 AlmaLinux 和 RHEL 8/9。

相比之前的 0.9.9,LKRG 1.0 带来了不少实用的改进和优化:
内核支持:适配到最新的 Linux 6.17-rc4,并改进了对 6.13+ 内核的支持。例如去掉了对 override_creds() 和 revert_creds() 的钩子,但在旧版内核上加强了凭据覆盖的检测能力。
容器兼容性:改进了对 OverlayFS 的支持,解决了在 Linux 6.10–6.12 上运行容器时容易出现的误报。
代码优化:整体代码量减少了约 2400 行,结构更精简,可维护性更高。

性能与可靠性提升
为了保证在高负载场景下的表现,v1.0 在性能和可靠性上做了深入优化:
性能优化
任务级的 shadow data 查找变成无锁操作,提升效率;
shadow data 锁机制细化,减少不必要的开销。

钩子机制改进
从 kretprobes 改为 kprobes,速度更快、可靠性更高;
去除了大量重复代码,逻辑更清晰。

完整性检查
将违规检测包裹在 unlikely() 中,避免在高频路径中对缓存造成污染。

并发问题修复
修复了多个竞争条件,包括 SECCOMP 过滤器、命名空间校验 以及 sysctl 配置变更 带来的冲突问题。

此外新版本还解决了在新内核上 seccomp 模式误报 的问题,并改善了对 Intel CET IBT 和 Clang 的 KCFI 的兼容性(仅限 x86_64 架构)。不过目前官方仍推荐使用 GCC 作为编译器。

其他改进与发行版支持
除了核心改进,v1.0 还在周边工具和生态支持上有所加强:
提供了更安全的用户态日志工具构建;
错误报告机制更加完善;
持续集成(CI)测试覆盖更广,涵盖了 Fedora 最新内核、Ubuntu 24.04 LTS–25.10,甚至包括已到寿命的 CentOS 7;
在发行版支持上,Rocky Linux SIG/Security 仓库已经率先提供了新版 LKRG 包,后续会扩展到 Rocky Linux 9.6 / 8.10,同时兼容 AlmaLinux 和 RHEL 8/9 等主流企业级发行版。


官方主页:https://lkrg.org/