概述

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即可,脚本已经内部判断是已禁用。

分类: 服务器运维 标签: Linux漏洞修复

评论

暂无评论数据

暂无评论数据

目录