如何在 AlmaLinux、Rocky Linux、Ubuntu 和 Debian 上修补 CVE-2026-31431(Copy Fail)——完整服务器指南
如果你正在运行一台服务器,并且从周末以来就没有碰过它,请暂停阅读本文,去检查一下你的内核版本。说真的,去另一个标签页运行uname -r。我会等你。
回来了?很好。我这么问是有原因的。
一个新的 Linux 内核漏洞被称为Copy Fail,编号为CVE-2026-31431,于2026 年 4 月 29 日被公开披露。在48 小时内,它被列入了 CISA 已知被利用漏洞目录。可怕的是受影响内核的时间线。每个自 2017 年中期以来构建内核的主流发行版都携带这个缺陷。这不是笔误。我们说的是近九年的 Linux 内核,运行在数百万台服务器上。
CVE-2026-31431的 Linux 修补程序正在各发行版中推出。如果你在AlmaLinux、Rocky或 Debian上运行任何允许不受信任用户获得 shell 访问权限的服务器,例如多租户主机、容器构建农场、CI 运行器或共享主机环境,本指南将带你完成修复。
什么是 CVE-2026-31431?
Copy Fail 是 Linux 内核algif_aead模块中的一个本地权限提升(LPE)漏洞,该模块是 AF_ALG 用户空间加密 API 的一部分。该缺陷于 2017 年通过提交 72548b093ee3 引入,该提交将 AEAD 操作切换为就地处理。上游修复基本上撤销了那个十年前的优化。
实际版本是这样的。任何无特权的本地用户都可以向系统上任何可读文件的页面缓存中写入4 个受控字节,并利用此获得root 权限。整个漏洞利用程序可以放在一个732 字节的 Python 脚本中。是的,732 字节。该漏洞源于 Linux 内核 AEAD 加密实现(algif_aead)中的逻辑缺陷,其中散集列表的不当处理允许超出预期边界的写入。
使 Copy Fail 比Dirty Pipe更恶劣的是它不是竞态条件。它是确定性的。该错误每次都会运行,不需要不稳定的时序或特定版本的调整。CVSS 评分为7.8(高),但说实话,这个数字低估了现实世界的风险。该漏洞利用在开发者笔记本电脑上的工作方式与在 Kubernetes 节点上完全相同,而且公开的 PoC 小到可以放进一条推文。
为什么你现在需要修补这个漏洞
风险随着能接触你机器的人数而扩大。如果你运营的是只有你的 SSH 密钥存在的单租户服务器,暴露是有限的,但仍然真实。任何 Web 应用的 RCE 都会立即变成 root 权限的妥协。如果你运行共享主机、多租户 SaaS、容器平台或 CI/CD 运行器,这确实是紧急的。
有几个值得考虑的具体问题。
容器逃逸是显而易见的一个。成功的利用会导致完全的 root 权限提升(对机密性、完整性和可用性的高影响),并可能促进容器突破、多租户妥协以及在共享环境中的横向移动。Kubernetes 运营商,这意味着你。
合规性是枯燥但昂贵的一个。PCI-DSS、HIPAA 和 SOC 2,所有这些都要求及时修补高严重性的 CVE。如果你是联邦承包商或处于受监管行业,CISA KEV 列表会进一步收紧这些时间线。
然后是隐蔽性。因为损坏发生在页面缓存(RAM)中,而不是物理磁盘上,标准的文件完整性工具不会检测到变化。Tripwire、AIDE、OSSEC 文件完整性检查不会发现活跃的利用。你的认证日志可能会显示一些奇怪的su活动,但仅此而已。
修补前的准备工作
在运行任何操作之前,做这些事情。跳过它们就是如何将常规的内核更新变成计划外停机的原因。如果说我上周学到了什么,那就是考虑备份的时机是在你需要它们之前,而不是之后。
首先,对系统进行快照或备份。如果你的服务器在云端提供商上,现在就做一个快照。在裸机上,至少备份/etc、/var/lib、你的数据库目录,以及/home中你真正关心的任何内容。如果你在 cPanel 上,在接触内核之前运行 JetBackup 或 R1Soft 快照是值得的。
其次,用uname -r检查你当前的内核,并把它写在某个地方。更新后你需要它来对比。
第三,确保你有一个控制台备用方案。如果这台服务器是远程的,而你只有 SSH 访问权限,登录到你的主机面板,确认你可以访问串口控制台、KVM 或恢复模式。内核更新几乎总是顺利的。但"几乎总是"这句话中承担了很多工作。
修补 CVE-2026-31431 的分步指南
AlmaLinux
AlmaLinux 在这方面行动迅速。他们的核心团队在 Red Hat 发布之前就用上游提交构建了修补后的内核,这很不寻常但令人感激,特别是对于我们这些在 AlmaLinux 上运行 cPanel 服务器的人来说。修补后的内核现在正在推出到生产仓库/镜像。你不再需要启用测试仓库来获取它们。
运行这些命令:
sudo dnf clean metadatasudo dnf upgradesudo reboot
重启后,用uname -r验证。直接来自 AlmaLinux 勘误表的修补版本为:
AlmaLinux 8:kernel-4.18.0-553.121.1.el8_10或更高版本
AlmaLinux 9:kernel-5.14.0-611.49.2.el9_7或更高版本
AlmaLinux 10:kernel-6.12.0-124.52.2.el10_1或更高版本
如果你的镜像尚未同步,大多数运行在3 小时周期上,所以等一个小时再试。
一个 cPanel 特定的注意事项:如果你有 EasyApache 或其他 cPanel 服务固定到特定的内核模块,重启后运行/scripts/upcp --force以确保 cPanel 本身是最新的。我在恢复自己的服务器时不得不这样做。
Rocky Linux
Rocky Linux 比 AlmaLinux 更严格地跟踪 Red Hat 发布,因此其修补内核的时间取决于 RHEL 上游流程。在假设特定的修补版本已经上线之前,请查看 Rocky Linux 安全公告页面(security.rockylinux.org)或你的仓库。不要信任第三方文章(包括这篇)提供的精确内核字符串。从 Rocky 的官方勘误表中获取最新的。
工作流程本身与 AlmaLinux 相同:
sudo dnf clean metadatasudo dnf check-update kernelsudo dnf update kernelsudo reboot
如果修补后的内核尚未到达你的仓库,在 RHEL 系列系统上最安全的临时措施是grubby 黑名单方法。你可能在 oss-security 上看到的 modprobe 变通方法在基于 RHEL 的发行版上不起作用,因为algif_aead是内置于内核中的,而不是作为模块加载的。运行这些命令只会给你一种虚假的安全感。
sudo grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init"sudo reboot
重启后,用cat /proc/cmdline确认。你应该在输出中看到initcall_blacklist=algif_aead_init。
Ubuntu
该漏洞影响 Resolute(26.04)之前的所有 Ubuntu 版本。如果你已经在运行 26.04,你是安全的。其他所有人,这里是要运行的命令:
sudo apt updatesudo apt upgradesudo apt install --only-upgrade linux-image-generic linux-headers-genericsudo reboot
如果你在云端特定内核上,如linux-image-aws、linux-image-gcp或linux-image-azure,替换为适当的包名。重启后,运行uname -r并针对你的版本的 Canonical USN 公告进行检查。
Ubuntu 的一个好处是:每 24 小时自动应用新的安全更新。如果你启用了这个功能,上述补丁将在可用后的 24 小时内自动应用。如果你启用了unattended-upgrades,基于 kmod 的缓解措施可能已经在位。不过,你仍然需要重启以加载修补后的内核本身。
Debian
Debian 13(Trixie)在这方面行动迅速。安全仓库在全新安装 Trixie 后默认启用,因此标准升级流程有效:
sudo apt updatesudo apt upgradesudo apt install --only-upgrade linux-image-amd64sudo reboot
重启后,uname -r应显示 Trixie 上的6.12.85-1或更高版本。Debian 12(Bookworm)通过安全仓库以6.1.170-1修补,因此如果你的源包含安全套件,同样的升级流程适用。Debian 11(Bullseye)在撰写本文时仍被列为易受攻击,因此在假设修复已到达之前,请检查security-tracker.debian.org/tracker/CVE-2026-31431。
如果你的/etc/apt/sources.list.d/debian.sources不包含安全套件,请在运行升级之前添加它。Trixie 将该配置从旧的sources.list位置移除了,所以如果它看起来不熟悉,不要感到惊讶。
如何验证你的系统已修补
基本检查是uname -r,但那只能告诉你内核版本,不能告诉你错误是否已消除。对于更直接的验证:
# 检查当前运行的内核uname -r# 在 RHEL 系列系统上rpm -q --changelog kernel | grep -i "2026-31431" | head# 在 Debian/Ubuntu 上apt changelog linux-image-$(uname -r) 2>/dev/null | grep -i "2026-31431"
如果你想要绝对的信心,来自 Theori(theori-io/copy-fail-CVE-2026-31431)的公开 PoC 在修补后的内核上会失败。显然不要在生产环境上运行它。也不要在你不拥有每个工作负载的共享基础设施上运行它,因为这在法律上是另一个问题。
额外的安全提示
修补这一个 CVE 不等于安全。如果你还没有建立,有几个习惯值得养成,部分是从我自己的错误中学到的。
保留异地备份,并测试它们。当我的服务器被擦除时,我有备份。这是我在这里写作而不是哭泣的唯一原因。如果你没有自动化的、异地的、经过测试的备份,今天就解决这个问题。同一提供商上的快照不是备份。它们是方便的。真正的备份存在于攻击者无法触及的地方。
启用无人值守的安全更新。在 Ubuntu 和 Debian 上,sudo apt install unattended-upgrades并启用安全源。在 RHEL 系列上,dnf-automatic做同样的工作。
运行真正的防火墙和 fail2ban。UFW 或 firewalld 加上 fail2ban 可以捕获大多数愚蠢的暴力破解流量。它不会阻止 Copy Fail 风格的本地漏洞利用,但它减少了攻击者获得使用它所需的本地立足点的机会。
定期扫描。OpenSCAP、Lynis 或商业扫描器如 Qualys 和 Tenable 会在你在凌晨 2 点在 Twitter 上发现它们之前标记缺失的内核补丁。
关注你的日志。防御者应该利用上下文,例如底层主机是否包含敏感秘密或在环境中具有高权限。带有缺失调用用户名的异常su记录是一个值得搜索的已记录的后利用信号。
常见问题故障排除
dnf或apt中没有出现内核更新。通常是镜像同步延迟。运行dnf clean all或apt clean && apt update,一小时后再试。确认你的仓库指向官方镜像,而不是某个前任设置并忘记的过时本地镜像。
更新后系统无法启动。重启并从 GRUB 菜单中选择之前的内核。在大多数发行版上,旧内核被保留为备用,正是为了这个原因。一旦你重新进入,向你的发行版提交一个错误报告,并停留在旧内核上直到问题解决。
重启后 SSH 拒绝连接。几乎总是防火墙或 SELinux/AppArmor 问题,而不是内核本身。使用控制台检查systemctl status sshd和你的防火墙规则。如果你应用了algif_aead缓解措施,并且某个应用程序崩溃了,该应用程序可能直接使用 AF_ALG 加密接口。这很少见,但在硬件加密卸载设置中是可能的。
回滚。在 RHEL 系列上:sudo grubby --set-default /boot/vmlinuz-<旧版本>并重启。在 Debian 和 Ubuntu 上,编辑/etc/default/grub将GRUB_DEFAULT设置为旧的内核条目,运行sudo update-grub,然后重启。
结论
Copy Fail 是那种惩罚自满的漏洞。漏洞利用程序很小。它是可靠的。而且它针对的是近九年的内核血统。在大多数现代发行版上,修复方法是在你的发行版发布修补内核后,执行一次upgrade && reboot。