Adresár .git je verejne dostupný
Čo to je
Adresár .git/ je v koreni vášho webu voľne dostupný. Súbor https://example.cz/.git/HEAD vracia 200 OK — a to znamená, že je dostupný aj celý zvyšok.
Prečo je to problém
.git/ obsahuje kompletnú históriu vášho projektu. Útočník ju za minútu stiahne nástrojom ako GitTools/Dumper alebo git-dumper. Čo tým získa:
- Kompletný zdrojový kód aplikácie (aj časti, ktoré nie sú pre web).
- Históriu commitov — vrátane secrets, ktoré ste „omylom“ commitli a neskôr zmazali (zmazaný commit zostáva v histórii).
- Konfiguračné súbory, vzory
.env, skripty, deploy skripty. - Ak sú v repozitári privátne knižnice — tie tiež.
Ako to opraviť
Krok 1 — zablokovať prístup
nginx:
location ~ /\.git {
deny all;
return 404;
}Apache (.htaccess):
RedirectMatch 404 /\.gitOverte: curl -I https://example.cz/.git/HEAD má vrátiť 404.
Krok 2 — deployovať bez .git
Z dlhodobého hľadiska by .git/ nemal vôbec byť na produkčnom serveri. Lepšie cesty:
- CI/CD (GitHub Actions, GitLab CI) — build prebehne v CI, do produkcie sa nahrávajú len artefakty.
git archive—git archive HEAD | tar -x -C /var/www/...prenesie len pracovný strom, bez histórie.- Capistrano / Deployer / Ansible — štandardné deploy nástroje rozumejú „clone, build, symlink“ a
.gitvo webroote nevytvárajú.
Krok 3 — rotujte secrets, ktoré kedy boli v repozitári
Ak ktokoľvek stiahol .git/, má vašu históriu. Predpokladajte, že všetky secrets, ktoré kedy boli commitnuté (aj zmazané), poznajú.
Vyhľadajte staré secrets v histórii:
# nájsť čokoľvek, čo vyzerá ako API kľúč
git log -p --all -G '(api[_-]?key|secret|password|token)' | head -200
# alebo použite gitleaks
gitleaks detect --source=.Čo nájdete — rotovať. Zmazať z aktuálneho commitu nestačí — v histórii to zostáva navždy.