
CVE-2026-20896 के लिए सार्वजनिक PoC और डिटेक्टर ("Gitea Docker: One Header, Any User")
गीटिया का आधिकारिक डॉकर इमेज (1.26.2 तक और सहित) अपनी डिफ़ॉल्ट कॉन्फ़िग में REVERSE_PROXY_TRUSTED_PROXIES = * भेजता है। यदि आप रिवर्स-प्रॉक्सी लॉगिन चालू करते हैं, तो वह वाइल्डकार्ड का अर्थ है कि हर स्रोत IP को एक विश्वसनीय प्रॉक्सी माना जाता है, इसलिए जो कोई भी पोर्ट तक पहुँच सकता है वह X-WEBAUTH-USER हेडर भेज सकता है और जिसके रूप में चाहे लॉग इन हो सकता है। कोई पासवर्ड नहीं, कोई टोकन नहीं।
मैंने इसकी सूचना गीटिया को दी और यह 1.26.3 / 1.26.4 में ठीक किया गया है। यह रिपॉज़िटरी मेरा अपना लेख, एक कार्यशील PoC और एक जाँचकर्ता है। यह एक पैच किए गए, सार्वजनिक बग के लिए है।
गीटिया रिवर्स-प्रॉक्सी प्रमाणीकरण का समर्थन करता है: आप इसे एक प्रॉक्सी के पीछे रखते हैं जो X-WEBAUTH-USER सेट करता है, और गीटिया उस हेडर पर उपयोगकर्ता नाम के लिए भरोसा करता है। यह तब तक ठीक है जब तक केवल आपका प्रॉक्सी इसे सेट कर सकता है। इसको लागू करने वाली सेटिंग है REVERSE_PROXY_TRUSTED_PROXIES, एक IP अनुमति सूची। गीटिया केवल तब हेडर का सम्मान करता है जब अनुरोध का स्रोत IP उसके अंदर आता है।
दस्तावेज़ीकृत-सुरक्षित डिफ़ॉल्ट, जो app.example.ini में है, 127.0.0.0/8,::1/128 है: केवल लूपबैक, इसलिए बॉक्स से बाहर केवल स्थानीय प्रॉक्सी पर भरोसा किया जाता है। आधिकारिक डॉकर इमेज इसका उपयोग नहीं करती। इसका app.ini टेम्पलेट * हार्ड-कोड करता है (docker/root/etc/templates/app.ini:55, और रूटलेस इमेज के लिए docker/rootless/etc/templates/app.ini:52)। * हर स्रोत IP से मेल खाता है, इसलिए अनुमति सूची जाँच कुछ नहीं करती। रिवर्स-प्रॉक्सी लॉगिन चालू करें और अब जो कोई भी पोर्ट तक पहुँच सकता है वह हेडर भेज सकता है, न कि केवल आपका प्रॉक्सी। ऑटो-रजिस्ट्रेशन चालू होने पर, खाता मौके पर बन जाता है। किसी व्यवस्थापक का उपयोगकर्ता नाम भेजें और आप व्यवस्थापक हैं।
इसलिए कोड गलत नहीं है, पैकेज्ड डिफ़ॉल्ट गलत है, और यह विशेष रूप से डॉकर इमेज के लिए है। एक बाइनरी या स्व-निर्मित इंस्टॉल जो app.example.ini का अनुसरण करता है, लूपबैक डिफ़ॉल्ट रखता है और प्रभावित नहीं होता है।
डॉकर और पायथन 3 की आवश्यकता है (केवल मानक लाइब्रेरी, कुछ भी स्थापित करने की आवश्यकता नहीं)।
docker compose up -d # boots vulnerable gitea/gitea:1.26.2
# give it ~30-60s to finish first-run setup, then:
python3 poc.py # random new victim, shows auto-registration
python3 poc.py http://localhost:3000 admin # impersonate a chosen username
docker compose down -v # clean up
बंडल इमेज के खिलाफ यह कैसा दिखता है:
1) बिना हेडर के /user/settings -> HTTP 303 (लॉगिन पर रीडायरेक्ट = प्रमाणित नहीं)
2) X-WEBAUTH-USER के साथ /user/settings -> HTTP 200
'pocadmin' के रूप में लॉग इन - कोई पासवर्ड नहीं, कोई टोकन नहीं, कोई भी स्रोत IP
3) /pocadmin प्रोफ़ाइल पृष्ठ -> HTTP 200 (खाता मौके पर बनाया गया)
बाईपास वेब सत्र पर काम करता है, टोकन API /api/v1/... पर नहीं, जो हेडर को अनदेखा करता है।
detect.py एक हानिरहित जाँच भेजता है और इसकी तुलना एक सामान्य अनुरोध से करता है। यह कुछ भी स्पर्श नहीं करता।
python3 detect.py https://gitea.example.com
यह VULNERABLE, looks-safe, या inconclusive प्रिंट करता है। इसे केवल अपनी या परीक्षण करने की अनुमति वाली चीज़ के विरुद्ध चलाएँ।
1.26.3 / 1.26.4 या बाद में अपग्रेड करें। रिवर्स-प्रॉक्सी प्रमाणीकरण अब ऑप्ट-इन है और इमेज अब वाइल्डकार्ड नहीं भेजती। यदि आप अभी तक अपग्रेड नहीं कर सकते, तो REVERSE_PROXY_TRUSTED_PROXIES को अपने प्रॉक्सी के वास्तविक IP या CIDR पर सेट करें (कभी * नहीं), या ENABLE_REVERSE_PROXY_AUTHENTICATION बंद करें यदि आप इसका उपयोग नहीं करते।
मैंने यह बग पाया और 2026-05-26 को इसे गीटिया को रिपोर्ट किया। मैं गीटिया की सलाहकार सूचना GHSA-f75j-4cw6-rmx4 में नामित रिपोर्टर हूँ।
कुछ कवरेज ने इसका श्रेय मेरे बजाय Exploitarium रिपॉज़िटरी को दिया। यह गलत है, और यह उस रिपॉज़िटरी द्वारा प्रकाशित चीज़ से अलग है। मैंने तब से उनमें से कई ब्लॉगों को सुधारवा लिया है; कुछ अभी भी गलत हैं।
MIT लाइसेंस प्राप्त। LICENSE देखें।