CVE-2026-31431修复实践:Anolis、RedHat、Ubuntu处置建议

导语

最近Linux内核本地提权漏洞CVE-2026-31431受到较多关注。这个漏洞也被业内称为Copy Fail,问题出在内核AF_ALG/AEAD相关处理路径上。对于一台只允许可信管理员登录的单用户主机,它的现实风险未必最高;但在多用户服务器、容器宿主机、CI/CD Runner、共享测试机这类环境里,风险就完全不一样了,因为低权限用户一旦能够在本地执行代码,就有机会继续向root提权。

先来看下官方的响应速度,几家主流发行版对CVE-2026-31431的处理都比较快:

  • 按照Ubuntu官方披露口径,漏洞于2026年4月29日公开;Ubuntu在4月30日即发布官方缓解说明和kmod缓解;
  • Red Hat也在4月30日发布官方漏洞公告和临时缓解建议,基本都属于1天内响应;
  • Anolis OS则在2026年5月2日发布ANSA-2026:0564、ANSA-2026:0565、ANSA-2026:0566三份官方修复公告,约为披露后2至3天完成官方修复发布。

从处置思路上看,这类内核漏洞没有太多花哨空间,核心就三件事:先看发行版官方公告,再上正式修复;一时不能升级,就用启动参数做临时缓解;如果确认相关能力是模块方式加载,再补一层模块黑名单。 真正的修复标准也很明确,不是“已经执行过update”,而是“系统已经重启并运行在官方修复后的内核版本上”。

本文把AnolisOS、RHEL和Ubuntu三类系统放在一起梳理,方便运维团队直接落地。

 

注意:阿里云、清华等非官方镜像站通常会同步上游仓库的软件包,但同步速度和同步完整性并不完全等同于官方源。实际排查中,经常出现“修复包已经同步,但安全公告元数据尚未同步”或“镜像站已提供更新,但本机启用的仓库路径不完整”的情况。因此,使用第三方镜像源时,不能只看是否执行了yum updatednf update,还应同时核对可用内核版本、CVE公告元数据以及当前启用仓库配置,确认修复包确实已经进入本机可见仓库。”

先看几个官方入口

如果你在做排查,建议先从发行版官方页面确认自己所在版本是否受影响,以及修复包是否已经进入仓库。

  • Red Hat安全公告:https://access.redhat.com/security/vulnerabilities/RHSB-2026-002
  • Red Hat CVE页面:https://access.redhat.com/security/cve/CVE-2026-31431
  • Ubuntu CVE页面:https://ubuntu.com/security/CVE-2026-31431
  • Ubuntu官方说明:https://ubuntu.com/blog/copy-fail-vulnerability-fixes-available
  • NVD CVE页面:https://nvd.nist.gov/vuln/detail/CVE-2026-31431

Anolis OS:先看ANSA公告,再升级内核

龙蜥这次给出的修复范围比较清楚,AnolisOS7、8、23都已经有对应安全公告:

系统版本内核分支官方公告
Anolis OS 7ANCK 4.19ANSA-2026:0566
Anolis OS 8ANCK 5.10ANSA-2026:0565
Anolis OS 23ANCK 6.6ANSA-2026:0564

如果是AnolisOS7或8,直接走yum 更新内核即可:

sudo yum clean all
sudo yum makecache
sudo yum update kernel
sudo reboot

如果是AnolisOS23,则使用dnf

sudo dnf clean all
sudo dnf makecache
sudo dnf update kernel
sudo reboot

很多时候,真正的问题不是“怎么升级”,而是“仓库里到底有没有同步到修复版”。这时可以直接查安全公告和可用内核版本:

yum updateinfo info --cve CVE-2026-31431
yum --showduplicates list kernel

或者:

dnf updateinfo info --cve CVE-2026-31431
dnf --showduplicates list kernel

如果输出里已经能看到ANSA-2026:0564ANSA-2026:0565ANSA-2026:0566,说明当前启用的源已经同步了这次修复。接下来要看的不是“包装没装”,而是“运行内核切没切过去”:

rpm -q kernel
uname -r
needs-restarting -r

这里rpm -q kernel表示修复内核是否已经安装,uname -r表示当前实际运行的是哪个内核。很多环境里update之后没有立即重启,看起来补丁已经打了,实际业务还跑在旧内核上,这种情况并不算真正修复完成。

RedHat:官方缓解最完整,RHEL 8/9/10需要重点关注

RedHat官方将CVE-2026-31431定级为Important。根据官方公开信息,RHEL8、RHEL9、RHEL10需要重点关注,RHEL6、RHEL7不受影响。

