Linux 内核权限提升漏洞CVE-2024-1086三种修复方法

[复制链接]
发表于 2026-10-6 12:50:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

2024 年 3 月起,Linux 内核的 netfilter 子系统里一个权限提升漏洞(CVE-2024-1086)的公开利用代码在网上流传开来,CVSS 评分 7.8。受影响面覆盖 CentOS、Debian、Ubuntu 等主流发行版的多个内核版本。这篇文章把它归为「需要防守方关注并尽快处置」的漏洞类型,重点讲清楚影响范围、为什么一部分环境不受影响,以及三条可落地的修复路径。

一、漏洞成因一句话讲清

Netfilter 是 Linux 内核里处理数据包过滤、转发和地址转换(NAT)的模块。修复版本落在 nf_tables 组件上:在 nft_verdict_init() 函数里,允许把正值当作 hook 判定的丢弃错误返回,于是当 NF_DROP 被上层当作类似 NF_ACCEPT 的语义处理时,nf_hook_slow() 可能走到重复释放的路径上,形成 use-after-free。低权限的本地用户借助这个条件可以把权限提升到 root。

二、影响版本范围

官方列出的是这几段:

  • 3.15 ≤ Linux kernel < 6.1.76
  • 5.2 ≤ Linux kernel < 6.6.15
  • 6.7 ≤ Linux kernel < 6.7.3
  • 6.8 的 rc 版本同样在列

也就是说 v5.14 到 v6.6 之间的多数内核都在范围内(已单独修补的 5.15.149、6.1.76、6.6.15 除外)。

三、哪几种环境天然不受影响

这是最有用的部分,能直接决定你的机器要不要马上动:

  • 开了 kconfig CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y 的 v6.4 以上内核不受影响(含 Ubuntu 6.5 及以后)。
  • 整个利用依赖用户命名空间(kconfig CONFIG_USER_NS=y)且运行时允许非特权用户创建(sysctl kernel.unprivileged_userns_clone=1),同时 nf_tables 模块已启用。Debian、Ubuntu、KernelCTF 默认这三项都是开的,所以实际风险面不小。
  • 该利用只在 x64/amd64 上实测过。
  • 网络活动密集的机器(尤其是带高负载 WiFi 的环境)利用过程极不稳定,可能直接内核恐慌,反而更容易被察觉。

四、方法 一:升级内核(首选)

下面以 CentOS 7.9 实测为例,从 ELRepo 装新内核:

yum -y update
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

列出仓库里可装的内核(--enablerepo 是临时开启指定的 repo,默认开的是 elrepo 而非 elrepo-kernel):

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
yum --enablerepo=elrepo-kernel install kernel-ml -y

装完设 GRUB 默认项:

awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
grub2-set-default 0
vi /etc/default/grub

在 GRUB_DEFAULT 处填 0,再把 GRUB_TIMEOUT 设成 5 留足手动选择时间。然后重新生成 GRUB 配置:

grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

重启后验证:

uname -r
rpm -qa | grep kernel

确认在跑的是新内核后,把用不到的旧内核包 remove 掉,避免多内核占用 /boot 空间、也减少被回退的可能。

五、方法 二:屏蔽 nf_tables 模块(临时缓解)

业务确实不能停、内核暂时不能升的场景,可以先不让这个模块加载:

lsmod | grep nf_tables

确认已加载后,在 /etc/modprobe.d/ 下建一个黑名单文件,比如 nf_tables-blacklist.conf,内容一行:

blacklist nf_tables

重启生效,再确认模块文件位置:

find / -name "*nf_tables*"
modinfo nf_tables

重启后 lsmod | grep nf_tables 没有输出,就说明屏蔽成功。注意:nf_tables 是 nftables 防火墙的后端,屏蔽后 nft 相关规则会失效,如果这台机器在用 nftables 做防火墙,这条路要先评估业务影响。

六、方法 三:限制用户命名空间(跑容器时的选择)

如果模块不能屏蔽、容器也没在跑,可以退一步限制用户命名空间:

RedHat/CentOS:

echo "user.max_user_namespaces=0" > /etc/sysctl.d/userns.conf
sysctl -p /etc/sysctl.d/userns.conf

Debian/Ubuntu 临时生效:

sudo sysctl -w kernel.unprivileged_userns_clone=0

需要在重启后仍然保持:

echo kernel.unprivileged_userns_clone=0 | sudo tee /etc/sysctl.d/99-disable-unpriv-userns.conf

七、选哪条、注意什么

  • 能升内核就升,这是唯一根治手段,其余两条都是缓解。
  • 屏蔽模块前先确认机器上有没有在用 nftables 防火墙,误伤了就是断网。
  • 禁用用户命名空间前必须评估容器依赖——很多容器实现要用 user_namespaces 做安全增强和隔离,一禁可能起不来。
  • 缓解措施生效后要设一个复查时间点,比如两周内必须把内核升上去,否则就一直裸奔。
  • 生产环境任何一项改动前先快照或备份,先在测试机跑一遍。

最后说明一句:本文所有内容只面向管理员对本机、自有资产或已明确授权环境的补丁管理与自查工作,不提供任何利用构造细节。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表