
Forgejo 16.0.5 - عالي - عن بُعد - قراءة ملف - restore-repo يتبع file:// من جهة dump إلى المرفقات
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · forgejo-restore-file-open
الفئة: قراءة ملفات الوصول: محلي
Forgejo 16.0.5 (8d24b7d) - Forgejo
forgejo restore-repo لنسخة احتياطية غير موثوقة يعيد كتابة روابط أصول الإصدارات باستخدام filepath.Join(baseDir, download_url) الخام ويضيف البادئة file://. لا يزال uri.Open ينفذ os.Open على ذلك المسار. --units الفارغ يستعيد الإصدارات. أضاف Gitea 1.27.0 الدالة localFileURL وتخطى تهريب المدخلات. تلك الدالة المساعدة غير موجودة هنا.
استعادة المشغّل لنسخة احتياطية غير موثوقة تنسخ ملفاً على المضيف يمكن لمستخدم forgejo فتحه إلى مرفق إصدار.
| المعرّف | لا يوجد CVE بعد |
| الفئة | قراءة ملفات |
| الوصول | محلي (المشغّل forgejo restore-repo لنسخة احتياطية غير موثوقة) |
| CWE | CWE-22 / CWE-73 |
| CVSS | مرتفع: 7.3 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N |
| المنتج | Forgejo |
| المتأثر | حتى v16.0.5 (8d24b7d)؛ استعادة المشغّل المحلي |
| المصادقة | استعادة المشغّل المحلي لنسخة احتياطية غير موثوقة |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
سلّم المشغّل دليل نسخة احتياطية (أو امتلك بالفعل INTERNAL_TOKEN ومساراً يمكن للخادم قراءته). تشمل الوحدات releases / release_assets.
| الصلاحية | الطريقة / نقطة الوصول | الاستطلاع / السلامة / التوافر | مُثبت مختبرياً أو مُستنتج |
|---|---|---|---|
قراءة ملف على المضيف يمكن لمستخدم forgejo فتحه، عبر .. خارج النسخة الاحتياطية | release.yml download_url: ../FORGEJO-FILE-WITNESS.txt؛ الاستعادة تجري الدمج، uri.Open ينفذ os.Open، تُخزَّن البايتات كـ witness.txt | استطلاع (سرية ملفات المضيف) | مُثبت مختبرياً. جسم المرفق هو FORGEJO-RESTORE-FILE-OPEN-WITNESS. لم يُقدَّم الطُعم داخل النسخة الاحتياطية INSIDE-DUMP-NOT-HOST |
| النتيجة نفسها مع رابط رمزي مزروع داخل النسخة الاحتياطية | يبقى المسار المدمج تحت baseDir؛ os.Open يتبع الرابط | استطلاع | مُستنتج من uri.Open file -> os.Open. استخدم المختبر ..، وليس رابطاً رمزياً |
| نقطة الوصول نفسها على رقع PR | يُعاد كتابة pull_request.yml PatchURL بالطريقة نفسها، ثم uri.Open إلى repo/pulls/<n>.patch | استطلاع | مُستنتج من restore.go GetPullRequests. استعاد المختبر الإصدارات فقط |
| قارئو المستودع المُستعاد يحمّلون ملف المضيف | GET /<owner>/<repo>/releases/download/<tag>/<name> | استطلاع | مُثبت مختبرياً كـ labadmin Basic على المستودع العام المُستعاد |
ملفات المضيف النموذجية: app.ini، INTERNAL_TOKEN، SECRET_KEY، كلمة مرور قاعدة البيانات | يمكن لمستخدم forgejo قراءة شجرة الإعدادات | استطلاع | مُستنتج. كان شاهد المختبر ملفاً مزروعاً بجوار النسخة الاحتياطية، وليس أسراراً حية |
مغلق هنا: LFI الحي عبر POST /repos/migrate file:// (تم تعيين DownloadFunc؛ يتم فحص بادئة PatchURL للـ PR مقابل قاعدة HTTP للاستنساخ). هروب دمج جذر النسخة الاحتياطية عبر DownloadURL المطلق (في Go يبقى filepath.Join("/dump", "/etc/passwd") كـ /dump/etc/passwd). استعادة HTTP بدون مصادقة (CLI / رمز داخلي فقط). النسخ الاحتياطي dump الذي يحزم app.ini (أسرار بحكم التصميم، وضع الأرشيف 0600). ليس تصعيد صلاحيات على مستوى نظام التشغيل. ليس LFI عن بُعد.
كانت لدي فكرتان للاستعادة. تخيلت اختبار دمج Gitea المطلق أولاً في ذهني. لا يُسقط filepath.Join في Go وسيطاً ثانياً مطلقاً كما تفعل os.path.join في Python. المدخل العامل هو .. النسبي. دالة localFileURL في Gitea ليست في هذه الشجرة.
المنعطفات الخاطئة المسجلة مسبقاً: هروب دمج جذر النسخة الاحتياطية عبر DownloadURL مطلق؛ LFI الحي عبر migrate file://؛ X-Forgejo-Internal-Auth (الاستعادة هي CLI كمستخدم forgejo، وليس /api/internal)؛ معاملة استعادة HTTP كأنها عن بُعد بدون مصادقة؛ صدفة عكسية. مسرحية.
python3 forgejo-restore-file-open-Abraxas-Labs.py
أو:
cd lab
./run.sh
الهدف فقط http://127.0.0.1:19340. الصورة codeberg.org/forgejo/forgejo:16.0.5. الشاهد FORGEJO-RESTORE-FILE-OPEN-WITNESS.
IOC asset name='witness.txt' ...
IOC download status=200 bytes=34 snippet=b'FORGEJO-RESTORE-FILE-OPEN-WITNESS\n'
SUCCESS forgejo-restore-file-open how=live ..-join file:// os.Open FORGEJO-RESTORE-FILE-OPEN-WITNESS
احصر المسارات المدمجة تحت baseDir بعد EvalSymlinks (Gitea PR 38215 localFileURL). ارفض ... لا تتبع الروابط الرمزية من جهة النسخة الاحتياطية خارجها. أزل file:// من uri.Open باستثناء دالة مساعدة ذات جذر في النسخة الاحتياطية.
restore.go · uri.goGNU Affero GPL v3.0. انظر LICENSE. مختبر loopback فقط. لا ضمان.