IPBUF安全漏洞报告
English
CVE-2025-15117 CVSS 3.1 低危

CVE-2025-15117 Dromara Sa-Token 反序列化漏洞

披露日期: 2025-12-28

漏洞信息

漏洞编号
CVE-2025-15117
漏洞类型
反序列化漏洞
CVSS评分
3.1 低危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Dromara Sa-Token

相关标签

CVE-2025-15117反序列化漏洞Sa-TokenJavaDromaraObjectInputStream远程代码执行权限认证框架

漏洞概述

CVE-2025-15117是Dromara Sa-Token框架中的一个反序列化安全漏洞。该漏洞存在于SaJdkSerializer.java文件的ObjectInputStream.readObject方法中,攻击者可以通过构造恶意序列化数据进行反序列化攻击,从而可能导致敏感数据泄露或远程代码执行。Sa-Token是一个轻量级Java权限认证框架,主要用于解决登录认证、权限认证、Session会话管理等功能。由于该漏洞的利用复杂度较高,且需要低权限认证才能发起攻击,因此CVSS评分仅为3.1,属于低危漏洞。攻击者需要具备一定的技术能力才能成功利用此漏洞,但一旦成功,可能对应用程序的机密性、完整性和可用性造成影响。厂商在收到漏洞报告后未做出任何回应,导致漏洞在较长时间内未得到修复。建议使用Sa-Token的用户及时关注官方更新,采取相应的防护措施。

技术细节

该漏洞位于Dromara Sa-Token框架的SaJdkSerializer.java文件中,具体问题出在ObjectInputStream.readObject方法的使用上。在Java反序列化过程中,如果直接使用ObjectInputStream.readObject()读取不可信数据,攻击者可以构造恶意序列化对象,当应用程序对其进行反序列化时,会触发反序列化漏洞。在Sa-Token框架中,该序列化器用于处理Session数据的序列化和反序列化操作。攻击者可以通过以下方式利用此漏洞:1) 构造包含恶意payload的序列化数据;2) 将payload发送到使用SaJdkSerializer的应用程序;3) 应用程序在反序列化过程中执行攻击者植入的恶意代码。由于Sa-Token通常用于处理用户认证和会话管理,反序列化漏洞可能导致用户会话劫持、权限绕过或远程代码执行。漏洞的利用需要满足以下条件:攻击者需要能够向应用程序提交序列化数据,且应用程序使用存在漏洞的SaJdkSerializer进行反序列化操作。

攻击链分析

STEP 1
步骤1
情报收集:攻击者识别目标应用程序使用Dromara Sa-Token框架(版本<=1.44.0),并确定存在使用SaJdkSerializer进行数据序列化的功能点
STEP 2
步骤2
漏洞利用准备:攻击者使用ysoserial等工具生成针对Java反序列化漏洞的恶意payload,选择合适的gadget链(如CommonsCollections、ROME等)
STEP 3
步骤3
构造攻击数据:将生成的恶意序列化数据编码为Base64或其他格式,以便通过HTTP请求或其他协议传输到目标服务器
STEP 4
步骤4
发起攻击:向存在漏洞的端点发送包含恶意序列化数据的请求,触发ObjectInputStream.readObject()方法进行反序列化操作
STEP 5
步骤5
代码执行:恶意payload在反序列化过程中被触发,导致RCE(远程代码执行)、数据泄露或会话劫持等安全问题
STEP 6
步骤6
持久化控制:攻击者可在受害者服务器上建立后门,维持长期访问权限

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import java.io.*; import java.util.Base64; /** * CVE-2025-15117 PoC - Dromara Sa-Token Deserialization Vulnerability * This PoC demonstrates the deserialization vulnerability in SaJdkSerializer.java * Target: Dromara Sa-Token <= 1.44.0 * * Note: This is for educational and testing purposes only */ public class Exploit { public static void main(String[] args) { try { // Generate malicious serialized object usingysoserial or similar tool // Example: java -jar ysoserial.jar CommonsCollections6 "calc" > payload.ser String maliciousPayload = "BASE64_ENCODED_SERIALIZED_PAYLOAD"; // Simulate sending malicious data to vulnerable endpoint byte[] serializedData = Base64.getDecoder().decode(maliciousPayload); // Vulnerable code path - direct deserialization of untrusted data ByteArrayInputStream bis = new ByteArrayInputStream(serializedData); ObjectInputStream ois = new ObjectInputStream(bis); Object obj = ois.readObject(); // This triggers the vulnerability System.out.println("Deserialized object: " + obj); ois.close(); } catch (Exception e) { System.out.println("Error occurred: " + e.getMessage()); e.printStackTrace(); } } } // Safe alternative - should use filtered ObjectInputStream class SafeSerializer { public static Object safeDeserialize(byte[] data) throws Exception { ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data)) { @Override protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { // Whitelist approach - only allow safe classes String className = desc.getName(); if (!isAllowedClass(className)) { throw new InvalidClassException("Unauthorized deserialization attempt: " + className); } return super.resolveClass(desc); } private boolean isAllowedClass(String className) { // Define whitelist of allowed classes return className.startsWith("com.dromara.satoken") || className.startsWith("java.lang") || className.startsWith("java.util"); } }; return ois.readObject(); } }

影响范围

Dromara Sa-Token <= 1.44.0

防御指南

临时缓解措施
在官方修复版本发布之前,建议采取以下临时缓解措施:1) 限制反序列化功能的网络访问权限,确保只有授权用户可以访问;2) 在应用程序入口添加反序列化数据的签名验证机制;3) 使用RASP(运行时应用自保护)技术监控和阻断恶意反序列化行为;4) 禁用不必要的序列化功能或使用JSON、XML等更安全的替代方案;5) 加强应用日志监控,及时发现异常的反序列化请求行为。

参考链接

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