PowerJob 未授权访问漏洞
近期PowerJob爆发因未授权访问导致远程代码执行漏洞,本人曾在年初对此项目进行过源代码审计并输出两篇报告,因此决定借此机会发布文章水一下博客。
项目介绍
PowerJob是一个开源分布式计算和作业调度框架,它允许开发人员轻松地在自己的应用程序中调度任务。
项目地址
https://github.com/PowerJob/PowerJob
https://gitee.com/KFCFans/PowerJob
https://www.yuque.com/powerjob/guidence
漏洞概述
PowerJob存在未授权访问漏洞,该漏洞源于powerjob-server\powerjob-server-starter\src\main\java\tech\powerjob\server\web\controller路径下的全部Controller层的Restful接口均未添加访问控制,导致攻击者无需身份认证即可获取系统敏感信息。
影响版本
PowerJob <= 4.2.0
环境搭建
本次漏洞环境搭建有两种方式可选:
①:参考官方的docker-compose快速部署方案:
https://www.yuque.com/powerjob/guidence/docker-compose
②:在windows的idea中进行项目配置和打包将jar包部署到linux环境下运行,具体如下:
1、下载源码,解压后导入IDEA,使用maven进行依赖编译。
最新稳定版(4.2.0)源码下载地址:
https://github.com/PowerJob/PowerJob/tags
2、在POM文件中加入官方处理器(powerjob-official-processors)依赖
文件路径:PowerJob-4.2.0\powerjob-worker-samples\pom.xml
3、初始化数据库。
sql文件路径:
PowerJob-4.2.0\others\powerjob-mysql.sql
数据源配置文件路径:
PowerJob-4.2.0\powerjob-server\powerjob-server-starter\src\main\resources\application-daily.properties
4、启动PowerJobServerApplication
访问PowerJob控制台,初始化应用。
访问Web页面:http://localhost:7700/
点击应用注册按钮,填写应用名称(appName)和密码。
例如:apptest/123456
5、初始化 PowerJob-worker。
在配置文件中配置powerjob.worker.app-name信息,该字段与注册时填写的appname一致。
配置文件路径:
PowerJob-4.2.0\powerjob-worker-samples\src\main\resources\application.properties
配置完成后重启SampleApplication服务。
访问控制台,输入刚才注册的账号密码进行登录,登录成功后即可在首页看到机器信息。
6、将当前windows环境迁移至linux。
6.1:将当前windows中mysql的数据库文件迁移至linux。
转存储windows mysql的数据库文件,导出结构和数据,迁移至linux的mysql中。
6.2:修改springboot配置文件中的ip地址。
PowerJobServerApplication
SampleApplication
6.3:依次将两个jar包复制到linux目录下并运行
先运行powerjob-server-starter-4.2.0.jar,再运行powerjob-worker-samples-4.2.0.jar。
运行命令:Java -jar xxx.jar
漏洞复现
未登录状态下,无需任何身份认证,直接访问如下接口即可获取系统敏感信息。
①:/system/listWorker
②:/job/list
URL:http://172.25.4.233:7700/job/list
③:/system/overview
URL:http://172.25.4.233:7700/system/overview?appId=1
④:/instance/list
URL:172.25.4.233:7700/instance/list
⑤:/user/list
URL:172.25.4.233:7700/user/list
备注:需要测试数据
漏洞分析
未授权漏洞的成因是因为没有处理好权限控制功能,在本项目中未添加任何的权限访问控制。
Web服务相关代码位置如下:
WebConfig配置了registry.addMapping(“/**”),但未添加拦截配置。
powerjob-server\powerjob-server-starter\src\main\java\tech\powerjob\server\web\controller路径下的全部Controller层的Restful接口均未添加访问控制。
修复建议
项目方表示一直将PowerJob按纯内网系统去设计,因此在安全上一直没有过多的处理。由于近期漏洞的影响,项目方也发现还是存在不少外网部署使用的用户,因此在后续版本会全面引入用户身份和权限体系来解决这个问题。
临时缓解措施:目前暂无修复方案,请不要将项目部署在外网。