Linux 核弹级高危漏洞 CVE-2026-31431 CopyFail 修复脚本
概述
2026 年 4 月 29 日,安全厂商 Theori 公开披露 Linux 内核高危漏洞 CVE-2026-31431,代号 Copy Fail。该漏洞为本地权限提升 + 容器逃逸双重风险,普通用户可一键获取 root 权限,云主机、容器环境面临严重威胁。
原理
https://cloud.tencent.com/developer/article/2665515
临时方案
禁用 algif_aead 内核模块,优点不重启主机
#!/bin/bash
# 安全禁用 algif_aead 模块脚本
# 支持重复执行,如果已禁用则跳过
set -e # 遇到错误退出?不,我们需要优雅处理,所以注释掉
# set -u # 可以启用未定义变量检查
MODULE_NAME="algif_aead"
MODPROBE_CONF="/etc/modprobe.d/disable-algif.conf"
CONF_LINE="install algif_aead /bin/false"
# 颜色输出函数(可选)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
print_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查模块是否已被禁用
check_disabled() {
# 方法1: 检查 modprobe 配置文件
if [ -f "$MODPROBE_CONF" ] && grep -q "^${CONF_LINE}$" "$MODPROBE_CONF" 2>/dev/null; then
return 0 # 已通过配置文件禁用
fi
# 方法2: 检查模块是否在内核中(已加载或内置)
# 注意:如果是内置模块,无法通过 rmmod 卸载,但 install 规则仍可阻止加载
if lsmod | grep -q "^${MODULE_NAME} " 2>/dev/null; then
return 1 # 模块已加载但未禁用配置
fi
# 方法3: 尝试加载模块(如果成功加载,说明未被禁用)
# 使用临时测试,避免实际加载
if modprobe --dry-run "$MODULE_NAME" 2>/dev/null; then
# 能执行 dry-run 且没有 install 规则阻止
if ! modprobe --dry-run "$MODULE_NAME" 2>&1 | grep -q "not found"; then
return 1 # 模块存在且未被禁用
fi
fi
# 默认认为未禁用,但需要更精确的判断
return 1
}
# 检查模块是否正在使用
check_in_use() {
if lsmod | grep -q "^${MODULE_NAME} " 2>/dev/null; then
# 尝试查看是否有进程在使用
if [ -d "/sys/module/${MODULE_NAME}/holders" ]; then
if [ -n "$(ls -A /sys/module/${MODULE_NAME}/holders 2>/dev/null)" ]; then
return 0 # 有其他模块依赖
fi
fi
fi
return 1 # 未使用
}
# 主执行逻辑
main() {
print_info "检查 ${MODULE_NAME} 模块状态..."
# 判断是否已禁用
if check_disabled; then
print_info "✓ ${MODULE_NAME} 模块已经处于禁用状态,无需重复操作"
# 额外验证:确保模块没有意外加载
if lsmod | grep -q "^${MODULE_NAME} " 2>/dev/null; then
print_warn "检测到模块已加载,尝试卸载..."
rmmod "$MODULE_NAME" 2>/dev/null && print_info "模块已卸载" || print_warn "无法卸载(可能内置或正在使用)"
fi
exit 0
fi
print_info "模块未被禁用,开始执行禁用操作..."
# 检查模块是否正在使用
if check_in_use; then
print_error "模块正在被其他模块使用,无法安全禁用"
print_info "可以尝试: lsmod | grep ${MODULE_NAME}"
exit 1
fi
# 1. 创建 modprobe 禁用配置
print_info "创建配置文件: ${MODPROBE_CONF}"
echo "$CONF_LINE" > "$MODPROBE_CONF"
# 验证配置文件写入成功
if [ ! -f "$MODPROBE_CONF" ] || ! grep -q "^${CONF_LINE}$" "$MODPROBE_CONF"; then
print_error "配置文件写入失败"
exit 1
fi
print_info "配置文件已创建"
# 2. 尝试卸载已加载的模块
if lsmod | grep -q "^${MODULE_NAME} " 2>/dev/null; then
print_info "检测到模块已加载,尝试卸载..."
if rmmod "$MODULE_NAME" 2>/dev/null; then
print_info "模块卸载成功"
else
print_warn "模块卸载失败(可能内置或正在使用),但 install 规则已生效"
# 检查是否是内置模块
if [ -d "/sys/module/${MODULE_NAME}" ] && [ ! -f "/sys/module/${MODULE_NAME}/initstate" ]; then
print_warn "模块可能编译进内核,无法卸载,但 install 规则会阻止动态加载"
fi
fi
else
print_info "模块当前未加载"
fi
# 3. 验证禁用是否成功
print_info "验证禁用效果..."
# 尝试实际加载(应该失败)
if modprobe "$MODULE_NAME" 2>&1 | grep -q "Operation not permitted\|/bin/false"; then
print_info "✓ 验证成功: ${MODULE_NAME} 模块已被成功禁用"
else
# 如果意外加载成功,说明禁用失败
if lsmod | grep -q "^${MODULE_NAME} " 2>/dev/null; then
print_error "✗ 禁用失败!模块意外加载成功"
exit 1
else
print_info "✓ ${MODULE_NAME} 模块已成功禁用"
fi
fi
# 4. 显示最终状态
echo ""
print_info "禁用操作完成!"
echo "配置文件位置: ${MODPROBE_CONF}"
echo "配置内容: $(cat ${MODPROBE_CONF})"
# 提示重启建议
print_warn "注意: 如果模块是内置在内核中的,重启系统后才能完全生效"
}
# 执行主函数
main使用
脚本比如放入/tmp/fix_copy_fail.sh,运行/bin/bash /tmp/fix_copy_fail.sh即可,脚本已经内部判断是已禁用。
版权申明
本文系作者 @ninja911 原创发布在NinJa911 Blog站点。未经许可,禁止转载。
暂无评论数据