
Forgejo 16.0.5 - उच्च - रिमोट - IDOR - GET /api/v1/user/keys/{id} अन्य उपयोगकर्ताओं की SSH और deploy keys लौटाता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · forgejo-keys-idor
राइट-अप: https://abraxaslabs.tech/research/forgejo-keys-idor
वर्ग: IDOR पहुँच: रिमोट
Forgejo 16.0.5 (8d24b7d) - Forgejo
GET /api/v1/user/keys/{id} वर्तमान-उपयोगकर्ता समूह (reqToken, उपयोगकर्ता स्कोप) में स्थित है। हैंडलर अभी भी public_key को संख्यात्मक ID द्वारा लोड करता है, बिना किसी स्वामी जाँच के। यही तालिका उपयोगकर्ता कुंजियाँ, डिप्लॉय कुंजियाँ, और प्रिंसिपल रखती है। इस पिन पर GPG इसे सही ढंग से करता है: GetGPGKeyForUserByID(ctx, ctx.Doer().ID, id)। निजी अतिरिक्त फ़ील्ड गेटेड हैं। सार्वजनिक कुंजी सामग्री, शीर्षक, और फ़िंगरप्रिंट नहीं हैं। ID क्रमिक हैं।
एक read:user टोकन 1, 2, 3 पर चलता है और दूसरे लोगों की SSH और डिप्लॉय कुंजियों की सूची बनाता है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | IDOR |
| पहुँच | रिमोट (प्रमाणित read:user / सत्र) |
| CWE | CWE-639 |
| CVSS | उच्च: 7.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| उत्पाद | Forgejo |
| प्रभावित | v16.0.5 (8d24b7d) तक |
| प्रमाणीकरण | प्रमाणित (read:user टोकन या सत्र) |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
कोई भी खाता पंजीकृत करें या उपयोग करें, एक read:user टोकन बनाएँ (या सत्र कुकी का उपयोग करें), /api/v1/user/keys/{id} पर चलें। उन्हें उन कुंजियों के शीर्षक, फ़िंगरप्रिंट, और सार्वजनिक कुंजी सामग्री मिलती है जो उनकी नहीं हैं। उन्हें निजी कुंजी नहीं मिलती। उन्हें शेल नहीं मिलता। वे सूची बनाते हैं कि किसके पास किस चीज़ तक पहुँच है।
| विशेषाधिकार | विधि / सिंक | रेकॉन / अखंडता / उपलब्धता | लैब-प्रमाणित या अनुमानित |
|---|---|---|---|
| किसी अन्य उपयोगकर्ता की SSH सार्वजनिक कुंजी का शीर्षक, फ़िंगरप्रिंट, और कुंजी सामग्री पढ़ें | विदेशी स्वामी के रूप में GET /api/v1/user/keys/{id} | रेकॉन (सार्वजनिक-कुंजी सूची की गोपनीयता) | लैब-प्रमाणित। id 1 पर गवाह शीर्षक FORGEJO-KEYS-IDOR-WITNESS; हमलावर की सूची में केवल id 2 है |
| उसी तरह डिप्लॉय कुंजियों की सूची बनाएँ | वही हैंडलर, public_key में KeyTypeDeploy पंक्तियाँ (OwnerID 0) | रेकॉन | तालिका से अनुमानित। लैब ने उपयोगकर्ता SSH कुंजी रखी, डिप्लॉय कुंजी नहीं |
| SSH प्रमाणपत्र प्रिंसिपल पढ़ें | वही हैंडलर, KeyTypePrincipal पंक्तियाँ। ListPublicKeys इस प्रकार को बाहर रखता है | रेकॉन | तालिका से अनुमानित |
| सीमित या निजी उपयोगकर्ताओं की कुंजियाँ देखें | इस लुकअप पर कोई दृश्यता जाँच नहीं | रेकॉन | हैंडलर से अनुमानित |
अतिरिक्त JSON (user, key_type, read_only) | appendPrivateInformation केवल तभी जब व्यवस्थापक या स्वामी हो | रेकॉन | लैब-प्रमाणित बंद: गैर-स्वामी प्रतिक्रिया में कोई user फ़ील्ड नहीं था |
इस रूट पर बंद: निजी कुंजी सामग्री, एक शेल, GET /users/{username}/keys (उपयोगकर्ता-नाम-स्कोप वाली सार्वजनिक सूची), GPG GET /api/v1/user/gpg_keys/{id} (विदेशी id पर 404), DeletePublicKey (स्वामी/व्यवस्थापक 403)। क्रॉस-रेपो GET /repos/{owner}/{repo}/keys/{id} 404 देता है जब RepoID मेल नहीं खाता।
v16.0.5 सुरक्षा पैच (#14370) git-apply RCE और OpenID CSRF थे। उन्होंने इस लुकअप को बंद नहीं किया। gitea-user-keys-idor के समान वर्ग, स्वतंत्र रूप से यहाँ अभी भी खुला है।
मैंने 2026-09 की लहर के बाद Forgejo v16.0.5 को पिन किया। Gitea 1.27.3 में अभी भी यह लुकअप था। Forgejo अलग हो गया है, इसलिए मैंने Gitea पैक की नकल करने के बजाय GPG के बगल में वर्तमान-उपयोगकर्ता कुंजी हैंडलर को फिर से पढ़ा। GPG विदेशी id पर 404 देता है। SSH नहीं देता।
गलत मोड़ जो पहले ही दर्ज हो चुके हैं: हमलावर की अपनी सूची को लीक मानना (ऐसा नहीं है - सूची स्कोप्ड है, GET-by-id नहीं); इंस्टॉलर पर DISABLE_REGISTRATION=true को समापन मानना (कोई भी मौजूदा खाता पर्याप्त है); एक रिवर्स शेल। नाटक।
python3 forgejo-keys-idor-Abraxas-Labs.py
या:
cd lab
./run.sh
लक्ष्य केवल http://127.0.0.1:19310। इमेज codeberg.org/forgejo/forgejo:16.0.5। दो खाते। साक्षी FORGEJO-KEYS-IDOR-WITNESS।
IOC planted victim-id=1 attacker-id=2
IOC attacker-list status=200 ... title=attacker-own-key
IOC get id=1 status=200 ... FORGEJO-KEYS-IDOR-WITNESS
IOC gpg-neg id=1 status=404
SUCCESS forgejo-keys-idor victim-id=1 get-http=200 list-has-id=no gpg-http=404 FORGEJO-KEYS-IDOR-WITNESS
404 जब तक key.OwnerID == ctx.Doer().ID (या साइट एडमिन) न हो। इस रूट पर KeyTypeDeploy / KeyTypePrincipal को अस्वीकार करें। GetGPGKeyForUserByID से मिलान करें।
GetPublicKeyGNU Affero GPL v3.0. देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।