Tutte le guide
Gravità CriticoConfigurazioni errate

Directory .git esposta: la fuga di codice sorgente nascosta in bella vista

Quando un web server serve la directory .git insieme ai file dell'applicazione, un attaccante può scaricare abbastanza oggetti da ricostruire l'intero codice sorgente — compreso ogni secret mai committato, anche se rimosso in un commit successivo. AppSafe lo segnala come critico.

Che cos'è

Git conserva l'intero repository — ogni file, ogni commit, ogni punta di branch — in una directory nascosta .git nella root del progetto. Se quella directory finisce nella web root e il server non ne blocca l'accesso, i file /.git/config, /.git/HEAD e l'object store sotto /.git/objects/ sono scaricabili pubblicamente.

Ricostruire il sorgente completo da una directory .git esposta è semplice. Strumenti come git-dumper recuperano l'index e poi scaricano ogni oggetto referenziato, producendo un checkout perfettamente funzionante. Agli attaccanti non serve un accesso shell — basta un browser.

Perché è importante

Il tuo codice sorgente contiene quasi certamente informazioni che aumentano il rischio: API key hardcoded (spesso in commit più vecchi), schemi del database, percorsi di endpoint interni, logica di business e flussi di autenticazione. Anche se oggi nessun secret è committato, la cronologia è piena di materiale sfruttabile dagli attaccanti.

La cronologia di Git è permanente per design. Un secret committato anni fa e poi rimosso vive ancora nell'object store e viene scaricato insieme a tutto il resto. L'unico modo per neutralizzarlo è ruotarlo.

Come risolverlo

Bloccare .git in nginx

Nega tutte le richieste il cui percorso inizia con /.git/. Restituisci 404 invece di 403 per non confermare che la directory esiste.

location ~ /\.git {
  deny all;
  return 404;
}
Tenere .git fuori dalla web root

La soluzione più affidabile è non distribuire mai la directory .git nella document root. Struttura la build in modo che l'output compilato finisca in una directory public/ separata e distribuisci solo quella, non la root del progetto.

Verificare che sia bloccata

Dopo aver distribuito la correzione, apri https://yourdomain.com/.git/config in un browser. Deve restituire 404, non il contenuto della tua configurazione Git. AppSafe lo ricontrolla a ogni scansione.

Ruotare ogni secret mai committato

Se la directory era accessibile, considera compromessi tutte le API key, password e token mai comparsi in un commit. Ruotali — rimuovere il commit non basta, perché l'oggetto esiste ancora nei pack file che un attaccante potrebbe aver già scaricato.

FAQ

Distribuisco su una piattaforma gestita (Vercel, Netlify, Fly.io) — sono a rischio?

Le piattaforme gestite che eseguono la build dal sorgente in genere distribuiscono solo l'output della build, quindi la directory .git non viene servita. Il rischio è maggiore con deploy su VPS, container Docker costruiti dalla root del progetto o export di siti statici in cui viene copiato l'intero working tree.

Cosa controlla esattamente AppSafe?

AppSafe richiede /.git/config e /.git/HEAD e verifica se il corpo della risposta sembra un vero file Git (corrispondenza con i pattern [core] o ref:). Una pagina 200 generica che non contiene dati Git non viene segnalata.

Posso semplicemente eliminare la directory .git sul server?

Sì, se ti servono solo i file distribuiti per far girare l'app. Ma assicurati che il processo di deploy non la ricopi al push successivo. Bloccarla a livello di web server è una difesa aggiuntiva per quando gli script di deploy non sono coerenti.

La tua app è interessata?

AppSafe controlla questo e decine di altri problemi in un'unica scansione gratuita.

Scansiona la mia app gratis