漏洞公告 | KNOX Spring漏洞修复

更新时间:
复制为 MD 格式

20249月,Spring官方发布公告披露 CVE-2024-38816 Spring Framework 特定条件下目录遍历漏洞,2024814日,披露CVE-2024-38809 Spring Framework ETags 解析拒绝服务漏洞。本文为您介绍这些漏洞的影响范围及相应的修复方案。

漏洞影响

受漏洞影响的EMR产品版本:

  • EMR 5.x 系列

  • EMR 3.x 系列

漏洞的详细信息:

  • CVE-2024-38816:当同时满足使用RouterFunctionsFileSystemResource来处理和提供静态文件时,攻击者可构造恶意请求遍历读取系统上的文件。

  • CVE-2024-38809:攻击者通过构造If-Match或者If-None-Match头部可能导致 Spring在解析 ETag 时产生拒绝服务。

修复流程

漏洞检查

  1. 登录 EMR 集群 master-1 节点,执行以下命令确认是否受影响:

    ls /opt/apps/KNOX/knox-1.5.0-1.11.0/dep/spring-core-*.jar
  2. 如果您查找到以下数据spring-core-5.3.33,说明需要进行后续修复。如果未查找到,则无需进行修复。

    image.png

准备修复包

  1. 将以下 Spring Framework 5.3.39 官方发布版 JAR 包下载至本地机器(如笔记本)指定目录(例如 ~/knox-spring-fix/):spring-aop-5.3.39.jarspring-beans-5.3.39.jarspring-context-5.3.39.jarspring-core-5.3.39.jarspring-expression-5.3.39.jarspring-jcl-5.3.39.jarspring-tx-5.3.39.jarspring-web-5.3.39.jarspring-jdbc-5.3.39.jarspring-orm-5.3.39.jar

  2. 在本地目录执行以下命令,上传至 master-1 节点:

    scp spring-*.jar root@你的master节点的ip:/opt/apps/KNOX/
  3. 上传完成后,登录 master-1 执行 ls -l /opt/apps/KNOX/spring-*.jar 确认文件存在且大小非零。image

执行修复脚本

  1. 将以下脚本保存为 knox-spring-upgrade.sh,上传至 master-1 并执行:

    #!/bin/bash
    
    set -e 
    
    SRC_DIR="/opt/apps/KNOX"
    TARGET_DIR="/opt/apps/KNOX/knox-1.5.0-1.11.0/dep"
    BACKUP_DIR="$TARGET_DIR/backup"
    
    EXCLUDE_FILE="spring-vault-core-2.2.2.RELEASE.jar"
    
    echo "正在创建备份目录: $BACKUP_DIR"
    mkdir -p "$BACKUP_DIR"
    
    echo "正在备份现有的 spring 相关文件(排除 $EXCLUDE_FILE)..."
    find "$TARGET_DIR" -maxdepth 1 -name "spring-*.jar" ! -name "$EXCLUDE_FILE" -exec cp {} "$BACKUP_DIR/" \;
    
    echo "正在复制新的 spring-5.3.39.jar 文件..."
    for jar in "$SRC_DIR"/spring-*-5.3.39.jar; do
        filename=$(basename "$jar")
        if [[ "$filename" != "$EXCLUDE_FILE" ]]; then
            cp "$jar" "$TARGET_DIR/"
        fi
    done
    
    echo "正在修改文件所有权为 knox:hadoop..."
    find "$TARGET_DIR" -maxdepth 1 -name "spring-*-5.3.39.jar" ! -name "$EXCLUDE_FILE" -exec chown knox:hadoop {} \;
    
    echo "正在删除旧的 spring-5.3.33.jar 文件..."
    find "$TARGET_DIR" -maxdepth 1 -name "*spring-*-5.3.33*.jar" ! -name "$EXCLUDE_FILE" -delete
    
    echo "操作完成!"
    echo "备份文件位于: $BACKUP_DIR"
    echo "新文件已部署到: $TARGET_DIR"
  2. 重启 Knox 服务。image

回滚脚本

说明

仅当升级后出现异常时使用。

  1. 将以下脚本保存为 knox-spring-rollback.sh,上传至 master-1 并执行:

    #!/bin/bash
    
    set -e
    
    TARGET_DIR="/opt/apps/KNOX/knox-1.5.0-1.11.0/dep"
    BACKUP_DIR="$TARGET_DIR/backup"
    
    EXCLUDE_FILE="spring-vault-core-2.2.2.RELEASE.jar"
    
    if [ ! -d "$BACKUP_DIR" ]; then
        echo "错误: 备份目录 $BACKUP_DIR 不存在,无法回滚!"
        exit 1
    fi
    
    echo "正在执行回滚操作..."
    
    echo "正在删除新版本的 spring-5.3.39.jar 文件..."
    find "$TARGET_DIR" -maxdepth 1 -name "spring-*-5.3.39.jar" ! -name "$EXCLUDE_FILE" -delete
    
    echo "正在恢复备份的旧文件..."
    find "$TARGET_DIR" -maxdepth 1 -name "*spring-*-5.3.33*.jar" ! -name "$EXCLUDE_FILE" -delete 2>/dev/null || true
    
    for backup_file in "$BACKUP_DIR"/*; do
        if [ -f "$backup_file" ]; then
            filename=$(basename "$backup_file")
            # 确保不是特殊文件(虽然备份时已经排除了,但双重保险)
            if [[ "$filename" != "$EXCLUDE_FILE" ]]; then
                cp "$backup_file" "$TARGET_DIR/"
                echo "已恢复: $filename"
            fi
        fi
    done
    
    echo "正在修复文件所有权为 knox:hadoop..."
    find "$TARGET_DIR" -maxdepth 1 -name "spring-*.jar" ! -name "$EXCLUDE_FILE" -exec chown knox:hadoop {} \;
    
    # echo "正在清理备份目录..."
    # rm -rf "$BACKUP_DIR"
    
    echo "回滚完成!"
    echo "备份目录: $BACKUP_DIR (如需再次回滚请勿删除此目录)"
    
  2. 重启 Knox 服务。image