CVE-2023-37754 PowerJob 未授权访问导致远程代码执行漏洞
近期PowerJob爆发因未授权访问导致远程代码执行漏洞,本人曾在年初对此项目进行过源代码审计,因此决定复现一下。同时将年初写过的审计报告整理发布。
项目介绍
PowerJob是一个开源分布式计算和作业调度框架,它允许开发人员轻松地在自己的应用程序中调度任务。
项目地址
https://github.com/PowerJob/PowerJob
https://gitee.com/KFCFans/PowerJob
受影响的组件
https://mvnrepository.com/artifact/tech.powerjob/powerjob-official-processors
漏洞概述
PowerJob 是一款开源的分布式任务调度框架。
由于 PowerJob 未对网关进行鉴权,4.3.3 及之前版本中,未经授权的攻击者可向 /instance/detail 端点发送恶意构造的 instanceId 参数远程执行任意代码。
影响版本
tech.powerjob:powerjob-server@[1.0.0, 4.3.3]
环境搭建
1、下载源码,解压后导入IDEA,使用maven进行依赖编译。
最新稳定版源码下载地址:
https://github.com/PowerJob/PowerJob/tags
2、初始化数据库。
数据源配置文件路径:
others\powerjob-mysql.sql
数据源配置文件路径:
powerjob-server\powerjob-server-starter\src\main\resources\application-daily.properties
3、启动PowerJobServerApplication
4、访问PowerJob控制台,初始化应用。
访问Web页面:http://localhost:7700/
点击应用注册按钮,填写应用名称(appName)和密码。
例如:test/123456 。
5、初始化 PowerJob-worker。
在配置文件中配置powerjob.worker.app-name信息,该字段与注册时填写的appname一致。
配置文件路径:
powerjob-worker-samples\src\main\resources\application.properties
配置完成后启动SampleApplication服务。
访问控制台,输入刚才注册的账号密码进行登录
登录成功后即可在首页看到机器信息。
6、将当前windows环境迁移至linux。(可选)
7.1:将当前windows中mysql的数据库文件迁移至linux。
转存储windows mysql的数据库文件,导出结构和数据,迁移至linux的mysql中。
7.2:修改配置文件中的ip地址。
7.3:依次将两个jar包复制到linux目录下并运行
先运行powerjob-server-starter.jar,再运行powerjob-worker-samples.jar。
运行命令:Java -jar xxx.jar
漏洞复现
通过对项目进行环境搭建和阅读官方文档可知,PowerJob官方对于一些通用的任务(shell脚本、SQL查询操作、命令执行等),编写了可开箱即用的maven插件。详见:https://www.yuque.com/powerjob/guidence/official_processor
开发者一直将PowerJob按纯内网系统去设计,因此在安全上一直没有过多的处理。经审计发现该项目的全部Restful api都未进行身份效验,由于项目代码是完全开源的,攻击者可轻松构造数据包执行系统命令。
1:构造恶意数据包,增加一个新任务(jobparams为命令执行参数)
2:访问获取全部任务的job/list接口,拿到新增任务的jobid
3:运行任务
至此,漏洞复现完成,全程未进行身份效验。
修复建议
项目方表示一直将PowerJob按纯内网系统去设计,因此在安全上一直没有过多的处理。由于近期漏洞的影响,项目方也发现还是存在不少外网部署使用的用户,因此在后续版本会全面引入用户身份和权限体系来解决这个问题。
临时缓解措施:目前暂无修复方案,请不要将项目部署在外网。