Directorio .git expuesto: la fuga de código fuente a la vista de todos
Cuando un servidor web sirve el directorio .git junto con los archivos de tu aplicación, un atacante puede descargar suficientes objetos para reconstruir todo tu código fuente, incluidos todos los secretos que alguna vez se subieron en un commit, aunque se hayan eliminado en un commit posterior. AppSafe lo marca como crítico.
Qué es
Git guarda el repositorio completo (cada archivo, cada commit, la punta de cada rama) en un directorio oculto .git en la raíz del proyecto. Si ese directorio acaba dentro de tu raíz web y tu servidor no bloquea el acceso, los archivos /.git/config, /.git/HEAD y el almacén de objetos en /.git/objects/ se pueden descargar públicamente.
Reconstruir el código fuente completo a partir de un directorio .git expuesto es sencillo. Herramientas como git-dumper descargan el índice y luego todos los objetos referenciados, generando una copia de trabajo totalmente funcional. Los atacantes no necesitan acceso a una shell: solo un navegador.
Por qué importa
Es casi seguro que tu código fuente contiene información que aumenta el riesgo: API keys hardcodeadas (a menudo en commits antiguos), esquemas de base de datos, rutas de endpoints internos, lógica de negocio y flujos de autenticación. Aunque hoy no haya ningún secreto en el repositorio, el historial está lleno de material que los atacantes pueden explotar.
El historial de Git es permanente por diseño. Un secreto subido hace años y eliminado después sigue en el almacén de objetos y se descarga junto con todo lo demás. Rotarlo es la única forma de neutralizarlo.
Cómo solucionarlo
Deniega todas las peticiones cuya ruta empiece por /.git/. Devuelve 404 en lugar de 403 para no confirmar que el directorio existe.
location ~ /\.git {
deny all;
return 404;
}La solución más fiable es no desplegar nunca el directorio .git en la raíz de documentos. Organiza tu build para que el resultado compilado vaya a un directorio public/ separado y despliega solo ese, no la raíz del proyecto.
Después de desplegar la corrección, abre https://yourdomain.com/.git/config en un navegador. Debe devolver 404, no el contenido de tu configuración de Git. AppSafe lo vuelve a comprobar en cada escaneo.
Si el directorio fue accesible, considera comprometidos todas las API keys, contraseñas y tokens que hayan aparecido en cualquier commit. Rótalos: eliminar el commit no basta, porque el objeto sigue existiendo en los pack files que un atacante puede haber descargado ya.
Preguntas frecuentes
Despliego en una plataforma gestionada (Vercel, Netlify, Fly.io). ¿Estoy en riesgo?
Las plataformas gestionadas que compilan desde el código fuente suelen desplegar solo el resultado del build, así que el directorio .git no se sirve. El riesgo es mayor en despliegues en VPS, contenedores Docker construidos desde la raíz del proyecto o exportaciones de sitios estáticos que copian todo el árbol de trabajo.
¿Qué comprueba exactamente AppSafe?
AppSafe solicita /.git/config y /.git/HEAD y comprueba si el cuerpo de la respuesta parece un archivo real de Git (coincidencias con los patrones [core] o ref:). Una página genérica con 200 que no tenga contenido de Git no se marca.
¿Puedo simplemente borrar el directorio .git del servidor?
Sí, si solo necesitas los archivos desplegados para que la app funcione. Pero asegúrate de que tu proceso de despliegue no lo vuelva a copiar en el siguiente push. Bloquearlo también a nivel del servidor web es una defensa adicional para cuando los scripts de despliegue no son consistentes.
¿Tu app está afectada?
AppSafe verifica este y docenas de problemas más en un solo escaneo gratis.
Escanear mi app gratisDel blog
Falsos crawlers de IA están buscando tus archivos .env. Así puedes revisar los tuyos
Escáneres de credenciales usan los nombres de crawlers de IA para colarse en las listas de permitidos, y piden un archivo en concreto: tu .env. Cómo comprobar si el tuyo es accesible y cómo protegerlo.
La brecha de Railway: cómo rotar los secretos de tu app sin caídas
Railway pidió a todos sus usuarios que rotaran sus variables de entorno después de que los atacantes fueran a por API keys de IA y de plataformas. Cómo revisar tu exposición, rotarlo todo sin tumbar tu app y hacer que la próxima brecha duela menos.
PHP2Shell está siendo explotado: cómo comprobar si tu app está expuesta
Dos bugs críticos en el propio PHP pasaron de "parche publicado" a "explotado activamente" en cuestión de días. Cómo saber si algo de lo que alojas usa una versión afectada y qué hacer hoy mismo.
Guías relacionadas
Archivos .env expuestos: cómo los atacantes encuentran tus secretos
Un solo .env accesible puede entregar todo tu stack.
Los source maps en producción filtran tu código fuente
Los .map publicados entregan tu código fuente original.
Índices de directorio abiertos: cuando tu servidor de archivos lo lista todo
Un servidor de archivos que lista su contenido regala a los atacantes un inventario.
Backups de base de datos expuestos: qué pasa cuando /backup.sql es accesible
Un volcado .sql accesible es la entrega completa de toda tu base de datos.