
إثبات المفهوم العام ومكتشف لـ CVE-2026-20896 ("Gitea Docker: One Header, Any User")
صورة Docker الرسمية لـ Gitea (حتى الإصدار 1.26.2 وما يشملها) تأتي مع REVERSE_PROXY_TRUSTED_PROXIES = * في إعداداتها الافتراضية. إذا قمت بتفعيل تسجيل الدخول عبر الوكيل العكسي (reverse-proxy login)، فإن ذلك البدل (wildcard) يعني أن كل عنوان IP مصدر يُعتبر وكيلاً موثوقًا، وبالتالي يمكن لأي شخص يمكنه الوصول إلى المنفذ إرسال ترويسة X-WEBAUTH-USER وتسجيل الدخول كأي شخص يريد. بدون كلمة مرور، بدون رمز مميز.
أبلغت Gitea بهذا وقد تم إصلاحه في الإصدارين 1.26.3 / 1.26.4. هذا المستودع هو شرح خاص بي، وإثبات مفهوم عملي، وأداة فحص. إنه لخلل تم تصحيحه ومنشور للعامة.
يدعم Gitea المصادقة عبر الوكيل العكسي: حيث تضعه خلف وكيل يضع X-WEBAUTH-USER، ويثق Gitea في تلك الترويسة لمعرفة اسم المستخدم. هذا جيد طالما أن وكيلك فقط هو من يمكنه تعيينها. الإعداد الذي من المفترض أن يفرض ذلك هو REVERSE_PROXY_TRUSTED_PROXIES، وهو قائمة مسموح بها لعناوين IP. يلتزم Gitea بالترويسة فقط عندما يكون عنوان IP المصدر للطلب ضمن هذه القائمة.
الإعداد الافتراضي الموثق كآمن، الموجود في app.example.ini، هو 127.0.0.0/8,::1/128: الحلقة المحلية فقط، لذا في الإعداد الأولي، يثق فقط بالوكيل المحلي. صورة Docker الرسمية لا تستخدم ذلك. قالب app.ini الخاص بها يرمز إلى * بشكل صارم (docker/root/etc/templates/app.ini:55، وdocker/rootless/etc/templates/app.ini:52 للصورة عديمة الجذور). يطابق * كل عنوان IP مصدر، لذا لا يفعل فحص القائمة المسموح بها شيئًا. قم بتفعيل تسجيل الدخول عبر الوكيل العكسي والآن يمكن لأي شخص يمكنه الوصول إلى المنفذ إرسال الترويسة، وليس فقط وكيلك. مع تفعيل التسجيل التلقائي، يتم إنشاء الحساب فورًا. أرسل اسم مستخدم مسؤول وستصبح المسؤول.
إذاً، الكود ليس خاطئًا، بل الإعداد الافتراضي المرفق هو الخاطئ، وهو خاص بصور Docker. التثبيت الثنائي أو المبني ذاتيًا الذي يتبع app.example.ini يحتفظ بالإعداد الافتراضي للحلقة المحلية ولا يتأثر.
يتطلب Docker وPython 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
ما يبدو عليه ضد الصورة المرفقة:
الاختراق يعمل على جلسة الويب، وليس على 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 إذا كنت لا تستخدمه.
لقد وجدت هذا الخلل وأبلغت Gitea به في 2026-05-26. أنا المبلغ المذكور في إرشادات Gitea الأمنية، GHSA-f75j-4cw6-rmx4.
بعض التغطيات أعادت الفضل إلى مستودع Exploitarium بدلاً مني. هذا خطأ، وهو شيء منفصل عما نشره ذلك المستودع. ومنذ ذلك الحين، تمكنت من تصحيح عدة من تلك المدونات؛ القليل منها لا يزال خاطئًا.
مرخص بموجب MIT. انظر LICENSE.