kylin_mitigate-cve-2026-31431.sh
#!/bin/bash
# 脚本名称: kylin_mitigation-cve-2026-31431.sh
# 功能: 麒麟系统CVE-2026-31431漏洞缓解脚本
# 描述: 通过禁用af_alg_init启动项、删除algif_aead模块文件缓解CVE-2026-31431漏洞
# 适用范围: 银河麒麟桌面操作系统,银河麒麟服务器操作系统
# 下载地址:https://security-oss.kylinos.cn/Desktop/CVE-2026-31431/kylin_mitigate-CVE-2026-31431.zip
# 使用方法: sudo ./kylin_mitigation-cve-2026-31431.sh
# 检查是否为root用户
if [ "$(id -u)" -ne 0 ]; then
echo "[错误] 此脚本必须具有root权限才能执行。"
echo ""
echo "请使用以下命令运行:"
echo " sudo ./$0"
echo ""
echo "或切换到root用户执行:"
echo " sudo su; ./$0"
echo ""
exit 1
fi
CONFIG_FILE="/proc/config.gz"
MODPROBE_CONF="/etc/modprobe.d/disable-algif-aead.conf"
GRUB_CONF="/etc/default/grub"
# 检查zgrep命令是否可用
if ! command -v zgrep >/dev/null 2>&1; then
echo "[错误] zgrep命令未找到,请确保已安装gzip软件包。" >&2
exit 1
fi
# 检查/proc/config.gz文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
echo "[错误] 无法访问/proc/config.gz文件,请确认内核已启用CONFIG_IKCONFIG_PROC配置。" >&2
exit 1
fi
# 检查CONFIG_CRYPTO_USER_API_AEAD配置状态
CONFIG_MATCH=$(zgrep -E "^CONFIG_CRYPTO_USER_API_AEAD\s*=" "$CONFIG_FILE" 2>/dev/null | tail -1)
if [ -z "$CONFIG_MATCH" ]; then
echo "[信息] 未检测到CONFIG_CRYPTO_USER_API_AEAD配置,系统不受CVE-2026-31431漏洞影响。"
exit 0
fi
echo "[开始] 检测到CONFIG_CRYPTO_USER_API_AEAD配置,系统受CVE-2026-31431漏洞影响。"
# 提取配置值
CONFIG_VALUE=$(echo "$CONFIG_MATCH" | grep -oE '[my]$' || echo "")
# 步骤1: 更新GRUB配置以禁用af_alg_init
echo "[步骤1] 正在更新GRUB引导配置以禁用af_alg_init..."
if [ -f "$GRUB_CONF" ]; then
# 判断是否为桌面版(存在update-grub2命令)
if [ -x "/usr/sbin/update-grub2" ]; then
echo "[信息] 当前为银河麒麟桌面操作系统。"
if ! grep -q 'initcall_blacklist=af_alg_init' "$GRUB_CONF"; then
sed -i '/GRUB_CMDLINE_LINUX_DEFAULT=/s/"$/ initcall_blacklist=af_alg_init"/' "$GRUB_CONF"
echo "[完成] GRUB配置文件已更新,在GRUB_CMDLINE_LINUX_DEFAULT字段添加了af_alg_init启动黑名单。"
else
echo "[信息] GRUB配置中已包含af_alg_init启动黑名单,无需修改。"
fi
else
echo "[信息] 当前为银河麒麟服务器操作系统。"
if ! grep -q 'initcall_blacklist=af_alg_init' "$GRUB_CONF"; then
sed -i '/GRUB_CMDLINE_LINUX=/s/"$/ initcall_blacklist=af_alg_init"/' "$GRUB_CONF"
echo "[完成] GRUB配置文件已更新,在GRUB_CMDLINE_LINUX字段添加了af_alg_init启动黑名单。"
else
echo "[信息] GRUB配置中已包含af_alg_init启动黑名单,无需修改。"
fi
fi
# 步骤2: 重新生成GRUB配置文件
echo "[步骤2] 正在重新生成GRUB配置文件..."
if [ -x "/usr/sbin/update-grub2" ]; then
# 桌面版使用update-grub2
/usr/sbin/update-grub2
if [ $? -eq 0 ]; then
echo "[完成] GRUB配置文件已更新(使用update-grub2)。"
else
echo "[警告] update-grub2执行失败,请手动检查GRUB配置。"
fi
else
# 服务器版使用grub2-mkconfig
if [ -f "/boot/efi/EFI/kylin/grub.cfg" ]; then
/usr/sbin/grub2-mkconfig -o /boot/efi/EFI/kylin/grub.cfg
echo "[完成] UEFI模式GRUB配置已更新。"
fi
if [ -f "/boot/grub2/grub.cfg" ]; then
/usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg
echo "[完成] 传统BIOS模式GRUB配置已更新。"
fi
fi
else
echo "[警告] 未找到GRUB配置文件${GRUB_CONF},跳过GRUB配置更新。"
fi
echo "[完成] GRUB配置更新完成,af_alg_init已加入启动黑名单。"
# 步骤3: 针对模块编译形式的进一步缓解措施
case "$CONFIG_VALUE" in
m)
echo "[步骤3] 检测到CONFIG_CRYPTO_USER_API_AEAD=m(模块编译),正在禁用algif_aead内核模块..."
# 创建modprobe配置以永久禁用模块加载
if echo "install algif_aead /bin/false" | tee "$MODPROBE_CONF" > /dev/null; then
echo "[完成] 已创建模块禁用配置: ${MODPROBE_CONF}"
else
echo "[错误] 无法写入模块配置: ${MODPROBE_CONF}" >&2
exit 1
fi
# 尝试卸载已加载的algif_aead模块
if lsmod | grep -q "algif_aead"; then
if rmmod algif_aead 2>/dev/null; then
echo "[完成] 已成功卸载algif_aead内核模块。"
else
echo "[警告] algif_aead模块卸载失败,可能正在被使用。"
fi
else
echo "[信息] algif_aead模块当前未加载。"
fi
# 步骤4: 查找并删除磁盘上的模块文件
echo "[步骤4] 正在查找并删除磁盘上的algif_aead模块文件..."
if command -v modinfo >/dev/null 2>&1; then
MODULE_PATH=$(modinfo -n algif_aead 2>/dev/null)
if [ -f "$MODULE_PATH" ]; then
echo "[信息] 找到模块文件: $MODULE_PATH"
if rm -f "$MODULE_PATH"; then
echo "[完成] 已删除模块文件: $MODULE_PATH"
else
echo "[警告] 无法删除模块文件: $MODULE_PATH"
fi
else
echo "[信息] 未找到algif_aead模块文件,或模块文件不存在。"
fi
else
echo "[警告] modinfo命令未找到,无法定位模块文件。"
fi
echo "[结果] algif_aead模块已永久禁用并从磁盘删除,CVE-2026-31431漏洞缓解措施已生效。"
;;
y)
echo "[信息] CONFIG_CRYPTO_USER_API_AEAD=y(内置内核),无需进行模块禁用操作。"
;;
*)
echo "[警告] 未知的CONFIG_CRYPTO_USER_API_AEAD配置值: '$CONFIG_VALUE'"
;;
esac
echo ""
echo "[总结] CVE-2026-31431漏洞缓解措施已应用完成。"
echo " - 启动参数已添加: initcall_blacklist=af_alg_init"
if [ "$CONFIG_VALUE" = "m" ]; then
echo " - 内核模块已禁用: algif_aead"
echo " - 模块文件已从磁盘删除,防止后续加载"
echo " - 当前已生效,无需重启"
elif [ "$CONFIG_VALUE" = "y" ]; then
echo " - 需重启系统以生效"
else
echo " - 注意: 未知的配置值,请确认内核配置"
fi
exit 0
这个 Shell 脚本是一个专门为银河麒麟(Kylin)操作系统设计的应急响应缓解工具,用于应对高危 Linux 内核漏洞 CVE-2026-31431(代号 "Copy Fail")。
该脚本的核心逻辑是:通过修改启动参数和移除内核模块,彻底阻断漏洞利用所需的 algif_aead 组件,从而在不立即升级内核的情况下保护系统安全。
以下是对该脚本的详细解读,分为四个关键部分:
1. 环境检查与权限验证
脚本首先确保运行环境的安全性和合规性,防止因权限不足或依赖缺失导致执行失败。
-
Root 权限检查:脚本检测当前用户 ID (
id -u)。由于修改内核参数和删除系统文件需要最高权限,如果不是 root 用户,脚本会立即报错并提示使用sudo执行。 -
依赖工具检查:检查
zgrep命令是否存在。这是为了后续能读取和搜索压缩的内核配置文件/proc/config.gz。 -
配置文件检查:确认
/proc/config.gz文件存在。这是当前运行内核的源代码配置副本,用于判断系统是否真的受影响。
2. 漏洞影响判定
脚本不会盲目执行,而是先进行“诊断”:
-
读取内核配置:使用
zgrep在/proc/config.gz中查找CONFIG_CRYPTO_USER_API_AEAD配置项。 -
逻辑判断:
- 未找到配置:说明内核不支持该加密接口,系统不受影响,脚本退出。
-
找到配置:说明系统存在潜在风险,脚本提取该配置的值(是
m还是y),并进入修复流程。
3. 核心修复步骤(双重保险)
这是脚本最关键的部分,采用了“启动时禁用”+“运行时移除”的双重策略。
步骤 A:修改 GRUB 引导参数(启动时禁用)
脚本通过修改 GRUB 配置文件,在内核启动时直接阻止相关初始化代码运行。
-
区分桌面版与服务器版:
-
桌面版:检测是否存在
/usr/sbin/update-grub2,针对桌面环境优化。 -
服务器版:针对服务器环境,分别处理 UEFI (
/boot/efi/...) 和传统 BIOS (/boot/grub2/...) 的引导路径。
-
桌面版:检测是否存在
-
注入黑名单参数:
- 在
GRUB_CMDLINE_LINUX或GRUB_CMDLINE_LINUX_DEFAULT行尾追加initcall_blacklist=af_alg_init。 -
原理:这个参数告诉内核在启动时跳过
af_alg_init初始化函数,从而从根本上阻止AF_ALG接口(特别是 AEAD 部分)的加载。
- 在
-
更新引导:自动调用
update-grub2或grub2-mkconfig生成新的引导文件。
步骤 B:模块移除与禁用(运行时移除)
根据内核配置是“模块编译 (m)”还是“内置编译 (y)”,脚本采取不同措施:
-
场景 1:模块编译 (
m) —— 这是最彻底的缓解方式-
永久禁用:创建
/etc/modprobe.d/disable-algif-aead.conf文件,写入install algif_aead /bin/false。这意味着即使以后有人尝试手动加载该模块,系统也会拒绝。 -
卸载模块:如果模块当前已加载到内存,使用
rmmod强制卸载。 -
物理删除:使用
modinfo找到模块文件在磁盘上的路径,并直接rm -f删除文件。 - 效果:无需重启,漏洞利用路径即刻失效。
-
永久禁用:创建
-
场景 2:内置编译 (
y)- 如果加密功能直接编译在内核镜像中(非独立模块),脚本无法删除文件。此时主要依赖 步骤 A(GRUB 黑名单),并提示用户必须重启系统才能生效。
4. 技术背景:为什么要这样做?
这个脚本针对的是 CVE-2026-31431 漏洞,其核心风险点在于:
| 关键点 | 说明 |
|---|---|
| 漏洞组件 |
algif_aead 内核模块(处理 AEAD 加密算法) |
| 漏洞原理 | 2017年引入的性能优化导致逻辑缺陷,允许普通用户通过 AF_ALG 接口修改内存中的页缓存(Page Cache),从而实现本地提权(LPE)或容器逃逸。 |
| 缓解思路 | 既然漏洞在于 algif_aead 的处理逻辑,且大多数普通业务(如 Web 服务、数据库)并不直接使用内核的 AF_ALG 接口(通常使用 OpenSSL 等用户态库),那么禁用该模块是修复补丁发布前最安全、副作用最小的临时方案。 |
总结
kylin_mitigate-cve-2026-31431.sh 是一个高质量的自动化运维脚本。
-
优点:
- 兼容性好:同时适配了麒麟桌面版和服务器版,以及不同的引导模式。
- 安全性高:先检测后执行,避免误操作。
- 彻底性:对于模块化内核,它不仅禁用,还物理删除了文件,并提示无需重启即可生效,非常适合对可用性要求极高的生产环境。
-
建议:
- 在执行前,建议先备份
/etc/default/grub文件,以防引导配置出错。 - 脚本执行完成后,如果是内置内核(
y),务必安排时间重启服务器。 - 这只是缓解措施,长期来看,仍需等待官方发布修复后的内核版本并进行升级。
- 在执行前,建议先备份
KylinV10-Server-x86_64
# cat /etc/kylin-release
Kylin Linux Advanced Server release V10 (Lance)
# uname -a
Linux localhost.localdomain 4.19.90-52.22.v2207.ky10.x86_64 #1 SMP Tue Mar 14 12:19:10 CST 2023 x86_64 x86_64 x86_64 GNU/Linux
# nkvers
############## Kylin Linux Version #################
Release:
Kylin Linux Advanced Server release V10 (Lance)
Kernel:
4.19.90-52.22.v2207.ky10.x86_64
Build:
Kylin Linux Advanced Server
release V10 (SP3) /(Lance)-x86_64-Build23/20230324
#################################################
# bash kylin_mitigate-cve-2026-31431.sh
[开始] 检测到CONFIG_CRYPTO_USER_API_AEAD配置,系统受CVE-2026-31431漏洞影响。
[步骤1] 正在更新GRUB引导配置以禁用af_alg_init...
[信息] 当前为银河麒麟服务器操作系统。
[完成] GRUB配置文件已更新,在GRUB_CMDLINE_LINUX字段添加了af_alg_init启动黑名单。
[步骤2] 正在重新生成GRUB配置文件...
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.19.90-52.22.v2207.ky10.x86_64
Found initrd image: /boot/initramfs-4.19.90-52.22.v2207.ky10.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-b446cd1cb00f40b1977516b5754bb9d2
Found initrd image: /boot/initramfs-0-rescue-b446cd1cb00f40b1977516b5754bb9d2.img
done
[完成] 传统BIOS模式GRUB配置已更新。
[完成] GRUB配置更新完成,af_alg_init已加入启动黑名单。
[步骤3] 检测到CONFIG_CRYPTO_USER_API_AEAD=m(模块编译),正在禁用algif_aead内核模块...
[完成] 已创建模块禁用配置: /etc/modprobe.d/disable-algif-aead.conf
[信息] algif_aead模块当前未加载。
[步骤4] 正在查找并删除磁盘上的algif_aead模块文件...
[信息] 找到模块文件: /lib/modules/4.19.90-52.22.v2207.ky10.x86_64/kernel/crypto/algif_aead.ko.xz
[完成] 已删除模块文件: /lib/modules/4.19.90-52.22.v2207.ky10.x86_64/kernel/crypto/algif_aead.ko.xz
[结果] algif_aead模块已永久禁用并从磁盘删除,CVE-2026-31431漏洞缓解措施已生效。
[总结] CVE-2026-31431漏洞缓解措施已应用完成。
- 启动参数已添加: initcall_blacklist=af_alg_init
- 内核模块已禁用: algif_aead
- 模块文件已从磁盘删除,防止后续加载
- 当前已生效,无需重启
openEuler-22.03-x86-64-LTS
# cat /etc/openEuler-release
openEuler release 22.03 LTS
# uname -a
Linux localhost.localdomain 5.10.0-60.18.0.50.oe2203.x86_64 #1 SMP Wed Mar 30 03:12:24 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
# bash kylin_mitigate-cve-2026-31431.sh
[开始] 检测到CONFIG_CRYPTO_USER_API_AEAD配置,系统受CVE-2026-31431漏洞影响。
[步骤1] 正在更新GRUB引导配置以禁用af_alg_init...
[信息] 当前为openEuler服务器操作系统。
[完成] GRUB配置文件已更新,在GRUB_CMDLINE_LINUX字段添加了af_alg_init启动黑名单。
[步骤2] 正在重新生成GRUB配置文件...
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.10.0-60.18.0.50.oe2203.x86_64
Found initrd image: /boot/initramfs-5.10.0-60.18.0.50.oe2203.x86_64.img
Adding boot menu entry for UEFI Firmware Settings ...
done
[完成] 传统BIOS模式GRUB配置已更新。
[完成] GRUB配置更新完成,af_alg_init已加入启动黑名单。
[信息] CONFIG_CRYPTO_USER_API_AEAD=y(内置内核),无需进行模块禁用操作。
[总结] CVE-2026-31431漏洞缓解措施已应用完成。
- 启动参数已添加: initcall_blacklist=af_alg_init
- 需重启系统以生效

image.png