Qué está pasando
Tres informes distintos de los últimos meses apuntan en la misma dirección.
- Cequence (publicado el 28 de octubre): un escáner, unas 32 identidades de IA falsas, activo al menos desde finales de septiembre hasta finales de octubre. Cada dirección en la nube lanzaba una ráfaga de 50 a 190 peticiones en unos ocho segundos y pasaba a otra. Usó más de 300 direcciones en un solo día, y ninguna de las de finales de septiembre volvió a aparecer un mes después. El análisis de CSO Online señala que este tipo de rotación hace que las listas de bloqueo de IP estáticas sean mucho menos útiles.
- GreyNoise (agosto): otro grupo suplantó a 13 crawlers de IA desde 824 direcciones, ninguna dentro de los rangos de IP publicados por esas empresas. Las rutas más pedidas parecen una lista de todos los sitios donde un framework podría dejar secretos: /.env, /app/.env, /api/.env, /backend/.env, /.env.local, /.env.production, /.env.bak, /.aws/credentials. Los bots falsos nunca pidieron /robots.txt. El crawler real de Anthropic sí lo hizo, y nunca pidió un archivo de credenciales.
- Symantec, vía Help Net Security (23 de octubre): un honeypot que se hacía pasar por un servicio de IA sin proteger pilló en acción al agente autónomo de un atacante. Su prompt de jailbreak le decía al modelo que leer archivos .env, API keys y esquemas de bases de datos era trabajo de desarrollo normal. La mayoría de las más de 127.000 peticiones que registró el honeypot eran reconocimiento, intentos con claves robadas y sondeos de archivos de configuración expuestos.
El patrón está claro. Los atacantes saben que los dueños de sitios han empezado a permitir crawlers de IA, así que toman prestados esos nombres. Y saben que las claves de IA valen dinero de verdad: una clave de OpenAI, Anthropic o Gemini filtrada puede generar una factura enorme antes de que te des cuenta.
Por qué debería importarte si lanzas rápido
El user agent no es más que una cabecera que el visitante escribe sobre sí mismo. No demuestra nada. Si tu hosting, una regla de tu CDN o tu WAF deja pasar a los "bots de IA conocidos", puede que hayas abierto la puerta justo a este tráfico.
Y lo más importante: lo que buscan es un error clásico de las apps lanzadas con prisa. Un .env acaba en la raíz web porque el build copió toda la carpeta del proyecto. Un .env.production.bak se queda olvidado tras un arreglo de madrugada. Una imagen de Docker sirve /app como archivos estáticos. Nada de esto requiere un exploit ingenioso. Es una petición GET, y al bot le da igual si es la primera que hace o la nonagésima.
Cómo revisar tu app
Empieza por las rutas que piden de verdad los escáneres. Ejecuta el bucle de abajo desde una terminal, con tu propio dominio.
Lo que quieres ver es 404 o 403 en cada línea. Un 200 es un problema, pero revisa el cuerpo antes de alarmarte: muchas single-page apps devuelven index.html con un 200 para cualquier ruta desconocida. Ejecuta curl -s https://yourapp.com/.env | head -5 y mira qué devuelve. Si ves líneas KEY=value, trata cada secreto de ese archivo como comprometido.
for p in .env .env.local .env.production .env.bak .env.old \
app/.env api/.env backend/.env .aws/credentials .git/config; do
code=$(curl -s -o /dev/null -w "%{http_code}" "https://yourapp.com/$p")
echo "$code /$p"
doneYa puestos, revisa las filtraciones relacionadas que revelan los mismos secretos por otra vía:
- Un directorio .git accesible permite a cualquiera reconstruir tu código, incluido cualquier .env que se haya commiteado alguna vez.
- Las claves en tu bundle de JavaScript ni siquiera necesitan un escáner. Abre DevTools y busca en el bundle sk-, AIza o key.
- Los source maps en producción pueden publicar tu código original, con comentarios y todo.
Después revisa tus logs. Busca peticiones a /.env o /.aws/credentials. Si alguna devolvió un 200, ese es el momento en que empezó tu incidente.
Cómo solucionarlo
1. Saca los secretos de la raíz web. La solución de verdad es que el archivo simplemente no esté ahí para servirse. Las variables de entorno van en la configuración de tu hosting (Vercel, Netlify, Railway, Fly y el resto las tienen), no en un archivo que se despliega junto a tus assets estáticos. Asegúrate de que .env* esté tanto en .gitignore como en .dockerignore.
2. Bloquea los dotfiles en el servidor como red de seguridad. Para nginx:
# Deny all hidden files except the ACME challenge path
location ~ /\.(?!well-known) {
deny all;
return 404;
}Para Apache (.htaccess):
<FilesMatch "^\.">
Require all denied
</FilesMatch>Si tienes una app de Express que sirve archivos estáticos, express.static ignora los dotfiles por defecto. No lo cambies con dotfiles: 'allow'.
3. Rota todo lo que haya estado expuesto. Borrar el archivo no deshace la filtración de las claves. Rota cada secreto que haya sido accesible alguna vez, empezando por las claves de pagos, de base de datos y de proveedores de IA. Nuestro artículo sobre la brecha de Railway explica cómo rotar los secretos de tu app sin caídas.
4. Deja de fiarte del user agent. Si dejas pasar crawlers de IA por un firewall o un rate limit, verifícalos con los rangos de IP que publican las empresas en lugar de comprobar el nombre. GreyNoise enumera en su informe los archivos JSON oficiales de Anthropic, OpenAI, Google y Perplexity. El consejo de Cequence es el mismo: verificar mediante peticiones firmadas, rangos de direcciones publicados o integraciones directas.
5. Parchea tus herramientas de desarrollo si están expuestas. GreyNoise también vio a estos escáneres intentando explotar el fallo de lectura de archivos de Vite CVE-2025-30208. Si un servidor de desarrollo de Vite es accesible desde internet, actualiza a 6.2.3, 6.1.2, 6.0.12, 5.4.15 o 4.5.10 o posterior, y para empezar no expongas servidores de desarrollo públicamente.
6. Pon límites de gasto a las claves de IA. La mayoría de proveedores de IA te permiten limitar el gasto mensual o restringir las claves a proyectos concretos. No evitará una filtración, pero convierte una sorpresa de cuatro cifras en una pequeña.
Checklist rápida
Antes de cerrar la terminal, asegúrate de que:
- Cada ruta del bucle de curl de arriba devuelve 404/403, no tu archivo.
- .env* está en .gitignore y .dockerignore.
- Tu servidor o hosting bloquea los dotfiles.
- No hay claves secretas en el bundle de JS ni en los source maps.
- Cualquier clave que haya sido accesible alguna vez se ha rotado.
- Las listas de permitidos de crawlers de IA comprueban rangos de IP, no solo el user agent.
- Hay límites de gasto en las claves de proveedores de IA.
Revísalo antes que los bots
Estos escáneres rotan entre cientos de direcciones y dedican unos ocho segundos a cada ráfaga. No vas a ganar vigilando los logs. Ganas asegurándote de que no hay nada cuando llamen a la puerta.
AppSafe busca exactamente las filtraciones que persiguen estos bots, incluidos archivos .env accesibles, directorios .git expuestos, volcados de bases de datos y API keys en tu bundle de frontend, y cada hallazgo incluye un prompt de corrección listo para pegar en tu herramienta de IA. Si aún estás antes del lanzamiento, nuestra checklist para apps hechas con IA es una buena lectura complementaria. Ejecuta un escaneo gratuito de tu app y mira lo que vería un bot.
