Linux 内核藏了九年的洞,732 字节就能拿 root
五一假期前一天,一个叫 CVE-2026-31431 的漏洞被公开了。研究员给它起名叫 Copy Fail。
这个洞从 2017 年就埋在那里了,九年,没人发现。然后某天一个研究员用 AI 扫了一小时 crypto 子系统,找到了。
它有多好用?一个 732 字节的 Python 脚本,在 Ubuntu、RHEL、Amazon Linux 上跑,每次都拿到 root shell。不需要竞态条件,不需要匹配内核版本,不需要预编译载荷。写完直接跑。
CISA 已经把它列进在野利用目录了。
漏洞是怎么回事
问题出在 Linux 内核的 AF_ALG 加密接口里,具体是 algif_aead.c 这个模块。
2017 年有人为了让 AEAD 解密快一点,做了个优化:把源和目标的 Scatterlist 设成同一个,直接链接文件的页缓存。这个改动本身没什么问题,但和 splice() 系统调用放在一起,就出事了。
攻击流程是这样的:把 /usr/bin/su 这类 setuid 文件通过 splice() 送进 AF_ALG 套接字,内核处理时会往缓冲区末尾写 4 字节序列号,因为上面那个优化,这 4 字节直接写进了本来只读的文件页缓存。缓存被改了,下次执行这个文件,就跑攻击者的代码了。
容器环境更麻烦。Linux 的页缓存是跨容器共享的,容器里的代码可以用这个方法改宿主机的文件。K8s、多租户云主机,全在影响范围里。
各发行版怎么修
Ubuntu / Debian
Ubuntu 安全团队已经通过 kmod 包推了缓解补丁,完整内核修复也在路上。直接升级就行:
sudo apt update && sudo apt upgrade如果想立刻生效、不想重启,手动禁用模块:
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
sudo rmmod algif_aead 2>/dev/nullRHEL / CentOS / AlmaLinux / Rocky Linux
Red Hat 定级 Important,修复包在加急发布中。用 dnf 更新内核:
sudo dnf update kernel
sudo rebootSUSE / openSUSE
sudo zypper update kernel-default
sudo rebootArch / Manjaro
Arch 滚动更新,直接同步就有修复内核。Manjaro 已在 testing 分支发布 6.18.26,stable 用户可以手动装或者等推送:
sudo pacman -Syu
sudo reboot来不及更新的通用缓解方法
所有发行版都可以用这两条命令先顶着:
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
sudo rmmod algif_aead 2>/dev/null重启后依然生效。禁掉这个模块会影响依赖 AF_ALG AEAD 接口的加密程序,但普通服务器基本感觉不到。
飞牛 NAS 怎么修
飞牛官方确认 fnOS 本身不依赖这个模块,禁掉不影响正常使用。官方出了一键脚本,SSH 进去跑就行。开始之前确认下 SSH 是否开启。
第一步,SSH 登录 NAS:
ssh 用户名@NAS的IP飞牛自带的网页终端也可以,不一定要用外部客户端。
第二步,切到 root:
sudo -i第三步,跑官方脚本:
curl https://static2.fnnas.com/aptfix/fixbug_algif.sh | bash -s -- disable注意 -- disable 前后是半角空格,从公众号复制可能有问题,建议从飞牛论坛原帖复制。
跑完重启,漏洞就失效了。
如果之后需要恢复:
curl https://static2.fnnas.com/aptfix/fixbug_algif.sh | bash -s -- enable飞牛的内核级修复版本还在做稳定性验证,后续会推系统更新,到时候更新一次就彻底修了。
两个容易忽视的地方
一是 Docker 容器。就算 NAS 只有你自己在用,跑在上面的容器同样可以利用这个漏洞拿到 root,权限隔离在这个漏洞面前没用。不认识来源的镜像,别随便跑。
二是虚拟机。飞牛上跑的虚拟机里如果是 Linux,同样受影响,要在虚拟机内部单独处理,禁模块或升级内核都行。