官方资料入口如下:

  • Red Hat安全公告RHSB-2026-002:https://access.redhat.com/security/vulnerabilities/RHSB-2026-002
  • Red Hat CVE页面:https://access.redhat.com/security/cve/CVE-2026-31431
  • RHEL影响范围说明:https://access.redhat.com/solutions/7141931

在修复动作上,RHEL的原则也很直接:先把修复内核装上,再安排重启窗口。

sudo dnf clean all
sudo dnf makecache
sudo dnf update kernel
sudo reboot

RHEL 8如果环境里仍主要使用yum,同样可以执行:

sudo yum clean all
sudo yum makecache
sudo yum update kernel
sudo reboot

根据官方公告,当时公开的修复版本示例如下:

系统版本修复版本示例官方公告
RHEL 8kernel-4.18.0-553.123.1.el8_10RHSA-2026:13577
RHEL 9kernel-5.14.0-611.54.1.el9_7RHSA-2026:13565
RHEL 10.0 EUSkernel-6.12.0-55.71.1.el10_0RHSA-2026:13887
RHEL 10.1kernel-6.12.0-124.55.1.el10_1RHSA-2026:13566

生产环境不要死记表里的版本号,真正有意义的是确认自己订阅的仓库里已经出现对应RHSA公告和修复内核:

dnf updateinfo info --cve CVE-2026-31431
dnf updateinfo list --cve CVE-2026-31431
dnf --showduplicates list kernel

如果是yum体系,则执行:

yum updateinfo info --cve CVE-2026-31431
yum updateinfo list --cve CVE-2026-31431
yum --showduplicates list kernel

部分企业环境会同时部署Red Hat kpatch。这种场景下,热补丁可以帮助你先压缩暴露窗口,但它不应替代正式的内核升级:

sudo dnf update kpatch-patch
sudo kpatch list

换句话说,kpatch可以帮你争取时间,但最终还是要在维护窗口里完成真正的kernel升级和重启。

Ubuntu:除了升级内核,还提供了kmod级别缓解

Ubuntu对这个漏洞的公开说明相对完整,除了CVE页面,还有单独的博客说明和USN公告:

  • Ubuntu CVE页面:https://ubuntu.com/security/CVE-2026-31431
  • Ubuntu官方说明:https://ubuntu.com/blog/copy-fail-vulnerability-fixes-available
  • Ubuntu USN-8226-1:https://ubuntu.com/security/notices/USN-8226-1

Ubuntu的正式修复路径依然是系统升级和内核升级:

sudo apt update
sudo apt upgrade
sudo reboot

不过Ubuntu这次还给了一个比较实用的思路,就是通过kmod侧做临时缓解,阻止algif_aead被继续加载。如果暂时不方便做完整升级,可以先把kmod升上去:

sudo apt update
sudo apt install --only-upgrade kmod

然后尝试卸载已加载模块:

sudo rmmod algif_aead 2>/dev/null || true

再检查它是否还在:

grep -qE '^algif_aead ' /proc/modules && echo "algif_aead loaded" || echo "algif_aead not loaded"

Ubuntu公布过的kmod缓解版本包括:

Ubuntu 版本kmod 缓解版本
Ubuntu 22.04 LTS29-1ubuntu1.1
Ubuntu 24.04 LTS31+20240202-2ubuntu7.2
Ubuntu 25.1034.2-2ubuntu1.1
Ubuntu 20.04 LTS27-1ubuntu2.1
Ubuntu 18.04 ESM24-1ubuntu3.5+esm1

可以这样确认当前主机上的状态:

dpkg -l kmod
uname -r
dpkg -l 'linux-image*' | grep '^ii'

Ubuntu这类方案的意义在于“先减风险”,但它和RHEL的kpatch一样,不能代替最终的正式修复。最终仍应落到升级后的内核版本和重启生效上。

为什么Boot参数比单纯黑名单更可靠

这次漏洞处置里,一个容易被忽略的点是:相关能力在某些内核版本中可能不是独立模块,而是built-in,也就是直接编进内核本体。 一旦是这种情况,单纯写一个blacklist algif_aead,并不能保证问题路径真的被禁用了。

这也是为什么RedHat官方明确给出了一组基于启动参数的临时缓解方式。优先推荐的是:

sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"
sudo reboot

重启后用下面的命令确认参数已经进入内核启动项:

cat /proc/cmdline

如果输出中能看到:

initcall_blacklist=algif_aead_init

说明这条临时缓解已经生效。

如果需要更宽一点的限制范围,RedHat还给了两个备选:

sudo grubby --update-kernel=ALL --args="initcall_blacklist=crypto_authenc_esn_module_init"

或者:

sudo grubby --update-kernel=ALL --args="initcall_blacklist=af_alg_init"

