Todas las guías
Severidad CríticaErrores de configuración

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

Bloquea .git en nginx

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;
}
Mantén .git fuera de la raíz web

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.

Comprueba que está bloqueado

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.

Rota cualquier secreto que se haya subido alguna vez

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 gratis