
حذف ملفات تعسفي في Gogs عبر عبور المسار في Wiki
الخطورة: عالية (CVSS 7.5)
البرمجيات المتأثرة: Gogs <= 0.13.3
تم التصحيح في: 0.13.4, 0.14.0+dev
النشرة الأمنية: GHSA-jp7c-wj6q-3qf2
التصحيح: gogs/gogs#8099
أثناء تدقيق أمني لـ Gogs (خدمة Git شهيرة ذاتية الاستضافة مكتوبة بلغة Go)، اكتشفت ثغرة اجتياز مسار في دالة updateWikiPage. وهي تسمح لمستخدم مصادق يمتلك صلاحية الكتابة إلى الويكي بـ حذف ملفات تعسفية على الخادم عبر حقن تسلسلات اجتياز المسار في معامل old_title في نموذج تحرير الويكي.
تكمن الثغرة في خلل تعقيم غير متماثل في internal/database/wiki.go. عند تحديث صفحة الويكي، تتعامل الدالة مع معاملي العنوان بشكل مختلف:
| المعامل | هل تم تعقيمه؟ | يُستخدم في |
|---|---|---|
title (الاسم الجديد) | نعم — عبر ToWikiPageName() | path.Join() لإنشاء الملف |
oldTitle (الاسم السابق) | لا | path.Join() + os.Remove() |
// internal/database/wiki.go
// Line 105: New title IS sanitized
title = ToWikiPageName(title)
filename := path.Join(localPath, title+".md")
// Lines 113-115: Old title is NOT sanitized before os.Remove()
} else {
os.Remove(path.Join(localPath, oldTitle+".md")) // ← VULNERABLE
}
تتدفق قيمة oldTitle مباشرة من إدخال النموذج الخاضع لتحكم المستخدم عبر معالج المسار إلى os.Remove() دون أي تعقيم للمسار.
User Input (Form) Route Handler Database Function
┌─────────────────┐ ┌─────────────────────┐ ┌──────────────────────────┐
│ f.OldTitle │───────>│ EditWikiPost() │─────────>│ updateWikiPage() │
│ (unsanitized) │ │ wiki.go:246 │ │ │
└─────────────────┘ │ │ │ Line 114: │
│ No sanitization! │ │ os.Remove(path.Join( │
│ │ │ localPath, │
└─────────────────────┘ │ oldTitle+".md")) │
└──────────────────────────┘
المتطلبات المسبقة: مستخدم مصادق يمتلك صلاحية الكتابة إلى الويكي الخاص بأي مستودع.
/repo/wiki/editold_title ليتضمن تسلسلات اجتياز المسار (على سبيل المثال: ../../../../tmp/target_file)# Step 1: Authenticate and create/edit a wiki page
# Step 2: Intercept the POST request and inject traversal in old_title
curl -X POST "https://gogs.example.com/user/repo/wiki/TestPage?action=_edit" \
-H "Cookie: i_like_gogs=<session_cookie>" \
-d "old_title=../../../../../../../tmp/target_file" \
-d "title=TestPage" \
-d "content=test" \
-d "message=test"
# Result: /tmp/target_file.md is deleted from the server
يتم إلحاق الامتداد .md تلقائيًا. يمكن حذف أي ملف ينتهي بـ .md تملك عملية Gogs صلاحية الكتابة إليه.
| التأثير | الوصف |
|---|---|
| حذف تعسفي للملفات | حذف أي ملف .md يمكن لعملية Gogs الكتابة إليه |
| حرمان من الخدمة | إزالة ملفات إعدادات أو بيانات حساسة |
| فقدان البيانات | تدمير صفحات الويكي الخاصة بمستخدمين آخرين، أو التوثيق، أو ملفات المستودعات |
| تصعيد محتمل | عند ربطها بثغرات أخرى، قد تؤدي إلى اختراق أكبر |
طبّق نفس تعقيم ToWikiPageName على oldTitle المُطبَّق بالفعل على title:
func (r *Repository) updateWikiPage(doer *User, oldTitle, title, content, message string, isNew bool) (err error) {
// ... existing code ...
title = ToWikiPageName(title)
+ // Sanitize oldTitle to prevent path traversal
+ if oldTitle != "" {
+ oldTitle = ToWikiPageName(oldTitle)
+ }
filename := path.Join(localPath, title+".md")
// ...
}
اقترحت هذا الإصلاح أثناء الإفصاح ونفّذه مطوّرو Gogs في PR #8099.
| التاريخ | الحدث |
|---|---|
| 2025-12-13 | اكتشاف الثغرة أثناء التدقيق الأمني |
| 2025-12-13 | تقديم النشرة الأمنية عبر GitHub Security Advisory (GHSA-jp7c-wj6q-3qf2) |
| 2026-01-20 | متابعة مع مطوّري Gogs |
| 2026-01-20 | اعترف المطوّرون بالثغرة |
| 2026-01-22 | دمج التصحيح (#8099) |
| 2026-01-22 | تعيين CVE-2026-24135 بواسطة GitHub |
| 2026-02-06 | الإفصاح العلني |