
CVE-2026-52813 (Gogs Path Traversal → Git Hooks RCE) تقرير دفاعي: تحليل السبب الجذري والتصحيح، قواعد كشف Sigma/SIEM، مؤشرات الاختراق (IOCs)، ماسح إصدارات غير تدخلي. لا يحتوي على PoC مسلّح.
بحث أمني / writeup موجّه للفريق الأزرق (الدفاعي). لا يحتوي هذا المستودع على أي PoC مسلّح. الباحثون الذين يحتاجون إلى إعادة الإنتاج يجب أن يستخدموا الـ PoC العامة المشار إليها في الاستشارة الأمنية الرسمية (advisory).
| البند | القيمة |
|---|---|
| CVE | CVE-2026-52813 |
| أسماء بديلة | GHSA-c39w-43gm-34h5 / GO-2026-5305 |
| الإصدارات المتأثرة | Gogs < 0.14.3 |
| الإصدار المُصحَّح | 0.14.3 — PR #8334 |
| CVSS 3.1 | 10.0 حرجة AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| CWE | CWE-23 اجتياز المسار النسبي → RCE |
| الشروط المسبقة | حساب مسجَّل عادي (عند تفعيل التسجيل المفتوح افتراضيًا = RCE بدون مصادقة) |
عندما ينشئ Gogs منظمة، نموذج الويب يحتوي على تحقق من الأحرف AlphaDashDot يمنع /، لكن REST API POST /api/v1/user/orgs لا يحتوي عليه. يستطيع المهاجم إرسال اسم منظمة يحتوي ../ عبر الـ API، متجاوزًا التحقق حتى os.MkdirAll(repoutil.UserPath(org.Name), 0777) (internal/database/org.go:165)، مما يكتب دليل المستودع في أي مسار في نظام الملفات. وبالدمج مع شجرة العمل المؤقتة لمحرر الويب في Gogs (local-r/<repo_id>/)، يمكن وضع hooks/update خبيث داخل checkout محلي لمستودع آخر، ليُنفَّذ تلقائيًا بواسطة git → RCE بصلاحيات مستخدم git.
| إصدار Gogs | الحالة |
|---|---|
< 0.14.3 | متأثر، قم بالترقية فورًا |
>= 0.14.3 | تم الإصلاح |
الترقية هي الوسيلة الوحيدة للإصلاح الجذري:
# Docker
docker pull gogs/gogs:0.14.3
# أو من الكود المصدري
git checkout v0.14.3 && go build
تخفيف مؤقت (عند تعذّر الترقية):
app.ini → [service] DISABLE_REGISTRATION = true)، مما يخفض الشرط المسبق من «بدون مصادقة» إلى «يتطلب حسابًا موجودًا مسبقًا»؛POST /api/v1/user/orgs و POST /api/v1/org/*/repos التي تحتوي الحقول username / name في جسم الطلب على .. أو / (انظر detection/)؛/data/gogs/data/tmp/ (selinux/apparmor).نموذج الويب (internal/form/org.go، v0.14.2):
type CreateOrg struct {
OrgName string `binding:"Required;AlphaDashDot;MaxSize(35)"` // 正则 ^[a-zA-Z0-9._-]+$
}
الـ API (internal/route/api/v1/org/org.go، v0.14.2):
// api.CreateOrgOption (go-gogs-client) 的绑定 tag:
type CreateOrgOption struct {
UserName string `json:"username" binding:"Required"` // ← 没有 AlphaDashDot!
}
→ يمكن لحقل username في POST /api/v1/user/orgs حمل أي أحرف والوصول مباشرةً إلى طبقة قاعدة البيانات.
isNameAllowed في internal/database/users.go:1532 يمنع الأسماء المحجوزة والبادئات/اللواحق فقط (مثل admin، -bot)، ولا يتحقق من مجموعة الأحرف، لذلك يمكن لـ ../ المرور.
internal/repoutil/repoutil.go (v0.14.2):
func UserPath(user string) string {
return filepath.Join(conf.Repository.Root, strings.ToLower(user)) // ← 直接拼接
}
internal/database/org.go:165:
os.MkdirAll(repoutil.UserPath(org.Name), os.ModePerm) // org.Name 含 ../ → 任意路径写入
عندما يعالج Gogs تحرير الملفات عبر Web/API، يقوم بعمل checkout للمستودع إلى /data/gogs/data/tmp/local-r/<repo_id>/. و<repo_id> يساوي تمامًا id المستودع في قاعدة البيانات. يقوم المهاجم بـ:
writer، والحصول على id == n؛username = "../../../../data/gogs/data/tmp/local-r/n/nested" → يقع الدليل الفعلي داخل شجرة عمل writer؛rce-x تحت هذه المنظمة → يقع في local-r/n/nested/rce-x.git؛writer، وإضافة nested/rce-x.git/hooks/update كـملف عادي ثم commit و push (فهو يقع داخل شجرة عمل writer)؛writer عبر الـ API → يعمل Gogs بـ git في local-r/n/ → ينفذ git hooks/update → RCE.النقطة الأساسية: الـ hook الخبيث يدخل عبر push عادي كـمحتوى عادي للمستودع، ولا يتطلب تفعيل
ENABLE_GIT_HOOKS— وهذا هو الفرق بينه وبين مسار «إساءة استخدام خطافات git التقليدية».
تحليل تفصيلي لفرق التصحيح (patch diff) في patch/ANALYSIS.md.
القواعد الكاملة في detection/:
../) والاستغلال الناجح (الهبوط على نظام الملفات)الأهم من بينها قاعدتان:
POST /api/v1/user/orgs و POST /api/v1/org/*/repos التي تحتوي الحقول username/name في جسم JSON على .. أو /./data/gogs/data/tmp/local-r/*/ (nested/، rce-*.git، hooks/update).GET /api/v1/version ما إذا كان مثيل Gogs < 0.14.3، ويدعم الفحص الجماعي وإخراج CSV، ومناسب لجرد الأصول.لا يوفر هذا المستودع أدوات استغلال مسلّحة. لإعادة الإنتاج، استخدم الـ PoC العامة المشار إليها في الاستشارة الرسمية (advisory) وفقط في بيئة معزولة تُنشئها بنفسك.
قواعد detection/ تحتاج إلى التحقق على إصدار Gogs متأثر. يوفر lab/docker-compose.yml بيئة Gogs 0.14.2 معزولة ليقوم الفريق الأزرق باختبار ما إذا كانت قواعد الكشف تنطلق أم لا. لا تُعرِّضها للإنترنت العام، للاستخدام المحلي فقط.
| التاريخ | الحدث |
|---|---|
| 2026-06-08 | حجز CVE |
| 2026-06-24 | كشف عام وإصدار Gogs 0.14.3 |
| 2026-06-24 | نشر الاستشارة الرسمية GHSA-c39w-43gm-34h5 |
يوجد على الإنترنت من وصف هذه الـ CVE بأنها "تنفيذ أوامر عن بُعد عبر حقن معاملات gitrebase في Gogs" — وهذا خطأ. لا علاقة لهذه الثغرة بـ git rebase / gitrebase، فالسبب الجذري هو اجتياز المسار في الـ API. تتوافق هذه الوثيقة مع تحليل الثغرة الفعلي.
MIT — انظر LICENSE.