五一假期前一天,一个叫 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/null

RHEL / CentOS / AlmaLinux / Rocky Linux

Red Hat 定级 Important,修复包在加急发布中。用 dnf 更新内核:

sudo dnf update kernel
sudo reboot

SUSE / openSUSE

sudo zypper update kernel-default
sudo reboot

Arch / 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 是否开启。

0-QUVH

第一步,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,同样受影响,要在虚拟机内部单独处理,禁模块或升级内核都行。