很多開發者在部署 Gitea 時會選擇使用 Docker 映像檔,並在前面加上一個反向代理伺服器(Reverse Proxy),例如 Nginx 或 Traefik。反向代理除了負載平衡,最常見的用途之一就是處理身分驗證。然而,最近發現的一個嚴重漏洞 CVE-2026-20896,正好揭示了當後端服務過度信任代理伺服器傳遞的資訊時,會產生多麼危險的後果。
理解反向代理驗證機制
在典型的企業架構中,我們不希望每個微服務都各自實作複雜的登入邏輯。因此,會由最外層的反向代理負責驗證使用者身分,驗證通過後,代理伺服器會在 HTTP Header 中加入一個自定義欄位,例如 X-WEBAUTH-USER,告訴後端的 Gitea 這位使用者是誰。
後端的 Gitea 接收到這個 Header 後,只要確認請求是來自於「信任的代理伺服器」,就會直接將該請求視為已登入,而不需要使用者再次輸入密碼或 Token。這種機制能大幅簡化內部系統的整合,但其安全性完全建立在一個前提上:後端服務必須確保這個 Header 只能由受信任的代理伺服器發出。
漏洞核心:過寬的信任名單
CVE-2026-20896 的問題出在 Gitea Docker 映像檔的預設設定。在 Gitea 的核心設定檔 app.ini 中,有一個參數叫作 REVERSE_PROXY_TRUSTED_PROXIES,用來定義哪些 IP 位址被視為可信賴的代理伺服器。
正常情況下,這個值應該設定為特定的內部 IP 或本地回環位址(如 127.0.0.0/8),確保只有本地端能觸發此機制。然而,Gitea 的 Docker 映像檔在模板中將此值預設設定為星號(*)。
在資安設定中,星號代表萬用字元,意味著 Gitea 會信任來自任何 IP 位址的請求。
攻擊路徑與實務影響
當管理員開啟了 ENABLE_REVERSE_PROXY_AUTHENTICATION(啟用反向代理驗證)功能,但維持預設的信任名單(*)時,災難就發生了。
攻擊者不需要經過反向代理伺服器,只要能直接存取到 Gitea 容器的 HTTP 埠口,就可以在請求中自行偽造一個 X-WEBAUTH-USER Header。例如,如果攻擊者知道管理員的帳號名稱是 admin,他只需要在 Header 中寫入 X-WEBAUTH-USER: admin,Gitea 就會直接將其視為管理員權限登入,完全跳過密碼驗證。
如果該 Gitea 實例還開啟了自動註冊功能,攻擊者甚至可以輕易猜測出管理員帳號並直接奪取最高控制權。
修復方案與防禦建議
這個漏洞的 CVSS 評分高達 9.8 分,屬於極其危險的等級。官方已在 1.26.3 版本中修正此問題,主要改動包括移除預設的萬用字元星號,並將反向代理驗證改為必須由使用者主動開啟(Opt-in)的選項。
對於工程師的實務建議如下:
第一,立即更新 Gitea Docker 映像檔至 1.26.3 或更新版本。
第二,檢查 app.ini 設定。絕對不要在生產環境中將 REVERSE_PROXY_TRUSTED_PROXIES 設定為 *。請明確指定反向代理伺服器的內部 IP 位址。
第三,實施網路隔離。確保 Gitea 容器的 HTTP 埠口僅允許來自反向代理伺服器的流量,不要將後端埠口直接暴露在公網上。這能從網路層面阻斷攻擊者偽造 Header 的機會。
來源:thehackernews.com
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。