Adresář .git je veřejně dostupný
Co to je
Adresář .git/ je v kořeni vašeho webu volně dostupný. Soubor https://example.cz/.git/HEAD vrací 200 OK — a to znamená, že je dostupný i celý zbytek.
Proč je to problém
.git/ obsahuje kompletní historii vašeho projektu. Útočník ji během minuty stáhne nástrojem jako GitTools/Dumper nebo git-dumper. Co tím získá:
- Kompletní zdrojový kód aplikace (i části, které nejsou pro web).
- Historii commitů — včetně secrets, které jste „omylem“ commitli a později smazali (smazaný commit zůstává v historii).
- Konfigurační soubory, vzory
.env, skripty, deploy scripty. - Pokud jsou v repozitáři privátní knihovny — ty taky.
Jak to opravit
Krok 1 — zablokovat přístup
nginx:
location ~ /\.git {
deny all;
return 404;
}Apache (.htaccess):
RedirectMatch 404 /\.gitOvěřte: curl -I https://example.cz/.git/HEAD má vrátit 404.
Krok 2 — deployovat bez .git
Dlouhodobě by .git/ neměl vůbec na produkčním serveru být. Lepší cesty:
- CI/CD (GitHub Actions, GitLab CI) — build proběhne v CI, do produkce se nahrávají jen artifacty.
git archive—git archive HEAD | tar -x -C /var/www/...přenese jen pracovní strom, bez historie.- Capistrano / Deployer / Ansible — standardní deploy nástroje rozumí „clone, build, symlink“ a
.gitve webrootu nevytváří.
Krok 3 — rotujte secrets, které kdy byly v repozitáři
Pokud kdokoliv stáhl .git/, má vaši historii. Předpokládejte, že všechny secrets, které kdy byly commitnuté (i smazané), znají.
Vyhledejte staré secrets v historii:
# najít cokoliv, co vypadá jako API klíč
git log -p --all -G '(api[_-]?key|secret|password|token)' | head -200
# nebo použijte gitleaks
gitleaks detect --source=.Co najdete — rotovat. Smazat z aktuálního commitu nestačí — v historii to zůstává navždy.