Katalog .git jest publicznie dostępny
Co to jest
Katalog .git/ jest swobodnie dostępny w katalogu głównym Twojej strony. Plik https://example.cz/.git/HEAD zwraca 200 OK — a to oznacza, że dostępna jest również cała reszta.
Dlaczego to problem
.git/ zawiera kompletną historię Twojego projektu. Atakujący pobierze ją w ciągu minuty narzędziem takim jak GitTools/Dumper albo git-dumper. Co dzięki temu uzyska:
- Kompletny kod źródłowy aplikacji (także części, które nie są przeznaczone dla strony).
- Historię commitów — w tym sekrety, które „przez pomyłkę” commitnąłeś i później usunąłeś (usunięty commit pozostaje w historii).
- Pliki konfiguracyjne, wzorce
.env, skrypty, skrypty deployu. - Jeśli w repozytorium znajdują się prywatne biblioteki — je również.
Jak to naprawić
Krok 1 — zablokować dostęp
nginx:
location ~ /\.git {
deny all;
return 404;
}Apache (.htaccess):
RedirectMatch 404 /\.gitSprawdź: curl -I https://example.cz/.git/HEAD powinno zwrócić 404.
Krok 2 — wdrażać bez .git
Długoterminowo .git/ w ogóle nie powinien znajdować się na serwerze produkcyjnym. Lepsze sposoby:
- CI/CD (GitHub Actions, GitLab CI) — build odbywa się w CI, a na produkcję wgrywane są tylko artefakty.
git archive—git archive HEAD | tar -x -C /var/www/...przenosi tylko drzewo robocze, bez historii.- Capistrano / Deployer / Ansible — standardowe narzędzia deployu rozumieją „clone, build, symlink” i nie tworzą
.gitw webroot.
Krok 3 — rotuj sekrety, które kiedykolwiek były w repozytorium
Jeśli ktokolwiek pobrał .git/, ma Twoją historię. Zakładaj, że wszystkie sekrety, które kiedykolwiek zostały commitnięte (nawet usunięte), są mu znane.
Wyszukaj stare sekrety w historii:
# znajdź wszystko, co wygląda jak klucz API
git log -p --all -G '(api[_-]?key|secret|password|token)' | head -200
# albo użyj gitleaks
gitleaks detect --source=.Co znajdziesz — rotuj. Usunięcie z bieżącego commitu nie wystarczy — w historii pozostaje to na zawsze.