
Forgejo 16.0.5 - उच्च - रिमोट - फ़ाइल पठन - restore-repo attachments में dump-side file:// का अनुसरण करता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · forgejo-restore-file-open
राइट-अप: https://abraxaslabs.tech/research/forgejo-restore-file-open
वर्ग: फ़ाइल पढ़ना पहुँच: स्थानीय
Forgejo 16.0.5 (8d24b7d) - Forgejo
किसी अविश्वसनीय डंप के forgejo restore-repo में रिलीज़ एसेट URL को कच्चे filepath.Join(baseDir, download_url) के साथ फिर से लिखा जाता है और file:// उपसर्ग जोड़ा जाता है। uri.Open अभी भी उस पथ को os.Open करता है। खाली --units रिलीज़ को रिस्टोर करता है। Gitea 1.27.0 ने localFileURL जोड़ा और एंट्रियों को एस्केप करना छोड़ दिया। वह हेल्पर यहाँ नहीं है।
किसी अविश्वसनीय डंप का ऑपरेटर रिस्टोर उस होस्ट फ़ाइल की प्रतिलिपि बनाता है जिसे forgejo uid खोल सकता है, और उसे रिलीज़ अटैचमेंट में डाल देता है।
| ID | अभी तक कोई 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 uid खोल सकता है | 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, DB पासवर्ड | forgejo uid कॉन्फ़िग ट्री पढ़ सकता है | रेकॉन | अनुमानित। लैब विटनेस डंप के बगल में लगाई गई एक फ़ाइल थी, लाइव सीक्रेट नहीं |
यहाँ बंद: लाइव POST /repos/migrate file:// LFI (DownloadFunc सेट; PR PatchURL क्लोन HTTP बेस के विरुद्ध उपसर्ग-जाँचित)। निरपेक्ष DownloadURL डंप-रूट जॉइन एस्केप (Go filepath.Join("/dump", "/etc/passwd") /dump/etc/passwd ही रहता है)। अन-ऑथ HTTP रिस्टोर (केवल CLI / आंतरिक टोकन)। बैकअप dump में app.ini पैक होना (डिज़ाइन से सीक्रेट, आर्काइव मोड 0600)। OS LPE नहीं। रिमोट LFI नहीं।
मेरे पास रिस्टोर के दो विचार थे। मैंने पहले Gitea के निरपेक्ष-जॉइन को अपने दिमाग में लैब किया। Go filepath.Join निरपेक्ष दूसरे आर्ग्युमेंट को उस तरह नहीं गिराता जैसे Python os.path.join करता है। काम करने वाला इनपुट सापेक्ष .. है। Gitea का localFileURL इस ट्री में नहीं है।
गलत मोड़ पहले ही दर्ज हो चुके हैं: एक पूर्ण DownloadURL के माध्यम से dump-root join escape; लाइव migrate file:// LFI; X-Forgejo-Internal-Auth (restore CLI है forgejo uid के रूप में, /api/internal के रूप में नहीं); restore HTTP को रिमोट unauth मानना; एक reverse shell। नाटक।
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
EvalSymlinks के बाद baseDir के अंतर्गत जुड़े हुए पथों को सीमित करें (Gitea PR 38215 localFileURL)। .. को अस्वीकार करें। डंप-साइड सिमलिंक्स को डंप से बाहर न फॉलो करें। डंप-रूटेड हेल्पर को छोड़कर uri.Open से file:// हटा दें।
restore.go · uri.goGNU Affero GPL v3.0। देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।