Das .git-Verzeichnis ist öffentlich zugänglich
Worum es geht
Das Verzeichnis .git/ ist im Stammverzeichnis Ihrer Website frei zugänglich. Die Datei https://example.cz/.git/HEAD liefert 200 OK — und das bedeutet, dass auch der gesamte Rest erreichbar ist.
Warum das ein Problem ist
.git/ enthält die komplette Historie Ihres Projekts. Ein Angreifer lädt sie innerhalb einer Minute mit einem Tool wie GitTools/Dumper oder git-dumper herunter. Was er damit erhält:
- Den kompletten Quellcode der Anwendung (auch Teile, die nicht für das Web bestimmt sind).
- Die Commit-Historie — einschließlich Secrets, die Sie „versehentlich“ committet und später gelöscht haben (ein gelöschter Commit bleibt in der Historie erhalten).
- Konfigurationsdateien,
.env-Vorlagen, Skripte, Deploy-Skripte. - Falls sich im Repository private Bibliotheken befinden — auch diese.
Wie Sie es beheben
Schritt 1 — Zugriff blockieren
nginx:
location ~ /\.git {
deny all;
return 404;
}Apache (.htaccess):
RedirectMatch 404 /\.gitÜberprüfen: curl -I https://example.cz/.git/HEAD muss 404 zurückgeben.
Schritt 2 — ohne .git deployen
Langfristig sollte .git/ auf dem Produktionsserver überhaupt nicht vorhanden sein. Bessere Wege:
- CI/CD (GitHub Actions, GitLab CI) — der Build läuft in der CI, in die Produktion werden nur die Artefakte hochgeladen.
git archive—git archive HEAD | tar -x -C /var/www/...überträgt nur den Arbeitsbaum, ohne Historie.- Capistrano / Deployer / Ansible — standardmäßige Deploy-Tools beherrschen „clone, build, symlink“ und legen kein
.gitim Webroot an.
Schritt 3 — rotieren Sie alle Secrets, die jemals im Repository waren
Wenn irgendjemand .git/ heruntergeladen hat, besitzt er Ihre Historie. Gehen Sie davon aus, dass alle Secrets, die jemals committet wurden (auch gelöschte), bekannt sind.
Suchen Sie nach alten Secrets in der Historie:
# alles finden, was wie ein API-Schlüssel aussieht
git log -p --all -G '(api[_-]?key|secret|password|token)' | head -200
# oder gitleaks verwenden
gitleaks detect --source=.Was Sie finden — rotieren. Aus dem aktuellen Commit zu löschen reicht nicht — in der Historie bleibt es für immer.