发布 LKRG 0.8 模块以防止 Linux 内核中的漏洞被利用

开放墙项目 发表 内核模块发布 力克RG 0.8 (Linux Kernel Runtime Guard),旨在检测和阻止攻击以及违反内核结构完整性的行为。 例如,该模块可以防止对正在运行的内核进行未经授权的更改,并尝试更改用户进程的权限(检测漏洞的使用)。 该模块既适合组织针对 Linux 内核已知漏洞的保护(例如,在难以更新系统内核的情况下),也适合对抗未知漏洞的利用。 项目代码 分发者 根据 GPLv2 许可。

新版本的变化包括:

  • LKRG项目的定位发生了变化,不再分为用于检查完整性和确定漏洞利用情况的单独子系统,而是呈现为一个用于识别攻击和各种完整性违规的完整产品;
  • 兼容 Linux 内核 5.3 到 5.7,以及使用积极的 GCC 优化编译的内核,不带 CONFIG_USB 和 CONFIG_STACKTRACE 选项或使用 CONFIG_UNWINDER_ORC 选项,以及不具有 LKRG 挂钩函数的内核(如果可以)被免除;
  • 构建时,会检查一些强制性的 CONFIG_* 内核设置以生成有意义的错误消息,而不是晦涩的崩溃;
  • 添加了对待机(ACPI S3,挂起到 RAM)和睡眠(S4,挂起到磁盘)模式的支持;
  • 为 Makefile 添加了 DKMS 支持;
  • 已实现对 32 位 ARM 平台的实验性支持(在 Raspberry Pi 3 Model B 上测试)。 之前提供的 AArch64 (ARM64) 支持已得到扩展,以提供与 Raspberry Pi 4 板的兼容性;
  • 添加了新的钩子,包括 Capable() 调用处理程序,以更好地识别操纵“的漏洞”能力“,不是进程 ID(证书);
  • 提出了新的逻辑来检测逃避命名空间限制的尝试(例如,来自 Docker 容器);
  • 在 x86-64 系统上,会检查并应用 SMAP(管理程序模式访问阻止)位,旨在阻止在内核级别运行的特权代码对用户空间数据的访问。 之前实现了SMEP(Supervisor Mode Execution Prevention)保护;
  • 在操作过程中,LKRG设置被放置在通常是只读的内存页中;
  • 对攻击可能最有用的日志信息(例如,有关内核中的地址的信息)仅限于调试模式(log_level=4 及更高),默认情况下禁用。
  • 进程跟踪数据库的可扩展性得到了提高——不再是由一个自旋锁保护的一棵RB树,而是由512个读写锁保护的512个RB树组成的哈希表;
  • 默认情况下已实现并启用一种模式,其中通常仅检查当前任务的进程标识符的完整性,也可以选择检查激活(唤醒)任务的进程标识符的完整性。 对于其他处于睡眠状态或在不访问 LKRG 控制的内核 API 的情况下工作的任务,执行检查的频率较低。
  • 添加了新的 sysctl 和模块参数,用于微调 LKRG,以及两个 sysctl,用于通过从开发人员准备的微调设置(配置文件)集中进行选择来简化配置;
  • 默认设置已更改,一方面是在违规检测速度和响应有效性之间实现了更平衡的平衡,另一方面是对性能的影响和误报风险;
  • systemd 单元文件经过重新设计,可以在启动早期加载 LKRG 模块(可以使用内核命令行选项来禁用该模块);

考虑到新版本中提出的优化,使用 LKRG 0.8 时的性能降低估计在默认模式(“重”)下为 2.5%,在轻模式(“轻”)下为 2%。

在最近举办的一场 研究 用于检测 Rootkit LKRG 的软件包的有效性 显示 最佳结果,识别出 8 个在内核级别工作的 Rootkit 中的 9 个,没有出现误报(识别出 Rootkit Diamorphine、Honey Pot Bears、LilyOfTheValley、Nuk3 Gh0st、Puszek、Reptile、Rootfoo Linux Rootkit 和 Sutekh,但 Keysniffer,它是一个内核)模块,是被键盘记录器错过的,而不是字面意义上的 rootkit)。 作为比较,AIDE、OSSEC 和 Rootkit Hunter 软件包检测到了 2 个 Rootkit 中的 9 个,而 Chkrootkit 没有检测到任何一个。 同时,LKRG不支持检测位于用户空间的rootkit,因此将AIDE和LKRG结合使用时效率最高,可以识别所有类型的14个rootkit中的15个。

此外,值得注意的是,发行版开发商 Whonix 开始 编队 适用于 Debian、Whonix、Qubes 和 Kicksecure 的现成 DKMS 软件包,以及用于 Arch Linux 已经更新到0.8版本。 LKRG 套餐还提供俄语版本 ALT Linux и 阿斯特拉Linux.

LKRG 中的完整性检查是通过将内核和模块的实际代码和数据、一些重要的数据结构和 CPU 设置与存储的哈希值或相应内存区域、数据结构或寄存器的副本进行比较来执行的。 检查由计时器定期激活,并根据各种事件的发生而激活。

确定可能使用的漏洞和阻止攻击是在内核提供对资源的访问之前(例如,打开文件之前)、但在进程收到未经授权的权限(例如,更改 UID)之后的阶段进行的。 当检测到未经授权的行为时,默认情况下会强制终止进程,这足以阻止许多漏洞利用。

来源: opennet.ru

添加评论