
Gitea قبل الإصدار 1.27.1 يسمح بتنفيذ التعليمات البرمجية عن بُعد عبر واجهة diffpatch API من خلال تثبيت Git hook.
[!WARNING] هذا المستودع مخصص حصريًا لأبحاث الأمن المصرّح بها والاختبار المخبري المُتحكَّم به. لا تشغّل إثبات المفهوم ضد أنظمة لا تملكها أو لا تملك إذنًا صريحًا بتقييمها.
CVE-2026-60004 هو ثغرة حرجة لتنفيذ تعليمات برمجية عن بُعد في واجهة diffpatch API الخاصة بـ Gitea. يمكن لمستخدم مُصادَق عليه يملك صلاحية إنشاء مستودع أو الكتابة فيه أن يرسل رقعة (patch) مُصمَّمة تؤدي إلى إنشاء خطاف Git قابل للتنفيذ داخل مستودع bare مؤقت. وعند تفعيل الخطاف، تُنفَّذ أوامر يتحكم بها المهاجم بصلاحيات حساب خدمة Gitea.
إذا كان التسجيل العام مُفعَّلًا، فقد يتمكن مهاجم غير مُصادَق عليه من إنشاء حساب والوصول إلى النقطة النهائية المُصادَق عليها المعرّضة للثغرة.
| السمة | التفاصيل |
|---|
| المعرّف | CVE-2026-60004 |
| الإشعار | GHSA-rcr6-4jqh-j84m |
| الخطورة | حرجة — CVSS 3.1: 9.8 |
| نقطة الضعف | CWE-94: التحكم غير السليم في توليد التعليمات البرمجية |
| الإصدارات المتأثرة | Gitea 1.17.0 حتى 1.27.0 |
| الإصدار المُصلَّح | Gitea 1.27.1 |
| الوصول المطلوب | صلاحية الكتابة في المستودع |
| سياق التنفيذ | حساب نظام تشغيل Gitea |
| تاريخ CISA KEV | 2026-08-25 |
| الملف | الوصف |
|---|---|
gitea_diffpatch_rce.py | إثبات مفهوم يعتمد على المكتبة القياسية فقط، يقوم بالمصادقة وإنشاء مستودع خاص وإرسال الرقعة المُصمَّمة واسترجاع مخرجات الأوامر. |
payload.patch | رقعة نموذجية تُنشئ خطافًا قابلًا للتنفيذ باسم hooks/post-index-change. |
poc.png | لقطة شاشة مُلتقطة أثناء التحقق المخبري. |
README.md | ملاحظات البحث الأصلية. |
تم التحقق من إثبات المفهوم في البيئة المعزولة التالية:
| المكوّن | الإعداد |
|---|---|
| Gitea | 1.27.0 |
| Git | 2.47.2 |
| النشر | حاوية Docker باسم gitea-lab |
| عنوان الخدمة | 192.168.184.128:3000 |
| الهوية الملاحظة | uid=1000(git) gid=1000(git) |
أنتج الاستغلال الناجح مخرجات أوامر مشابهة لما يلي:
uid=1000(git) gid=1000(git) groups=1000(git)
Linux 6.12.20-amd64 x86_64
/data/gitea/tmp/local-repo/upload.git630501597
[exit-status=0]

يستخدم السكربت مكتبة Python القياسية فقط ولا يتطلب حزمًا إضافية.
python3 gitea_diffpatch_rce.py <base_url> <username> <password> "<command>"
مثال لنسخة مخبرية محلية:
python3 gitea_diffpatch_rce.py \
http://127.0.0.1:3000 \
pocuser \
'P@ssw0rd!' \
'id; uname -a'
يحاول السكربت أولًا التسجيل عبر الويب، ثم يُصادِق باستخدام بيانات الاعتماد المُقدَّمة. وهذا يسمح للأمر نفسه بالعمل مع حساب جديد على نسخة ذات تسجيل مفتوح أو مع حساب موجود.
تتكوّن سلسلة الاستغلال من أربع مراحل:
إرسال رقعة يتحكم بها المهاجم
يقوم POST /api/v1/repos/{owner}/{repo}/diffpatch بتطبيق محتوى الرقعة
المُقدَّم باستخدام git apply --index --recount --cached --binary --ignore-whitespace --whitespace=fix -3 داخل نسخة مؤقتة.
وضع مسار الخطاف
يُنشأ المستودع المؤقت كنسخة bare مشتركة. وفي مستودع bare، يكون جذر
المستودع هو أيضًا $GIT_DIR؛ وبالتالي، يُحلّ مسار الرقعة
hooks/post-index-change داخل دليل الخطافات النشط في Git.
إنشاء الخطاف القابل للتنفيذ
تُرسَل الرقعة نفسها مرتين. يُنتج التطبيق الثاني تعارضًا من نوع add/add،
مما يؤدي إلى أن يُنشئ الاحتياط ثلاثي الاتجاهات المسار على القرص بالوضع
100755، رغم استخدام --cached. ويؤدي تحديث الفهرس اللاحق إلى استدعاء
post-index-change، مُنفِّذًا شيفرة shell المُحقونة بصلاحيات حساب خدمة
Gitea.
استرجاع المخرجات بطريقة Git الأصلية
يحدّد الخطاف المستودع الأصلي عبر
objects/info/alternates، ويخزّن مخرجات الأوامر كـ Git blob، ويُنشئ
شجرة (tree) وإيداعًا (commit)، ويُحدّث refs/heads/output-leak. ثم
يسترجع إثبات المفهوم النتيجة عبر واجهة raw-file API الخاصة بـ Gitea.
لا تتطلب هذه التقنية اتصالًا صادرًا مباشرًا من الهدف.
يمنح الاستغلال الناجح تنفيذ أوامر بصلاحيات حساب خدمة Gitea. واعتمادًا على إعدادات النشر، قد يتمكن المهاجم من الوصول إلى:
app.ini وبيانات اعتماد قاعدة البياناتSECRET_KEY وINTERNAL_TOKEN والأسرار المتعلقة بـ LFSتم التأكد من أن الحساب المخبري يملك صلاحية قراءة app.ini.
ينبغي للمدافعين التحقيق في الآثار وأنماط الطلبات التالية:
/api/v1/repos/*/*/diffpatch بتتابع سريعoutput-leakpoc <[email protected]>hooks/post-index-change في
مستودعات bare أو أدلة النسخ المؤقتة/data/gitea/tmp/local-repo/upload.git*تصف هذه المؤشرات إثبات المفهوم المُضمَّن وليست شاملة؛ فقد يستخدم استغلال مُعدَّل مسارات أو مراجع أو هويات أو قنوات مخرجات مختلفة.
/api/v1/.../diffpatch المطابقة. تحقق من القاعدة مقابل التكاملات
المشروعة قبل النشر.DISABLE_REGISTRATION=true إذا لم يكن
مطلوبًا تشغيليًا. يقلل هذا من إمكانية الوصول غير المُصادَق عليه لكنه لا
يحمي من المستخدمين الحاليين الذين يملكون صلاحية الكتابة في المستودع.بالنسبة لحاوية المختبر المستخدمة في هذا البحث، يمكن إجراء الإزالة عبر:
docker rm -f gitea-lab
تُقدَّم هذه المواد لمساعدة المدافعين على إعادة إنتاج الثغرة وفهمها واكتشافها ومعالجتها. ينبغي للمشغّلين الاختبار في بيئات معزولة فقط واتباع متطلبات التصريح والإفصاح الخاصة بمؤسساتهم.