
إثبات محلي للمفهوم يخص CVE-2026-71557 يوضح ثغرة اجتياز المسار في تخزين مراجع نظام الملفات الخاص بـ go-git، ويتضمن منطق الاستغلال ومقارنة بين الإصدار القابل للاستغلال والإصدار المُصحّح.
هذا المستودع هو إثبات مفهوم (PoC) محلي وآمن لثغرة CVE-2026-71557 استنادًا إلى الاستشارة الأمنية العامة لـ go-git GHSA-qgq7-7hm3-q39j.
قبل الإصلاح، كان storage/filesystem يستخدم أسماء المراجع السائبة (loose references) دون تحقق كافٍ كمسار .git/<reference-name>. ولهذا، فإن تمرير اسم مرجع مثل refs/heads/../../config يؤدي إلى تطبيع .. ويمكنه الكتابة فوق ملف .git/config خارج مساحة تخزين المراجع المخصصة له.
يستدعي إثبات المفهوم هذا واجهة برمجة التطبيقات الفعلية لـ go-git ويستهدف فقط ملف .git/config وهميًا تم إنشاؤه داخل دليل مؤقت. لا يتصل بخوادم Git خارجية، ولا يعدّل مستودعات قائمة، ولا ينفّذ أوامر عشوائية.
هذا المشروع مخصّص للأغراض التعليمية والتحقق الأمني الأخلاقي المصرّح به فقط. لا تستخدمه ضد بيئات دون الحصول على إذن.
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:N/I:H/A:L)github.com/go-git/go-git/v5 <= 5.19.1github.com/go-git/go-git/v6 <= 6.0.0-alpha.45.19.26.0.0-alpha.5dotgit في storage/filesystemstorage/memoryفي الإصدار v5.19.1 غير المُصحح، كان DotGit.SetRef يمرّر اسم المرجع كما هو كاسم ملف إلى setRef.
fileName := r.Name().String()
return d.setRef(fileName, content, old)
جذر التخزين المدعوم بنظام الملفات هو عادةً .git. اسم المرجع refs/heads/../../config يصبح config بعد تطبيع المسار، وبذلك يتحول كتابة قيمة المرجع إلى كتابة في .git/config. إذا أعلن خادم Git خبيث عن أسماء مراجع من هذا القبيل وبقي الـ traversal قائمًا بعد تعيين الـ refspec أثناء عمليات clone/fetch، فقد تصل أسماء مراجع يتحكم فيها المهاجم إلى مسار الكود هذا.
يقوم الإصدار المُصحح بالتحقق من أسماء المراجع عند نقاط الدخول مثل SetRef وRef وRemoveRef في تخزين نظام الملفات، ويرفض الأسماء التي تخرج عن نطاق تخزين المراجع.
تم تثبيت go.mod على الإصدار الضعيف v5.19.1.
go run .
المخرجات الرئيسية المتوقعة:
[*] go-git version: v5.19.1
[*] crafted reference: refs/heads/../../config
[*] SetReference error: <nil>
[!] VULNERABLE: .git/config was overwritten through the reference name.
ينفّذ إثبات المفهوم الخطوات التالية:
.git/configrefs/heads/../../config إلى SetReferenceيقوم النص البرمجي التالي بتشغيل نفس إثبات المفهوم بالتتابع مع v5.19.1 و v5.19.2 باستخدام وحدة (module) مؤقتة، دون تغيير go.mod داخل المستودع.
./scripts/run-version-matrix.sh
النتيجة المتوقعة:
go-git v5.19.1
[!] VULNERABLE: .git/config was overwritten through the reference name.
go-git v5.19.2
[+] FIXED: the crafted reference was rejected and .git/config stayed intact.
إذا أردت فحص الملفات المؤقتة، أضِف -keep. لن يتم حذف الدليل المعروض تلقائيًا، لذا احذفه يدويًا بعد الفحص.
go run . -keep
يستدعي إثبات المفهوم هذا بشكل مباشر نقطة الدخول الضعيفة في تخزين نظام الملفات الموضحة في الاستشارة، ويتحقق من الكتابة فوق البيانات الوصفية عبر تجاوز المسار. لا ينفّذ خادم بروتوكول Git خبيثًا ولا طبقة نقل (transport) لعمليات clone/fetch.
يجب على مستخدمي v5 التحديث إلى v5.19.2 أو أحدث، وعلى مستخدمي v6 alpha التحديث إلى v6.0.0-alpha.5 أو أحدث. وإلى حين التمكن من التحديث، لا تقم بعمليات clone/fetch من خوادم Git غير موثوقة مع تخزين مدعوم بنظام الملفات. التطبيقات التي تستخدم storage/memory فقط غير متأثرة بهذه الثغرة.