CVE-2025-14003
Executive Summary
CVE-2025-14003 is a missing authorization vulnerability in the WordPress plugin Image Gallery – Photo Grid & Video Gallery by Modula. The flaw resides in the add_images_to_gallery_callback() function, which lacks a capability check. This allows authenticated attackers with Author-level access or higher to add images to arbitrary Modula galleries owned by other users. The vulnerability affects all versions up to and including 2.13.3. As of this report, no patch has been released by the vendor, and no public exploit code is available. The CVSS score is 4.3 (Medium), with a low EPSS score of 0.0%, indicating low exploitation likelihood at this time.
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 plugin is distributed via the official WordPress plugin repository. Users should monitor for updates from the vendor and consider disabling the plugin if no patch is forthcoming.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N
- Base Score: 4.3 (Medium)
- Attack Vector: Network
- Attack Complexity: Low
- Privileges Required: Low (Author-level)
- User Interaction: None
- Scope: Unchanged
- Confidentiality Impact: None
- Integrity Impact: Low (unauthorized addition of images)
- Availability Impact: None
Threat Level: Medium. While the impact is limited to unauthorized image addition, it can be used to deface galleries or inject malicious content (e.g., images with embedded scripts) if combined with other vulnerabilities.
Deep Dive & Mechanics
The vulnerability is a classic Missing Authorization (CWE-862) in the WordPress AJAX handler add_images_to_gallery_callback(). This function is registered via wp_ajax_ hooks and is intended to allow users with appropriate permissions to add images to their own galleries. However, the function does not verify that the current user owns the target gallery or has the edit_posts capability for that specific gallery.
Attack Flow:
- An authenticated attacker with Author-level privileges (or higher) logs into WordPress.
- The attacker crafts a POST request to the WordPress admin-ajax.php endpoint with the action
modula_add_images_to_gallery. - The request includes parameters such as
gallery_id(targeting another user's gallery) and an array of image IDs. - The vulnerable function processes the request without checking if the attacker owns the gallery, thus adding the images to the target gallery.
Root Cause: The add_images_to_gallery_callback() function lacks a current_user_can() check or a nonce verification tied to the gallery ownership.
Vulnerable vs. Patched Code
Vulnerable Code (<= 2.13.3):
add_action('wp_ajax_modula_add_images_to_gallery', 'add_images_to_gallery_callback');
function add_images_to_gallery_callback() {
$gallery_id = intval($_POST['gallery_id']);
$images = $_POST['images']; // array of image IDs
// Missing capability check
update_post_meta($gallery_id, 'modula-images', $images);
wp_die();
}
Patched Code (Hypothetical):
add_action('wp_ajax_modula_add_images_to_gallery', 'add_images_to_gallery_callback');
function add_images_to_gallery_callback() {
// Verify nonce
if (!wp_verify_nonce($_POST['_wpnonce'], 'modula_add_images')) {
wp_die('Security check failed.');
}
$gallery_id = intval($_POST['gallery_id']);
$images = $_POST['images'];
// Check if user can edit this specific gallery
if (!current_user_can('edit_post', $gallery_id)) {
wp_die('You do not have permission to modify this gallery.');
}
update_post_meta($gallery_id, 'modula-images', $images);
wp_die();
}
Exploitation & Lab Setup
Red Team
Prerequisites:
- WordPress instance with Modula plugin <= 2.13.3
- Authenticated user with Author-level privileges
Exploitation Steps:
- Log in as an Author-level user.
- Obtain a valid nonce (if required) by inspecting the page source or using a tool like Burp Suite.
- Send a crafted POST request to
wp-admin/admin-ajax.php:
curl -X POST http://target.com/wp-admin/admin-ajax.php \
-d "action=modula_add_images_to_gallery&gallery_id=123&images[]=456&images[]=789" \
--cookie "wordpress_logged_in_xxx=..."
Note: No public exploit code is available. The above is a conceptual example.
Blue Team
Detection:
- Monitor
admin-ajax.phprequests for themodula_add_images_to_galleryaction. - Look for unusual patterns where an Author-level user modifies galleries owned by other users.
- Check for rapid, bulk image additions to galleries.
Hunting Query (Splunk):
index=web sourcetype=access_combined
| search uri_path="/wp-admin/admin-ajax.php" AND form_data.action="modula_add_images_to_gallery"
| stats count by clientip, user, gallery_id
| where count > 10
Indicators of Compromise (IOCs)
- Network: POST requests to
/wp-admin/admin-ajax.phpwithaction=modula_add_images_to_gallery - File: No specific file IOCs; the vulnerability is logic-based.
- Log: WordPress debug log entries showing
add_images_to_gallery_callbackbeing called by unexpected users. - Database: Unauthorized image IDs in
wp_postmetaformodula-imageskey on galleries not owned by the attacker.
Detection Engineering
YARA Rule
rule CVE_2025_14003_Modula_Missing_Auth {
meta:
description = "Detects vulnerable Modula plugin code with missing capability check"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-14003"
strings:
$func = "add_images_to_gallery_callback"
$ajax = "wp_ajax_modula_add_images_to_gallery"
$vuln = "update_post_meta($gallery_id, 'modula-images', $images)"
condition:
all of them
}
Sigma Rule
title: CVE-2025-14003 Modula Unauthorized Image Addition
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects attempts to exploit missing authorization in Modula plugin
author: Valters IT
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'POST'
c-uri: '/wp-admin/admin-ajax.php'
cs-uri-query|contains: 'action=modula_add_images_to_gallery'
condition: selection
falsepositives:
- Legitimate gallery management by authorized users
level: medium
Suricata Rule
alert http any any -> any any (
msg:"CVE-2025-14003 Modula Unauthorized Image Addition";
flow:to_server;
content:"POST";
http_method;
content:"/wp-admin/admin-ajax.php";
http_uri;
content:"action=modula_add_images_to_gallery";
http_client_body;
classtype:attempted-admin;
sid:1000001;
rev:1;
)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin if no patch is available and the functionality is not critical.
- Restrict Author-level users from accessing the admin-ajax.php endpoint via Web Application Firewall (WAF) rules.
- Implement a custom capability check by adding a filter to the plugin's code (if you have developer access):
add_filter('modula_can_add_images', function($can, $gallery_id) { return current_user_can('edit_post', $gallery_id); }, 10, 2);
Long-term:
- Monitor the Modula plugin repository for a patched version.
- Consider switching to an alternative gallery plugin with proper authorization checks.
- Conduct a security audit of all WordPress plugins in use.
Valters IT
DevSecOps & Cyber Threat Intelligence
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.