Durante agosto, los sensores de F5 registraron 807 ataques agrupados por sesión y unos 32.000 eventos contra servidores de desarrollo de Vite accesibles desde internet, contra 1.732 eventos en los tres meses anteriores.
El objetivo no era la aplicación: era el archivo .env de la máquina donde esa aplicación se está escribiendo, y las credenciales de AWS y Azure que suelen vivir al lado.
La falla: un signo de pregunta que saltea el candado
Vite es la herramienta que levanta el servidor local cuando corrés npm run dev en un proyecto de React, Vue o Svelte. Ese servidor sirve archivos del disco para poder recargar el navegador al instante.
Justamente por eso trae una lista negra, server.fs.deny, que por defecto bloquea .env, certificados y claves (*.crt, *.pem, *.key) y todo lo que cuelgue de .git.
CVE-2026-39364 es el agujero en ese candado. Si a la URL se le pegan ciertos parámetros de consulta (?raw, ?import&raw o ?import&url&inline), la validación se hace antes de normalizar la ruta y el servidor devuelve el archivo prohibido con un HTTP 200 limpio.
El proyecto lo puntuó en 8.2 sobre CVSS 4.0, sin autenticación ni interacción del usuario. Afecta de la 7.1.0 a la 7.3.1 y de la 8.0.0 a la 8.0.4, y está corregido en 7.3.2 y 8.0.5.
No es la primera vez: CVE-2025-30208 y CVE-2025-31125, de marzo y abril de 2025, son variantes del mismo bypass. El advisory de CVE-2026-39364 se publicó el 6 de abril de 2026, o sea que los escaneos masivos llegaron cuatro meses después de que el parche estuviera disponible.
Qué buscan exactamente los escaneos
Las peticiones observadas por F5 tienen la forma GET /@fs/.env?raw??, y en la variante con travesía de directorios usan doble codificación (%252f) para pasar proxies intermedios.
Sobre eso corren diccionarios largos de rutas conocidas:
- Archivos de entorno:
.env,.env.production,.env.local,.env.development. - Credenciales de AWS en varios home posibles:
/root/.aws/credentials,/home/ubuntu/.aws/credentials. - Perfiles de Azure:
.azure/credentialsy.azure/accessTokens.json. - Estado de infraestructura como código:
terraform.tfstateyserverless.yml. - Descriptores del sistema:
/proc/self/environ,/proc/1/environy/etc/passwd.
El tráfico salió mayormente de rangos de Google Cloud (34.x y 35.x), y falsea el User-Agent para hacerse pasar por Googlebot, ClaudeBot, GPTBot y PerplexityBot.
Por qué un servidor de desarrollo termina en internet
Por defecto Vite escucha en localhost y no es alcanzable desde afuera. El advisory es explícito en que la falla solo impacta si el servidor fue expuesto a la red.
Las tres formas habituales de exponerlo son levantar con --host para probar desde el celular, poner server.host en vite.config.js, y publicar el puerto en Docker con 5173:5173, que lo abre en todas las interfaces del host.
Cómo verificar si el tuyo está expuesto
- Mirá en qué interfaz escucha:
ss -tlnp | grep -E '5173|4173'. Si ves0.0.0.0:5173o[::]:5173, está abierto a la red; si ves127.0.0.1:5173, no. - Buscá
--hosten los scripts depackage.jsonyserver.hostenvite.config.js. - Revisá el
docker-compose.yml:"5173:5173"publica en todas las interfaces,"127.0.0.1:5173:5173"no. - Confirmá la versión real instalada con
npm ls vite, que no siempre coincide con el rango delpackage.json. - Probá el bypass desde otra máquina:
curl -s -o /dev/null -w "%{http_code}\n" "http://IP:5173/@fs/RUTA/AL/PROYECTO/.env?raw". Un 200 es un servidor expuesto y vulnerable. - En los logs del proxy o del WAF, buscá peticiones con
/@fs/y con%252fen la ruta.
Qué hacer hoy
- Actualizar Vite a
7.3.2o8.0.5como mínimo, o a la última de tu rama. - Volver al
hostpor defecto y, cuando necesites probar desde otro dispositivo, usar un túnel SSH en vez de abrir el puerto. - Cerrar el 5173 en el security group de AWS o en el NSG de Azure, y en el firewall de las máquinas de desarrollo.
- Si el servidor estuvo expuesto sin parchear, rotar todo lo que pudo leerse: claves de AWS, tokens de Azure, y revisar el
terraform.tfstate, que suele guardar secretos en texto plano. - Dejar de trabajar con credenciales de larga duración en el directorio del proyecto y pasar a credenciales temporales por SSO.
- Si hay un WAF adelante, bloquear el segmento
/@fs/y validar los bots por DNS inverso en vez de creerle al User-Agent.
La superficie de ataque incluye tu notebook
El inventario de seguridad de la mayoría de los equipos cubre producción y, con suerte, staging. La máquina donde se escribe el código queda afuera, y sin embargo es la que tiene las credenciales con más permisos.
¿Sabés en qué interfaz están escuchando los npm run dev de tu equipo ahora mismo? Te leemos en los comentarios.
Fuentes
- F5 Labs — Cloud Takeover: Mass Scanning for Exposed Vite Endpoints (CVE-2026-39364)
- GitHub Advisory Database — Vite: server.fs.deny bypassed with queries (CVE-2026-39364)
- Vite — Server Options
- BleepingComputer — Hackers target exposed Vite dev servers to steal AWS, Azure secrets
- The Hacker News — Mass-scanning campaign exploits Vite flaw to extract cloud credentials


