
Gitea IDOR (CWE-639) के लिए प्रूफ-ऑफ-कॉन्सेप्ट और लैब, GET /api/v1/user/keys/{id} में, जो एक प्रमाणित read:user टोकन को अन्य उपयोगकर्ताओं की SSH और deploy keys की गणना करने देता है।
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-user-keys-idor
Gitea 1.27.3 - Gitea
GET /api/v1/user/keys/{id} वर्तमान-उपयोगकर्ता समूह (reqToken, rejectPublicOnly) में स्थित है। हैंडलर अभी भी संख्यात्मक ID द्वारा पंक्ति लोड करता है बिना किसी स्वामी जाँच के। वही तालिका उपयोगकर्ता कुंजियाँ, deploy keys, और principals रखती है। GPG का समकक्ष इसे सही ढंग से करता है: GetGPGKeyForUserByID(ctx, ctx.Doer.ID, id)। निजी फ़ील्ड्स पर रोक है। सार्वजनिक कुंजी सामग्री, शीर्षक, और फिंगरप्रिंट पर नहीं। ID क्रमिक हैं।
एक read:user टोकन 1, 2, 3 पर चलता है और दूसरों की SSH और deploy कुंजियों की सूची बनाता है। खुला पंजीकरण इसे नए-खाते का बग बना देता है।
| ID | अभी तक कोई CVE नहीं |
| 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 | Gitea |
| Affected | v1.27.3 (146cc3e) तक |
| Auth | प्रमाणित (read:user टोकन) |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
पंजीकरण करें (डिफ़ॉल्ट खुला पंजीकरण), एक read:user टोकन बनाएँ, /api/v1/user/keys/{id} पर चलें। उन्हें उन कुंजियों के शीर्षक, फिंगरप्रिंट, और सार्वजनिक कुंजी सामग्री मिलती है जो उनकी नहीं हैं, जिनमें deploy कुंजियाँ भी शामिल हैं। उन्हें निजी कुंजी नहीं मिलती। उन्हें शेल नहीं मिलता। वे यह सूची बनाते हैं कि किसके पास किस चीज़ तक पहुँच है।
1.27.3 कुंजी GHSA उपयोगकर्ता-नाम-स्कोप्ड सूची और individualPermsChecker था। यह वह लुकअप नहीं था।
उसी टैग का अवशेष: git HTTP redirect SSRF।
v1.27.3 ने 2026 GHSA लहर को बंद कर दिया। मैं फिर भी उस टैग पर बैठा रहा और GPG के बगल में वर्तमान-उपयोगकर्ता कुंजी हैंडलर पढ़ा। GPG किसी बाहरी id पर 404 देता है। SSH नहीं देता।
seed.sh पीड़ित कुंजी शीर्षक GHSA-GITEA-KEY-IDOR-WITNESS और एक हमलावर कुंजी लगाता है। हमलावर की अपनी सूची में witness नहीं है। हमलावर के रूप में GET /user/keys/1 में है। बाहरी id के साथ GPG 404 देता है। यही पूरा तर्क है।
पहले से दर्ज गलत रास्ते: हमलावर की अपनी सूची को लीक मानना (यह नहीं है - सूची स्कोप्ड है, GET-by-id नहीं); एक रिवर्स शेल। नाटक।
क्लाइंट बग उत्पाद बग जैसे दिखते हैं। एक हेल्पर जो http.client को शैडो करता है, कभी पैकेट नहीं भेजता। HTTPResponse पर .recv() .read() नहीं है। मैं यह एक बार बता रहा हूँ क्योंकि इसने समय लिया और एक मिनट के लिए ऐसा लगा कि 1.27.3 ने काम पूरा कर लिया है।
cd lab
./run.sh
लक्ष्य केवल http://127.0.0.1:18101।
add-key user=victim status=201 title=GHSA-GITEA-KEY-IDOR-WITNESS id=1
add-key user=attacker status=201 id=2
attacker-list status=200 ids=[2] (no witness)
get id=1 status=200 snippet contains GHSA-GITEA-KEY-IDOR-WITNESS
SUCCESS Gitea #1 user/keys IDOR
404 दें जब तक key.OwnerID == ctx.Doer.ID (या साइट एडमिन) न हो। deploy/principal प्रकार अस्वीकार करें। GPG से मेल खाएँ।
GetPublicKeyGNU Affero GPL v3.0। देखें LICENSE। केवल लूपबैक लैब। कोई वारंटी नहीं।