Java代码审计-flink-streaming-platform-web
字数 1689 2025-08-05 08:19:58

Flink-Streaming-Platform-Web 代码审计报告

1. 项目概述

项目地址: https://github.com/zhp8341/flink-streaming-platform-web
项目功能: 一个可视化的、轻量级Flink Web客户端系统,用户可通过Web界面进行SQL配置完成流计算任务。

项目结构

  • flink-streaming-common: Flink流计算公共类
  • flink-streaming-core: Flink流计算核心模块
  • flink-streaming-valication: SQL校验模块
  • flink-streaming-web: Web平台模块(用户管理、日志管理、系统配置等)
  • flink-streaming-web-alarm: Web平台报警接口
  • flink-streaming-web-common: Web平台公共类
  • flink-streaming-web-config: Web平台配置类

2. 环境搭建

  1. 创建数据库flink_web
  2. 执行docs/flink_web.sql初始化数据库
  3. 推荐使用Linux环境(Windows下可能出现兼容性问题)

3. 漏洞审计

3.1 权限绕过漏洞

漏洞位置: LoginInterceptor

漏洞原理:

  1. 拦截器首先检查请求路径是否为"/",是则重定向到登录页面
  2. 从session中获取用户信息
  3. 判断是否为Ajax请求(X-Requested-With: XMLHttpRequest)
  4. 关键问题: 如果不是Ajax请求,则跳过权限校验

利用方式:

POST /api/addUser HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded

name=test3&fullname=test&pwd1=test321&pwd2=test321

修复建议:

  • 对所有API请求进行权限校验,不区分Ajax请求
  • 实现基于角色的访问控制(RBAC)

3.2 命令执行漏洞

漏洞位置: CommandRpcClinetAdapterImpl#submitJob()

漏洞链:

  1. JobConfigApiController#start()
  2. JobStandaloneServerAOImpl#start()
  3. JobBaseServiceAOImpl#aSyncExecJob()
  4. CommandRpcClinetAdapterImpl#submitJob()

漏洞原理:

  1. 系统通过Java Runtime调用Flink命令
  2. 命令构造过程中(buildRunCommandForCluster)使用了用户可控的类名参数
  3. 最终执行的命令格式:
    /flink-path/bin/flink run -d -c [用户可控类名] /path/to/jar.jar
    

利用前提:

  • 系统必须配置了Flink路径等系统信息
  • 攻击者需要上传恶意jar包(通过"第三方jar包管理"功能)

利用步骤:

  1. 通过权限绕过漏洞创建管理员账户
  2. 上传包含恶意代码的jar包
  3. 创建任务时指定恶意类名(如命令注入payload)
  4. 启动任务触发命令执行

修复建议:

  1. 对用户输入的类名进行严格校验(白名单方式)
  2. 使用ProcessBuilder并正确转义参数
  3. 实现沙箱环境执行外部命令

4. 其他安全问题

4.1 SSRF漏洞

位置: downJar()方法
描述: 下载远程jar包时未对URL进行校验
风险: 可导致内网探测

4.2 配置信息泄露

位置: writeSqlToFile()方法
描述: 将系统配置(如Flink路径、YARN地址等)写入文件
风险: 可能导致敏感信息泄露

5. 安全加固建议

  1. 输入验证:

    • 对所有用户输入实施严格校验
    • 对命令参数使用白名单机制
  2. 权限控制:

    • 实现完整的RBAC模型
    • 对所有API端点进行权限检查
  3. 安全配置:

    • 限制外部命令执行权限
    • 敏感配置信息加密存储
  4. 日志监控:

    • 记录所有敏感操作(如命令执行、文件下载)
    • 实现异常操作告警
  5. 依赖安全:

    • 定期更新项目依赖
    • 扫描第三方jar包安全性

6. 总结

Flink-Streaming-Platform-Web项目存在多处严重安全漏洞,特别是权限绕过和命令执行漏洞可导致系统完全沦陷。开发者在类似项目中应特别注意外部命令执行的安全处理和权限控制机制的完整性。

Flink-Streaming-Platform-Web 代码审计报告 1. 项目概述 项目地址 : https://github.com/zhp8341/flink-streaming-platform-web 项目功能 : 一个可视化的、轻量级Flink Web客户端系统,用户可通过Web界面进行SQL配置完成流计算任务。 项目结构 flink-streaming-common: Flink流计算公共类 flink-streaming-core: Flink流计算核心模块 flink-streaming-valication: SQL校验模块 flink-streaming-web: Web平台模块(用户管理、日志管理、系统配置等) flink-streaming-web-alarm: Web平台报警接口 flink-streaming-web-common: Web平台公共类 flink-streaming-web-config: Web平台配置类 2. 环境搭建 创建数据库 flink_web 执行 docs/flink_web.sql 初始化数据库 推荐使用Linux环境(Windows下可能出现兼容性问题) 3. 漏洞审计 3.1 权限绕过漏洞 漏洞位置 : LoginInterceptor 类 漏洞原理 : 拦截器首先检查请求路径是否为"/",是则重定向到登录页面 从session中获取用户信息 判断是否为Ajax请求( X-Requested-With: XMLHttpRequest ) 关键问题 : 如果不是Ajax请求,则跳过权限校验 利用方式 : 修复建议 : 对所有API请求进行权限校验,不区分Ajax请求 实现基于角色的访问控制(RBAC) 3.2 命令执行漏洞 漏洞位置 : CommandRpcClinetAdapterImpl#submitJob() 漏洞链 : JobConfigApiController#start() JobStandaloneServerAOImpl#start() JobBaseServiceAOImpl#aSyncExecJob() CommandRpcClinetAdapterImpl#submitJob() 漏洞原理 : 系统通过Java Runtime调用Flink命令 命令构造过程中( buildRunCommandForCluster )使用了用户可控的类名参数 最终执行的命令格式: 利用前提 : 系统必须配置了Flink路径等系统信息 攻击者需要上传恶意jar包(通过"第三方jar包管理"功能) 利用步骤 : 通过权限绕过漏洞创建管理员账户 上传包含恶意代码的jar包 创建任务时指定恶意类名(如命令注入payload) 启动任务触发命令执行 修复建议 : 对用户输入的类名进行严格校验(白名单方式) 使用ProcessBuilder并正确转义参数 实现沙箱环境执行外部命令 4. 其他安全问题 4.1 SSRF漏洞 位置 : downJar() 方法 描述 : 下载远程jar包时未对URL进行校验 风险 : 可导致内网探测 4.2 配置信息泄露 位置 : writeSqlToFile() 方法 描述 : 将系统配置(如Flink路径、YARN地址等)写入文件 风险 : 可能导致敏感信息泄露 5. 安全加固建议 输入验证 : 对所有用户输入实施严格校验 对命令参数使用白名单机制 权限控制 : 实现完整的RBAC模型 对所有API端点进行权限检查 安全配置 : 限制外部命令执行权限 敏感配置信息加密存储 日志监控 : 记录所有敏感操作(如命令执行、文件下载) 实现异常操作告警 依赖安全 : 定期更新项目依赖 扫描第三方jar包安全性 6. 总结 Flink-Streaming-Platform-Web项目存在多处严重安全漏洞,特别是权限绕过和命令执行漏洞可导致系统完全沦陷。开发者在类似项目中应特别注意外部命令执行的安全处理和权限控制机制的完整性。