
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
Class: IDOR Reach: Remote
Forgejo 16.0.5 (8d24b7d) - Forgejo
GET /api/v1/user/keys/{id} वर्तमान-उपयोगकर्ता समूह (reqToken, user scope) में स्थित है। हैंडलर अभी भी public_key को संख्यात्मक ID द्वारा लोड करता है, बिना किसी owner check के। यही तालिका user keys, deploy keys, और principals रखती है। इस pin पर GPG इसे सही तरीके से करता है: GetGPGKeyForUserByID(ctx, ctx.Doer().ID, id)। निजी अतिरिक्त फ़ील्ड gated हैं। public key material, title, और fingerprint gated नहीं हैं। IDs क्रमिक हैं।
एक read:user token 1, 2, 3 पर चलता है और दूसरे लोगों की SSH और deploy keys की सूची बनाता है।
| ID | अभी तक कोई CVE नहीं |
| Class | IDOR |
| Reach | Remote (authenticated read:user / session) |
| CWE | CWE-639 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| Product | Forgejo |
| Affected | v16.0.5 (8d24b7d) तक |
| Auth | authenticated (read:user token या session) |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
कोई भी खाता पंजीकृत करें या उसका उपयोग करें, एक read:user token बनाएं (या session cookie का उपयोग करें), /api/v1/user/keys/{id} पर चलें। उन्हें उन keys के titles, fingerprints, और public key material मिलते हैं जो उनके नहीं हैं। उन्हें private key नहीं मिलती। उन्हें shell नहीं मिलता। वे यह सूची बनाते हैं कि किसके पास किस चीज़ तक पहुंच है।
| Privilege | Method / sink | Recon / integrity / availability | Lab-proven या inferred |
|---|---|---|---|
| किसी अन्य उपयोगकर्ता की SSH public key का title, fingerprint, और key material पढ़ें | GET /api/v1/user/keys/{id} एक foreign owner के रूप में | Recon (public-key inventory की confidentiality) | Lab-proven। id 1 पर witness title FORGEJO-KEYS-IDOR-WITNESS; attacker list में केवल id 2 है |
| इसी तरह deploy keys की सूची बनाएं | वही handler, public_key में KeyTypeDeploy rows (OwnerID 0) | Recon | तालिका से inferred। Lab ने एक user SSH key लगाई, deploy key नहीं |
| SSH certificate principals पढ़ें | वही handler, KeyTypePrincipal rows। ListPublicKeys इस प्रकार को बाहर रखता है | Recon | तालिका से inferred |
| limited या private उपयोगकर्ताओं की keys देखें | इस lookup पर कोई visibility check नहीं | Recon | handler से inferred |
अतिरिक्त JSON (user, key_type, read_only) | appendPrivateInformation केवल तब यदि admin या owner हो | Recon | Lab-proven closed: non-owner response में user फ़ील्ड नहीं था |
इस route पर closed: private key material, एक shell, GET /users/{username}/keys (username-scoped public list), GPG GET /api/v1/user/gpg_keys/{id} (foreign id पर 404), DeletePublicKey (owner/admin 403)। Cross-repo GET /repos/{owner}/{repo}/keys/{id} 404 देता है जब RepoID मेल नहीं खाता।
v16.0.5 security patches (#14370) git-apply RCE और OpenID CSRF थे। उन्होंने इस lookup को बंद नहीं किया। gitea-user-keys-idor के समान class, स्वतंत्र रूप से यहाँ अभी भी खुला है।
मैंने 2026-09 की लहर के बाद Forgejo v16.0.5 को pin किया। Gitea 1.27.3 में अभी भी यह lookup था। Forgejo अलग हो गया है, इसलिए मैंने Gitea pack की नकल करने के बजाय GPG के साथ-साथ current-user key handler को फिर से पढ़ा। GPG foreign id पर 404 देता है। SSH नहीं देता।
पहले से दर्ज गलत रास्ते: हमलावर की अपनी list को leak मानना (यह नहीं है - list scoped है, GET-by-id नहीं); installer पर DISABLE_REGISTRATION=true को close मानना (कोई भी मौजूदा खाता पर्याप्त है); एक reverse shell। Theatre।
python3 forgejo-keys-idor-Abraxas-Labs.py
या:
cd lab
./run.sh
लक्ष्य केवल http://127.0.0.1:19310। Image codeberg.org/forgejo/forgejo:16.0.5। दो खाते। Witness 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 (या site admin) न हो। इस route पर KeyTypeDeploy / KeyTypePrincipal को अस्वीकार करें। GetGPGKeyForUserByID से मेल करें।
GetPublicKeyGNU Affero GPL v3.0। देखें LICENSE। केवल Loopback lab। कोई warranty नहीं।