
Forgejo 16.0.5 - उच्च - रिमोट - फ़ाइल पठन - restore-repo attachments में dump-side file:// का अनुसरण करता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · forgejo-restore-file-open
Class: File read Reach: Local
Forgejo 16.0.5 (8d24b7d) - Forgejo
forgejo restore-repo किसी अविश्वसनीय dump का release asset URLs को raw filepath.Join(baseDir, download_url) के साथ फिर से लिखता है और file:// प्रीफ़िक्स लगाता है। uri.Open अभी भी उस पथ को os.Open करता है। खाली --units releases को restore करता है। Gitea 1.27.0 ने localFileURL जोड़ा और entries को escaping से छोड़ दिया। वह helper यहाँ नहीं है।
किसी अविश्वसनीय dump का operator restore उस host फ़ाइल की प्रतिलिपि बनाता है जिसे forgejo uid खोल सकता है, और उसे release attachment में डाल देता है।
| ID | अभी तक कोई CVE नहीं |
| Class | File read |
| Reach | Local (किसी अविश्वसनीय dump का operator forgejo restore-repo) |
| CWE | CWE-22 / CWE-73 |
| CVSS | High: 7.3 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N |
| Product | Forgejo |
| Affected | v16.0.5 (8d24b7d) तक; local operator restore |
| Auth | किसी अविश्वसनीय dump का local operator restore |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
Operator को एक dump directory सौंपें (या पहले से INTERNAL_TOKEN और सर्वर द्वारा पढ़ने योग्य कोई पथ रखें)। Units में releases / release_assets शामिल हैं।
| Privilege | Method / sink | Recon / integrity / availability | Lab-proven या inferred |
|---|---|---|---|
Dump से .. के ज़रिए उस host फ़ाइल को पढ़ें जिसे forgejo uid खोल सकता है | release.yml download_url: ../FORGEJO-FILE-WITNESS.txt; restore join करता है, uri.Open os.Open करता है, bytes witness.txt के रूप में संग्रहीत होते हैं | Recon (host-file confidentiality) | Lab-proven। Attachment body FORGEJO-RESTORE-FILE-OPEN-WITNESS है। In-dump decoy INSIDE-DUMP-NOT-HOST serve नहीं किया गया |
| Dump के अंदर लगाए गए symlink के साथ वही परिणाम | Joined path baseDir के अंदर ही रहता है; os.Open link का अनुसरण करता है | Recon | uri.Open file -> os.Open से inferred। Lab ने .. का उपयोग किया, symlink का नहीं |
| PR patches पर वही sink | pull_request.yml PatchURL को उसी तरह फिर से लिखा जाता है, फिर uri.Open से repo/pulls/<n>.patch में | Recon | restore.go GetPullRequests से inferred। Lab ने केवल releases restore किए |
| Restored repo के readers host फ़ाइल डाउनलोड करते हैं | GET /<owner>/<repo>/releases/download/<tag>/<name> | Recon | Restored public repo पर labadmin Basic के रूप में lab-proven |
सामान्य host फ़ाइलें: app.ini, INTERNAL_TOKEN, SECRET_KEY, DB password | forgejo uid config tree पढ़ सकता है | Recon | Inferred। Lab witness dump के बगल में लगाई गई फ़ाइल थी, live secrets नहीं |
यहाँ बंद किया गया: live POST /repos/migrate file:// LFI (DownloadFunc सेट; PR PatchURL clone HTTP base के विरुद्ध prefix-checked)। Absolute DownloadURL dump-root join escape (Go filepath.Join("/dump", "/etc/passwd") /dump/etc/passwd ही रहता है)। Unauth HTTP restore (केवल CLI / internal token)। Backup dump में app.ini packing (secrets by design, archive mode 0600)। OS LPE नहीं। Remote LFI नहीं।
मेरे पास restore के दो विचार थे। मैंने पहले Gitea absolute-join को मन में lab किया। Go filepath.Join किसी absolute दूसरे argument को उस तरह नहीं गिराता जैसे Python os.path.join करता है। काम करने वाला input relative .. है। Gitea का localFileURL इस tree में नहीं है।
पहले से दर्ज गलत रास्ते: absolute DownloadURL के ज़रिए dump-root join escape; live migrate file:// LFI; X-Forgejo-Internal-Auth (restore forgejo uid के रूप में CLI है, /api/internal नहीं); restore HTTP को remote unauth मानना; एक reverse shell। नाटक।
python3 forgejo-restore-file-open-Abraxas-Labs.py
या:
cd lab
./run.sh
लक्ष्य केवल http://127.0.0.1:19340। Image codeberg.org/forgejo/forgejo:16.0.5। Witness 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 के बाद joined paths को baseDir के अंदर सीमित करें (Gitea PR 38215 localFileURL)। .. अस्वीकार करें। Dump-side symlinks का dump से बाहर अनुसरण न करें। Dump-rooted helper को छोड़कर uri.Open से file:// हटा दें।
restore.go · uri.goGNU Affero GPL v3.0। देखें LICENSE। केवल loopback lab। कोई warranty नहीं।