
Public PoC and detector for CVE-2026-20896 ("Gitea Docker: One Header, Any User")
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에 명시)은 127.0.0.0/8,::1/128입니다. 즉 루프백만 허용되므로 기본적으로 로컬 프록시만 신뢰됩니다. 공식 Docker 이미지는 이 값을 사용하지 않습니다. app.ini 템플릿에 *가 하드코딩되어 있습니다(docker/root/etc/templates/app.ini:55, rootless 이미지의 경우 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
번들 이미지에서의 결과:
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 참조.