
CVE-2026-20896("Gitea Docker: One Header, Any User")용 공개 PoC 및 탐지기
Gitea의 공식 Docker 이미지(1.26.2까지)는 기본 설정으로 REVERSE_PROXY_TRUSTED_PROXIES = *를 포함하고 있습니다. 리버스 프록시 로그인을 활성화하면 와일드카드로 인해 모든 소스 IP가 신뢰되는 프록시로 간주되어, 해당 포트에 접근 가능한 누구나 X-WEBAUTH-USER 헤더를 보내 원하는 사용자로 로그인할 수 있습니다. 비밀번호나 토큰이 필요 없습니다.
이 문제를 Gitea에 보고했으며, 1.26.3 / 1.26.4에서 수정되었습니다. 이 저장소는 제가 직접 작성한 분석, 작동하는 PoC, 그리고 점검 도구입니다. 이미 패치된 공개 버그에 대한 내용입니다.
Gitea는 리버스 프록시 인증을 지원합니다. 프록시가 X-WEBAUTH-USER를 설정하여 헤더를 전달하면, Gitea는 해당 헤더를 사용자 이름으로 신뢰합니다. 오직 프록시만이 이 헤더를 설정할 수 있다면 문제없습니다. 이를 강제하는 설정은 REVERSE_PROXY_TRUSTED_PROXIES로, IP 허용 목록입니다. Gitea는 요청의 소스 IP가 이 목록에 포함될 때만 헤더를 인정합니다.
문서상 안전한 기본값(app.example.ini에 명시)은 입니다. 즉 루프백만 허용되므로 기본적으로 로컬 프록시만 신뢰됩니다. 공식 Docker 이미지는 이 값을 사용하지 않습니다. 템플릿에 가 하드코딩되어 있습니다(, rootless 이미지의 경우 ). 는 모든 소스 IP를 일치시키므로 허용 목록 검사가 무의미해집니다. 리버스 프록시 로그인을 켜면 프록시뿐만 아니라 포트에 접근 가능한 누구나 헤더를 보낼 수 있습니다. 자동 등록이 활성화되어 있으면 즉시 계정이 생성됩니다. 관리자의 사용자 이름을 보내면 관리자가 됩니다.
127.0.0.0/8,::1/128app.ini*docker/root/etc/templates/app.ini:55docker/rootless/etc/templates/app.ini:52*따라서 코드 자체는 틀리지 않았으며, 패키징된 기본값이 문제이고 이는 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
번들 이미지에서의 결과:
1) /user/settings with no header -> HTTP 303 (redirect to login = not authed)
2) /user/settings with X-WEBAUTH-USER -> HTTP 200
logged in as 'pocadmin' - no password, no token, any source IP
3) /pocadmin profile page -> HTTP 200 (account created on the fly)
이 우회는 웹 세션에서 동작하며, /api/v1/...의 토큰 API에는 영향을 주지 않습니다. 토큰 API는 해당 헤더를 무시합니다.
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에 Gitea에 보고했습니다. Gitea 권고 GHSA-f75j-4cw6-rmx4에 명시된 보고자입니다.
일부 보도에서 이 버그를 Exploitarium 저장소의 것으로 잘못 표기했습니다. 이는 사실이 아니며, 해당 저장소가 공개한 것과는 별개의 문제입니다. 이후 여러 블로그에서 수정되었지만, 일부는 여전히 잘못된 상태입니다.
MIT 라이선스. LICENSE 참조.