【安全】Linux应急响应缓解工具 for CVE-2026-31431

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_LINUXGRUB_CMDLINE_LINUX_DEFAULT 行尾追加 initcall_blacklist=af_alg_init
    • 原理:这个参数告诉内核在启动时跳过 af_alg_init 初始化函数,从而从根本上阻止 AF_ALG 接口(特别是 AEAD 部分)的加载。
  • 更新引导:自动调用 update-grub2grub2-mkconfig 生成新的引导文件。

步骤 B:模块移除与禁用(运行时移除)

根据内核配置是“模块编译 (m)”还是“内置编译 (y)”,脚本采取不同措施:

  • 场景 1:模块编译 (m) —— 这是最彻底的缓解方式

    1. 永久禁用:创建 /etc/modprobe.d/disable-algif-aead.conf 文件,写入 install algif_aead /bin/false。这意味着即使以后有人尝试手动加载该模块,系统也会拒绝。
    2. 卸载模块:如果模块当前已加载到内存,使用 rmmod 强制卸载。
    3. 物理删除:使用 modinfo 找到模块文件在磁盘上的路径,并直接 rm -f 删除文件。
    4. 效果无需重启,漏洞利用路径即刻失效。
  • 场景 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容