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

Flink-Streaming-Platform-Web 安全审计报告

项目概述

Flink-Streaming-Platform-Web 是一个将 Flink 封装的可视化、轻量级 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 平台配置类

环境搭建

  1. 使用 Linux 系统(Flink 对 Linux 支持更好)
  2. 创建数据库 flink_web
  3. 执行 docs 目录下的 flink_web.sql 文件初始化数据库

安全漏洞分析

1. 权限绕过漏洞

漏洞位置LoginInterceptor

漏洞原理

  • 拦截器首先判断请求路径是否为 /,如果是则重定向到登录页面
  • 然后从 session 中取出对应值
  • 判断是否为 AJAX 请求(检查请求头中是否包含 X-Requested-With 且值为 XMLHttpRequest
  • 如果是 AJAX 请求则进行权限校验,否则跳过权限校验

利用方式
构造非 AJAX 请求(不包含 X-Requested-With: XMLHttpRequest 头)可以绕过权限校验

PoC

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

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

2. 远程命令执行漏洞

漏洞位置CommandRpcClinetAdapterImpl#submitJob()

漏洞原理

  1. 系统通过 Java 原生的 Runtime 调用 Flink
  2. JobBaseServiceAOImplsubmitJobForStandalonesubmitJobForYarn 方法中调用了 submitJob
  3. JobStandaloneServerAOImpl#start() 中调用了 aSyncExecJob
  4. 最终在 CommandRpcClinetAdapterImpl#submitJob() 中拼接并执行命令

关键点

  • 命令拼接过程中,org.example.Main 类名参数可控
  • 系统配置中的 Flink 路径、项目配置路径等信息被写入返回值
  • 需要系统已配置 Flink 相关信息才能利用此漏洞

利用前提

  • 攻击者需要有权限创建和启动任务
  • 系统必须已配置 Flink 相关信息

利用方式

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

命令执行流程

/javaTocms/flink-1.9.0/bin/flink run -d -c [恶意类名] /javaTocms/tmp/udf_jar/evaljAR.jar

3. SSRF 漏洞

漏洞位置downJar(jobRunParamDTO, jobConfigDTO) 方法

漏洞原理

  • 在下载远程 jar 包时未对 URL 进行有效校验
  • 可能导致服务器向任意地址发起请求

危害

  • 探测内网服务
  • 攻击内网脆弱服务

修复建议

  1. 权限绕过修复

    • 修改 LoginInterceptor,无论是否为 AJAX 请求都应进行权限校验
    • 添加基于角色的访问控制(RBAC)
  2. 命令执行修复

    • 对用户输入的类名进行严格校验(白名单机制)
    • 避免直接拼接命令,使用参数化方式调用 Flink
    • 限制 jar 包上传来源和内容
  3. SSRF 修复

    • 限制 jar 包下载 URL 的协议和域名
    • 实现 URL 白名单机制
  4. 其他安全措施

    • 实现完善的日志审计
    • 添加输入验证和输出编码
    • 定期进行安全审计和渗透测试

总结

Flink-Streaming-Platform-Web 存在多个高危安全漏洞,攻击者可利用权限绕过漏洞获取系统控制权,进而通过命令执行漏洞在服务器上执行任意命令。建议开发者立即修复这些漏洞,并在生产环境中实施严格的安全配置。

Flink-Streaming-Platform-Web 安全审计报告 项目概述 Flink-Streaming-Platform-Web 是一个将 Flink 封装的可视化、轻量级 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 平台配置类 环境搭建 使用 Linux 系统(Flink 对 Linux 支持更好) 创建数据库 flink_web 执行 docs 目录下的 flink_web.sql 文件初始化数据库 安全漏洞分析 1. 权限绕过漏洞 漏洞位置 : LoginInterceptor 类 漏洞原理 : 拦截器首先判断请求路径是否为 / ,如果是则重定向到登录页面 然后从 session 中取出对应值 判断是否为 AJAX 请求(检查请求头中是否包含 X-Requested-With 且值为 XMLHttpRequest ) 如果是 AJAX 请求则进行权限校验,否则跳过权限校验 利用方式 : 构造非 AJAX 请求(不包含 X-Requested-With: XMLHttpRequest 头)可以绕过权限校验 PoC : 2. 远程命令执行漏洞 漏洞位置 : CommandRpcClinetAdapterImpl#submitJob() 漏洞原理 : 系统通过 Java 原生的 Runtime 调用 Flink 在 JobBaseServiceAOImpl 的 submitJobForStandalone 和 submitJobForYarn 方法中调用了 submitJob 在 JobStandaloneServerAOImpl#start() 中调用了 aSyncExecJob 最终在 CommandRpcClinetAdapterImpl#submitJob() 中拼接并执行命令 关键点 : 命令拼接过程中, org.example.Main 类名参数可控 系统配置中的 Flink 路径、项目配置路径等信息被写入返回值 需要系统已配置 Flink 相关信息才能利用此漏洞 利用前提 : 攻击者需要有权限创建和启动任务 系统必须已配置 Flink 相关信息 利用方式 : 通过权限绕过漏洞创建管理员账户 上传恶意 jar 包(通过第三方 jar 包管理功能) 创建任务时指定恶意类名(如命令注入 payload) 启动任务触发命令执行 命令执行流程 : 3. SSRF 漏洞 漏洞位置 : downJar(jobRunParamDTO, jobConfigDTO) 方法 漏洞原理 : 在下载远程 jar 包时未对 URL 进行有效校验 可能导致服务器向任意地址发起请求 危害 : 探测内网服务 攻击内网脆弱服务 修复建议 权限绕过修复 : 修改 LoginInterceptor ,无论是否为 AJAX 请求都应进行权限校验 添加基于角色的访问控制(RBAC) 命令执行修复 : 对用户输入的类名进行严格校验(白名单机制) 避免直接拼接命令,使用参数化方式调用 Flink 限制 jar 包上传来源和内容 SSRF 修复 : 限制 jar 包下载 URL 的协议和域名 实现 URL 白名单机制 其他安全措施 : 实现完善的日志审计 添加输入验证和输出编码 定期进行安全审计和渗透测试 总结 Flink-Streaming-Platform-Web 存在多个高危安全漏洞,攻击者可利用权限绕过漏洞获取系统控制权,进而通过命令执行漏洞在服务器上执行任意命令。建议开发者立即修复这些漏洞,并在生产环境中实施严格的安全配置。