2024年9月,Spring官方发布公告披露 CVE-2024-38816 Spring Framework 特定条件下目录遍历漏洞,2024年8月14日,披露CVE-2024-38809 Spring Framework ETags 解析拒绝服务漏洞。本文为您介绍这些漏洞的影响范围及相应的修复方案。
漏洞影响
受漏洞影响的EMR产品版本:
EMR 5.x 系列
EMR 3.x 系列
漏洞的详细信息:
CVE-2024-38816:当同时满足使用
RouterFunctions和FileSystemResource来处理和提供静态文件时,攻击者可构造恶意请求遍历读取系统上的文件。CVE-2024-38809:攻击者通过构造
If-Match或者If-None-Match头部可能导致 Spring在解析 ETag 时产生拒绝服务。
修复流程
漏洞检查
登录 EMR 集群 master-1 节点,执行以下命令确认是否受影响:
ls /opt/apps/KNOX/knox-1.5.0-1.11.0/dep/spring-core-*.jar如果您查找到以下数据
spring-core-5.3.33,说明需要进行后续修复。如果未查找到,则无需进行修复。
准备修复包
将以下 Spring Framework 5.3.39 官方发布版 JAR 包下载至本地机器(如笔记本)指定目录(例如
~/knox-spring-fix/):spring-aop-5.3.39.jar,spring-beans-5.3.39.jar,spring-context-5.3.39.jar,spring-core-5.3.39.jar,spring-expression-5.3.39.jar,spring-jcl-5.3.39.jar,spring-tx-5.3.39.jar,spring-web-5.3.39.jar,spring-jdbc-5.3.39.jar,spring-orm-5.3.39.jar。在本地目录执行以下命令,上传至 master-1 节点:
scp spring-*.jar root@你的master节点的ip:/opt/apps/KNOX/上传完成后,登录 master-1 执行
ls -l /opt/apps/KNOX/spring-*.jar确认文件存在且大小非零。
执行修复脚本
将以下脚本保存为
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"重启 Knox 服务。

回滚脚本
仅当升级后出现异常时使用。
将以下脚本保存为
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 (如需再次回滚请勿删除此目录)"重启 Knox 服务。
