Spring Cloud Data Flow 热点漏洞详细分析
字数 1665 2025-08-24 07:48:34
Spring Cloud Data Flow 热点漏洞分析与防护指南
漏洞概述
Spring Cloud Data Flow (SCDF) 是一个基于微服务的工具包,用于在 Cloud Foundry 和 Kubernetes 中构建流式和批量数据处理管道。近期曝光的两个高危漏洞(AVD-2024-22263 和 AVD-2024-37084)均存在于 SCDF 的 Skipper Server 组件中,影响版本为 2.10.0 至 2.11.2。
环境搭建
测试环境准备:
- 受影响版本:2.10.0 - 2.11.2(建议使用2.11.2进行测试)
- 源码获取:
https://github.com/spring-cloud/spring-cloud-dataflow/tree/v2.11.2 - 快速部署:使用源码中
src/docker-compose目录下的Docker文件
漏洞一:任意文件写入 (AVD-2024-22263)
漏洞描述
Skipper Server 在处理上传请求时对ZIP文件中的路径校验不严格,具有API访问权限的攻击者可通过构造恶意请求将任意文件写入服务器文件系统的任意位置,可能导致服务器权限被获取。
漏洞分析
漏洞入口点: /api/package/upload (PackageController.java)
@RequestMapping(path = "/upload", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public EntityModel<PackageMetadata> upload(@RequestBody UploadRequest uploadRequest) {
return this.packageMetadataResourceAssembler.toModel(this.packageService.upload(uploadRequest));
}
关键漏洞点:
- 文件写入路径构造:
Path packageFile = Paths.get(packageDir.getPath() + File.separator +
uploadRequest.getName() + "-" + uploadRequest.getVersion() + "." + uploadRequest.getExtension());
Files.write(packageFile, uploadRequest.getPackageFileAsBytes());
- 解压操作:
ZipUtil.unpack(packageFile.toFile(), packageDir);
问题根源:
uploadRequest.getName()未进行路径规范化处理,允许目录穿越字符(如../)- 解压目标目录
packageDir未进行安全校验
漏洞复现步骤
-
准备恶意ZIP文件:
- 创建一个测试文件(如1.txt)
- 压缩为ZIP格式(1.zip)
-
将ZIP文件转换为字节数组:
def zip_to_byte_list(zip_file_path):
with open(zip_file_path, 'rb') as file:
zip_data = file.read()
return [byte for byte in zip_data]
zip_file_path = '1.zip'
zip_byte_list = zip_to_byte_list(zip_file_path)
print(zip_byte_list)
- 构造恶意请求:
{
"repoName": "local",
"name": "../../lll",
"version": "1.1.1",
"extension": "zip",
"packageFileAsBytes": [80, 75, 3, 4, 20, 0, ...]
}
- 验证:检查服务器
lll目录下是否出现解压的文件
修复方案
- 对输入路径进行规范化处理:
Path normalizedPath = Paths.get(packageDir.getPath()).normalize();
- 添加路径校验逻辑,禁止目录穿越
漏洞二:YAML反序列化 (AVD-2024-37084)
漏洞描述
Skipper Server在处理文件上传时未对路径进行验证,攻击者可通过构造恶意请求将YAML文件写入服务器任意位置。同时由于PackageMetadata使用默认构造器反序列化YAML数据,可导致任意代码执行。
漏洞分析
触发流程:
- 上传包含恶意YAML的ZIP包
- 文件被解压到目标目录
DefaultPackageReader.read()方法检测到package.yaml或package.yml- 调用
loadPackageMetadata()进行反序列化
关键漏洞点:
private PackageMetadata loadPackageMetadata(File file) {
// 使用不安全的Constructor
Yaml yaml = new Yaml(new Constructor(PackageMetadata.class, loaderOptions), representer);
String fileContents = FileUtils.readFileToString(file);
PackageMetadata pkgMetadata = (PackageMetadata) yaml.load(fileContents);
return pkgMetadata;
}
攻击方式:
- 利用SnakeYAML反序列化漏洞执行任意代码
- 结合任意文件写入漏洞,将恶意YAML放置在可被加载的位置
修复方案
- 使用安全的YAML解析器:
Yaml yaml = new Yaml(new SafeConstructor());
- 限制YAML文件加载路径
- 对YAML内容进行校验
综合防护建议
- 升级版本:升级至已修复漏洞的最新版本
- 输入验证:
- 对所有上传文件名进行规范化处理
- 禁止路径穿越字符
- 权限控制:
- 限制Skipper Server API的访问权限
- 使用最小权限原则运行服务
- 安全配置:
- 启用文件操作审计日志
- 定期检查服务器文件系统异常文件
- 纵深防御:
- 部署WAF防护
- 实施文件系统监控
参考资源
- 官方漏洞公告:
- AVD-2024-22263: https://avd.aliyun.com/detail?id=AVD-2024-22263
- AVD-2024-37084: https://avd.aliyun.com/detail?id=AVD-2024-37084
- Spring Cloud Data Flow源码:
- https://github.com/spring-cloud/spring-cloud-dataflow
- SnakeYAML安全指南:
- https://bitbucket.org/asomov/snakeyaml/wiki/Documentation