这三种方式里,通常建议优先algif_aead_init,因为影响面相对更小;af_alg_init的覆盖范围更大,业务侧受到的波动也更可能明显一些。尤其在依赖内核加密接口、VPN、存储加密或者某些安全代理的环境里,最好先在测试环境验证。

等正式内核修复完成以后,记得把这个临时启动参数收回:

sudo grubby --update-kernel=ALL --remove-args="initcall_blacklist=algif_aead_init"
sudo reboot

模块黑名单该怎么用,边界又在哪里

模块黑名单不是没用,但它有很清楚的适用边界:前提是algif_aead的确以模块形式存在。 如果它本来就是内核内置,黑名单只能给人一种“已经处理了”的错觉。

判断方法并不复杂,先看内核配置:

grep CONFIG_CRYPTO_USER_API_AEAD /boot/config-$(uname -r)

结果通常可以这样理解:

结果含义
CONFIG_CRYPTO_USER_API_AEAD=m模块形式,可使用黑名单
CONFIG_CRYPTO_USER_API_AEAD=y内置形式,黑名单不可靠

再看模块信息:

modinfo algif_aead

如果能看到.ko文件路径,通常说明它确实是模块。

确认可以用黑名单后,再去写配置:

echo "blacklist algif_aead" | sudo tee /etc/modprobe.d/blacklist-algif_aead.conf
echo "install algif_aead /bin/false" | sudo tee -a /etc/modprobe.d/blacklist-algif_aead.conf

如果当前已经加载过,还要把它卸掉:

sudo rmmod algif_aead

然后检查结果:

lsmod | grep algif_aead
modprobe -n -v algif_aead

理想情况下,modprobe -n -v algif_aead会显示:

install /bin/false

如果模块在initramfs阶段就被带起来了,还需要重建initramfs并重启。

RHEL/Anolis:

sudo dracut -f
sudo reboot

Ubuntu:

sudo update-initramfs -u
sudo reboot

所以,黑名单更适合当成一个附加防线,而不适合被当成“唯一修复方案”。

真正落地时,建议按这个顺序处理

如果要把这件事做得稳一点,建议顺序不要乱:

  1. 先确认系统版本、当前内核版本,以及自己用的是官方源还是镜像源。
  2. 再查发行版公告,确认CVE-2026-31431的修复包是否已经同步到本机启用的仓库。
  3. 仓库里已经有修复版本的,优先直接升级kernel并安排重启。
  4. 业务窗口暂时不允许升级的,先通过Boot参数降低风险。
  5. 确认algif_aead是模块形式的,再叠加模块黑名单。
  6. 正式修复完成后,清理临时缓解项,避免长期影响业务加密能力。

把几种手段放在一起看,优先级其实很清楚:

措施推荐程度是否需要重启适用场景主要局限
升级修复内核最高需要所有生产环境需要维护窗口
Boot参数缓解需要暂时不能升级、且怀疑built-in可能影响加密相关业务
模块黑名单通常需要明确是模块加载场景built-in场景下不可靠
kpatch中高通常不需要已部署RHEL热补丁环境不是最终修复
Ubuntu kmod缓解中高视情况Ubuntu临时防护仍需后续正式升级

最后验收,不要只看“装了没”,要看“跑的是不是新内核”

RHEL/Anolis建议至少确认这几项:

uname -r
rpm -q kernel
yum updateinfo info --cve CVE-2026-31431
dnf updateinfo info --cve CVE-2026-31431
cat /proc/cmdline
lsmod | grep algif_aead
needs-restarting -r

Ubuntu则重点看下面这些:

uname -r
dpkg -l 'linux-image*' | grep '^ii'
dpkg -l kmod
grep -qE '^algif_aead ' /proc/modules && echo "algif_aead loaded" || echo "algif_aead not loaded"

真正可以对外说“修复完成”的标准,至少应该满足下面几条:

  • 官方仓库已经提供对应修复包。
  • 本机已经安装修复版本。
  • 系统已经重启并运行到修复后的内核。
  • 临时缓解项处于可解释、可验证、可回退的状态。

结语

Copy Fail这类内核漏洞的处置,最容易出问题的地方不是命令不会敲,而是判断标准放得太松。执行过yum updatednf updateapt upgrade,并不等于这台主机已经安全;真正重要的是,当前运行内核是否已经切换到官方修复版本。

如果只能给一个最实用的建议,那就是:优先升级官方修复内核;不能立即升级时,用Boot参数先压风险;确认是模块场景后,再补黑名单。 这样做虽然不复杂,但路径最稳,也最符合发行版官方的处置逻辑。

声明:来自木讷大叔爱运维,仅代表创作者观点。链接:https://eyangzhen.com/8183.html

木讷大叔爱运维的头像木讷大叔爱运维

相关推荐

添加微信
添加微信
Ai学习群
返回顶部