
مختبر إثبات مفهوم لتجاوز تفويض Gitea حيث يقوم PAT عام فقط مع write:organization بإنشاء منظمة خاصة عبر POST /api/v1/orgs.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-public-only-pat-org
Gitea 1.27.3 - Gitea
من المفترض أن يكون public-only على PAT وعدًا بأن الرمز المميز لا يمكنه لمس الموارد الخاصة. POST /user/repos يحتوي على rejectPublicOnly. POST /orgs يحتوي على tokenRequiresScopes و reqToken. لا يحتوي على rejectPublicOnly. DEFAULT_ALLOW_CREATE_ORGANIZATION قيمته الافتراضية true.
PAT من نوع public-only مع write:organization ينشئ منظمة خاصة. الرمز المميز نفسه لا يمكنه إنشاء مستودع مستخدم خاص.
| ID | لا يوجد CVE بعد |
| CWE | CWE-863 |
| CVSS | متوسط: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| المنتج | Gitea |
| المتأثر | حتى v1.27.3 (146cc3e) |
| المصادقة | PAT من نوع public-only مع صلاحية كتابة على المنظمات |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
استخدام PAT public-only مسروق أو مُصدر بصلاحيات زائدة يحتوي أيضًا على write:organization. إنشاء منظمة خاصة. تلك المنظمة هي مخبأ لم يكن من المفترض أن يتمكن الرمز المميز من إنشائه. الرمز المميز نفسه لا يزال غير قادر على إنشاء مستودع مستخدم خاص، وهذا الخطأ لا يفتح مستودع git خاصًا موجودًا لشخص آخر.
سلامة البيانات، وليس استخراج git خاص. مفيد عندما أصدر الضحية "public-only" عن قصد: CI، أو بوت، أو رمز مقاول ظن أنه لا يمكنه إنشاء منظمة خاصة.
إنشاء مستودع المنظمة يتحقق فقط من رؤية المنظمة. المسار المهمل POST /org/{org}/repos يتخطى public-only بالكامل. لقد اختبرت إنشاء المنظمة. هذا كافٍ.
نفس الجولة المتبقية مثل مختبر hostmatcher 0.0.0.0/8: v1.27.3 بعد موجة GHSA، ثم المعالجات التي لا تزال تتخطى بوابة يمتلكها نظيرها بالفعل. كانت أخطاء الرؤية ونطاق الرمز المميز موضوعًا في تلك الموجة. بحثت عن rejectPublicOnly في api.go. إنشاء مستودع المستخدم يحتوي عليه. إنشاء المنظمة لا يحتوي عليه.
أنشأت PAT بنطاقات public-only,write:organization,write:repository,write:user. إنشاء منظمة خاصة أعاد 201. الرمز المميز نفسه، إنشاء مستودع مستخدم خاص، 403 this endpoint is not available for public-only tokens. هذا الـ 403 هو الضابط. لو كان كلاهما 201، لكان الوسيط قد اختفى تمامًا. لو كان كلاهما 403، لما كان هناك شيء لتقديمه.
المنعطفات الخاطئة المسجلة بالفعل: اعتبار HTTP 201 للمنظمة كافيًا (تأكد من visibility=private عند GET)؛ نجاح إنشاء مستودع مستخدم خاص (عندها يكون rejectPublicOnly قد اختفى - المختبر يتطلب 403)؛ قراءة محتويات git خاص موجود؛ reverse shell. مسرحية.
cd lab
./run.sh
الهدف فقط http://127.0.0.1:18132. يقوم Compose بضبط DEFAULT_ALLOW_CREATE_ORGANIZATION=true.
token-scopes=public-only,write:organization,write:repository,write:user
org-create status=201
org-visibility='private'
user-repo-create status=403 this endpoint is not available for public-only tokens
SUCCESS GITEA-PUBLIC-ONLY-PAT
ضع rejectPublicOnly() على POST /orgs، وعامل إنشاء مستودع المنظمة كحساس لـ public-only أيضًا. يجب أن يعيد إنشاء المنظمة بـ public-only خطأ 403 بنفس الطريقة التي يفعلها إنشاء مستودع المستخدم الخاص بالفعل.
api.go (rejectPublicOnly، POST /orgs، POST /user/repos)GNU Affero GPL v3.0. انظر LICENSE. مختبر loopback فقط. لا ضمان.