临时修复 Copy Fail 漏洞

Contents
  1. 1. 检查发行版更新状态
  2. 2. 方法一:暂时禁用 algif_aead 模块
  3. 3. 方法二:重启前临时修复
    1. 3.1. 1. 更新内核
    2. 3.2. 2. 查看当前运行内核是否有 Copy Fail 暴露面
    3. 3.3. 3. 重启后自动消失的临时修法
    4. 3.4. 4. 检查修法是否成功

针对 CVE-2026-31431,在不重启服务器的情况下临时封堵漏洞。

本文以 Debian / Ubuntu 系统为例。

检查发行版更新状态

首先,需要先确认你在使用的发行版是否已经推送了该漏洞的内核修复更新。

例如:Debian 系统在此页面查看;Ubuntu 系统在此页面查看。

  • 若你的版本尚未有更新,采用方法一
  • 若已有更新,直接更新系统,然后重启
  • 若已有更新,但暂时不方便重启,采用方法二

方法一:暂时禁用 algif_aead 模块

此方法适用于:发行版尚未推送内核更新,暂时通过禁用模块避免漏洞利用。

执行:

1
2
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif-aead.conf
sudo modprobe -r algif_aead 2>/dev/null || true

这样,不需要重启就能生效。重启后仍生效。

检查:

1
2
sudo modprobe algif_aead; echo $?
lsmod | grep '^algif_aead' || echo "algif_aead not loaded"

方法二:重启前临时修复

此方法适用于:已接收到漏洞的内核更新,但暂时不方便重启加载新内核的情况。

不适用于内核无法接收安全更新的任何情况。

1. 更新内核

1
2
sudo apt update
sudo apt full-upgrade -y

虽然已经收到了内核更新,但未重启前仍未加载新内核。因此做以下临时修复。

2. 查看当前运行内核是否有 Copy Fail 暴露面

1
2
3
4
5
6
7
8
uname -r

grep -E '^CONFIG_CRYPTO_USER_API_AEAD=' /boot/config-$(uname -r) 2>/dev/null || \
zcat /proc/config.gz 2>/dev/null | grep -E '^CONFIG_CRYPTO_USER_API_AEAD='

modprobe -n -v algif_aead 2>/dev/null || true

lsmod | grep '^algif_aead' || echo "algif_aead not loaded"

判断:

1
2
3
CONFIG_CRYPTO_USER_API_AEAD=m   # algif_aead 是模块,可以临时禁用
CONFIG_CRYPTO_USER_API_AEAD=y # 编进内核,无法用 modprobe 禁用,只能重启到新内核
没有输出 / is not set # 一般不受这个 algif_aead 路径影响

如果看到类似:

1
insmod /lib/modules/.../algif_aead.ko

说明它可以被加载,需要临时禁用。


3. 重启后自动消失的临时修法

1
2
3
4
5
6
sudo install -d -m 0755 /run/modprobe.d

printf 'install algif_aead /bin/false\n' | \
sudo tee /run/modprobe.d/zz-copyfail-disable-algif-aead.conf >/dev/null

sudo modprobe -r algif_aead 2>/dev/null || true

这只写到 /run/modprobe.d重启后自动消失


4. 检查修法是否成功

1
2
3
4
5
modprobe -n -v algif_aead

lsmod | grep '^algif_aead' || echo "algif_aead not loaded"

cat /run/modprobe.d/zz-copyfail-disable-algif-aead.conf

成功状态应类似:

1
2
3
install /bin/false
algif_aead not loaded
install algif_aead /bin/false

再做一次实际加载测试:

1
sudo modprobe algif_aead; echo $?

成功禁用时应返回非 0,例如:

1
1

然后确认仍未加载:

1
lsmod | grep '^algif_aead' || echo "algif_aead still blocked"
Mastodon