
Öffentlicher PoC und Detektor für CVE-2026-20896 ("Gitea Docker: Ein Header, jeder Benutzer")
Das offizielle Docker-Image von Gitea (bis einschließlich 1.26.2) liefert in seiner Standardkonfiguration REVERSE_PROXY_TRUSTED_PROXIES = * aus. Wenn Sie die Reverse-Proxy-Anmeldung aktivieren, bedeutet dieser Platzhalter, dass jede Quell-IP als vertrauenswürdiger Proxy behandelt wird – jeder, der den Port erreichen kann, kann einen X-WEBAUTH-USER-Header senden und sich als beliebiger Benutzer anmelden. Kein Passwort, kein Token.
Ich habe dies an Gitea gemeldet, und es wurde in 1.26.3 / 1.26.4 behoben. Dieses Repository enthält meine eigene Dokumentation, einen funktionierenden PoC und einen Prüfer. Es handelt sich um einen gepatchten, öffentlichen Fehler.
Gitea unterstützt Reverse-Proxy-Authentifizierung: Sie platzieren es hinter einem Proxy, der X-WEBAUTH-USER setzt, und Gitea vertraut diesem Header für den Benutzernamen. Das ist in Ordnung, solange nur Ihr Proxy diesen Header setzen kann. Die Einstellung, die dies erzwingen soll, ist , eine IP-Whitelist. Gitea akzeptiert den Header nur, wenn die Quell-IP der Anfrage innerhalb dieser Liste liegt.
REVERSE_PROXY_TRUSTED_PROXIESDer dokumentierte, sichere Standardwert (der in app.example.ini) ist 127.0.0.0/8,::1/128: nur Loopback, sodass standardmäßig nur der lokale Proxy vertrauenswürdig ist. Das offizielle Docker-Image verwendet dies nicht. Seine app.ini-Vorlage hardcodiert * (docker/root/etc/templates/app.ini:55 und docker/rootless/etc/templates/app.ini:52 für das rootless-Image). * passt auf jede Quell-IP, sodass die Whitelist-Prüfung wirkungslos ist. Aktivieren Sie die Reverse-Proxy-Anmeldung, und nun kann jeder, der den Port erreicht, den Header senden – nicht nur Ihr Proxy. Bei aktivierter Auto-Registrierung wird das Konto sofort erstellt. Senden Sie den Benutzernamen eines Administrators, und Sie sind der Administrator.
Der Code ist also nicht falsch, sondern die ausgelieferte Standardkonfiguration, und dies betrifft nur die Docker-Images. Eine binäre oder selbst erstellte Installation, die app.example.ini folgt, behält den Loopback-Standard bei und ist nicht betroffen.
Benötigt Docker und Python 3 (nur Standardbibliothek, nichts zu installieren).
docker compose up -d # startet vulnerable gitea/gitea:1.26.2
# ~30-60s warten, bis die Ersteinrichtung abgeschlossen ist, dann:
python3 poc.py # zufälliges neues Opfer, zeigt Auto-Registrierung
python3 poc.py http://localhost:3000 admin # gibt sich als gewählten Benutzernamen aus
docker compose down -v # aufräumen
So sieht es gegen das mitgelieferte Image aus:
1) /user/settings ohne Header -> HTTP 303 (Weiterleitung zum Login = nicht authentifiziert)
2) /user/settings mit X-WEBAUTH-USER -> HTTP 200
eingeloggt als 'pocadmin' - kein Passwort, kein Token, beliebige Quell-IP
3) /pocadmin-Profilseite -> HTTP 200 (Konto wird sofort erstellt)
Der Bypass funktioniert in der Web-Session, nicht in der Token-API unter /api/v1/..., die den Header ignoriert.
detect.py sendet eine harmlose Testanfrage und vergleicht sie mit einer normalen Anfrage. Es verändert nichts.
python3 detect.py https://gitea.example.com
Es gibt VULNERABLE, looks-safe oder inconclusive aus. Führen Sie es nur gegen etwas aus, das Ihnen gehört oder das Sie testen dürfen.
Aktualisieren Sie auf 1.26.3 / 1.26.4 oder neuer. Die Reverse-Proxy-Authentifizierung ist jetzt opt-in, und das Image liefert den Platzhalter nicht mehr aus. Wenn Sie nicht aktualisieren können, setzen Sie REVERSE_PROXY_TRUSTED_PROXIES auf die tatsächliche IP oder CIDR Ihres Proxys (niemals *), oder deaktivieren Sie ENABLE_REVERSE_PROXY_AUTHENTICATION, wenn Sie diese Funktion nicht nutzen.
Ich habe diesen Fehler gefunden und am 2026-05-26 an Gitea gemeldet. Ich bin der im Gitea-Advisory (GHSA-f75j-4cw6-rmx4) genannte Melder.
Einige Berichte haben fälschlicherweise das Exploitarium-Repository dafür verantwortlich gemacht, nicht mich. Das ist falsch und hat nichts mit dem zu tun, was dieses Repository veröffentlicht hat. Ich habe inzwischen mehrere dieser Blogs korrigieren lassen; einige sind immer noch falsch.
MIT-lizenziert. Siehe LICENSE.