Todos los artículos
Incidente6 min de lectura

La brecha de Railway: cómo rotar los secretos de tu app sin caídas

Row of metal keys on hooks while a robotic arm swaps one key for a new glowing one

Si despliegas en Railway, probablemente ya te ha llegado el email: rota tus variables de entorno. Si despliegas en otro sitio, sigue leyendo de todos modos. Este incidente es un ejemplo claro de un riesgo que asume cualquier desarrollador indie, y los pasos de limpieza son los mismos en cualquier plataforma.

Esto es lo que pasó, por qué iba dirigido a gente como tú y una forma práctica de rotarlo todo sin tumbar tu app.

Qué pasó

El 21 de octubre, Railway reveló que un tercero no autorizado había accedido a sistemas que almacenan variables de entorno de clientes y que, en algunos casos, el atacante podría haber obtenido su contenido descifrado. Railway pausó todos los despliegues, avisó a los proveedores afectados para que revocaran claves y pidió a todos sus usuarios que rotaran sus variables de entorno, incluidas las credenciales de registros privados.

Su informe preliminar aporta más detalles:

  • El ataque se prolongó del 20 de octubre a primera hora del 22 de octubre (UTC). Empezó con un intento de escalada de privilegios en la infraestructura de builds.
  • Como máximo el 1,85% de los workspaces, unos 100.000, tuvieron alguna variable potencialmente comprometida. Por cómo estaban cifradas las claves, Railway aún no puede decir exactamente qué secretos de un proyecto afectado quedaron expuestos.
  • El atacante buscaba API keys de proveedores de IA y de plataformas. Railway considera de mayor riesgo los workspaces con muchas variables de entorno o con muchas claves de IA.
  • Railway dice que no puede reembolsar el gasto en IA hecho con claves comprometidas. Tendrás que reclamarlo al proveedor.

TechCrunch informa de que Railway cree que esto formaba parte de una campaña más amplia contra plataformas, con el objetivo de comprometer a proveedores de inferencia de IA. Esa misma semana, la herramienta de programación con IA OpenCode reveló que unos hackers se habían llevado API keys y otros secretos de más del 1% de sus clientes.

Por qué los desarrolladores son el objetivo

Las claves de IA robadas valen dinero de verdad. Los atacantes revenden el acceso o agotan tu cuota con sus propias cargas de trabajo, un patrón que los investigadores llaman LLMjacking. Una plataforma de hosting es un lugar muy eficiente para recolectarlas, porque miles de apps guardan en un mismo sitio sus claves de OpenAI, Anthropic, Stripe y su base de datos.

Hay un detalle incómodo en el informe de Railway. Las variables estaban cifradas, pero la plataforma tiene que poder descifrarlas para inyectarlas en tus builds y en tus servicios en ejecución. En cuanto el atacante tuvo el acceso interno adecuado, el cifrado en reposo no lo detuvo. Esto no es exclusivo de Railway. Cualquier host que ejecute tu código puede leer tus secretos.

Así que la pregunta no es "¿mi host es seguro?", sino "si mañana se filtraran los secretos de mi host, ¿qué tan grave sería y qué tan rápido podría recuperarme?"

Cómo revisar tu exposición

Dedícale 20 minutos, aunque ya hayas pulsado "rotar" en algunas cosas.

1. Haz inventario de todos tus secretos. Lista los nombres de las variables de cada proyecto y entorno, incluidos staging y los entornos de preview. Si tienes un .env.example, es un buen punto de partida:

grep -oE '^[A-Z0-9_]+' .env.example

Para cada uno, anota qué desbloquea: una base de datos, un proveedor de pagos, un proveedor de IA, el email, un bucket de almacenamiento, un token de GitHub.

2. Revisa el uso y la facturación de tu proveedor de IA. Busca picos de uso, modelos que no reconoces o peticiones a horas raras desde el 20 de octubre. Es el lugar donde con más probabilidad aparecerá primero el abuso.

3. Revisa los logs de auditoría que tengas. Railway recomienda expresamente revisar los logs de auditoría de GitHub y el acceso de las apps instaladas, además de los logs de registros como Docker Hub. Mira también los logs de API de tu proveedor de pagos y los logs de conexión de tu base de datos.

4. Comprueba si tu base de datos es accesible desde internet. El informe de Railway recomienda eliminar el acceso de red público a las bases de datos. Si una cadena de conexión filtrada apunta a una base de datos a la que cualquiera puede conectarse, la filtración se puede aprovechar al instante:

nc -zv your-db-host.example 5432   # "succeeded" from your laptop = publicly reachable

5. Revisa lo que tu frontend ya está regalando. Brechas como esta recuerdan que hay que separar los secretos de verdad de los valores que son públicos por diseño. Una clave que viaja en tu bundle de JavaScript nunca fue secreta.

API keys en el código frontend: cómo distinguir secretos reales de claves públicas

Cómo rotar sin romper producción

El error típico bajo presión es revocar primero la clave antigua y luego correr a desplegar la nueva mientras la app devuelve errores. Hazlo en este orden:

  • Crea una credencial nueva en el proveedor (nueva API key, nueva contraseña de base de datos, nuevo secreto de webhook). De momento, deja activa la antigua.
  • Actualiza la variable en tu host y vuelve a desplegar para que la app en ejecución la recoja.
  • Verifica que la app funciona con el nuevo valor. Llama a un endpoint que use de verdad ese servicio.
  • Revoca la credencial antigua en el proveedor.
  • Confirma que la antigua ya no sirve, por ejemplo haciendo una llamada de prueba con ella y comprobando que falla.

Recorre tu lista empezando por lo que más daño haría: claves de pagos, credenciales de base de datos, claves de cloud y almacenamiento, claves de proveedores de IA, tokens de GitHub y de registros, y después todo lo demás. Las indicaciones de Railway se centran en las variables configuradas antes del 21 de octubre, y sus recomendaciones posteriores añaden reconectar GitHub y recrear las credenciales de la CLI y de CI.

Algunos secretos requieren un cuidado especial:

  • Secretos de firma de sesión o de JWT. Cambiarlos cierra la sesión de todos los usuarios. Tras una brecha suele ser aceptable, pero avisa a tus usuarios si puedes.
  • Secretos de firma de webhooks. Actualiza a la vez el lado receptor y el proveedor que envía, o rechazarás eventos legítimos durante un rato.
  • Contraseñas de base de datos. Si tu plataforma lo permite, crea un nuevo usuario de base de datos con los mismos permisos, cambia la app a ese usuario y luego elimina el antiguo. Es más limpio que cambiar una contraseña sobre la marcha.

Haz que la próxima brecha duela menos

No puedes evitar que hackeen a tu host. Sí puedes hacer que un secreto filtrado valga menos.

Limita el alcance de las claves. Usa claves restringidas cuando los proveedores las ofrezcan. Una clave restringida de Stripe que solo puede crear sesiones de checkout le sirve de mucho menos a un atacante que una secret key completa.

Pon un tope al gasto. Configura presupuestos mensuales y alertas de uso en cada proveedor de IA. Así, una sorpresa de cinco cifras se queda en un email.

Separa los entornos. No reutilices claves de producción en staging ni en despliegues de preview. Cada entorno debe tener sus propias credenciales para que una filtración en uno no entregue el otro.

Mantén privadas las bases de datos. Usa la red privada de tu plataforma y, si estás en Supabase, asegúrate de que Row Level Security esté activado para que una anon key filtrada no exponga tus tablas.

Row Level Security de Supabase: cómo activarlo y probarlo

Nunca guardes secretos en archivos accesibles. Un archivo .env desplegado en tu web root se filtra sin necesidad de ninguna brecha.

Escribe ya tu runbook de rotación. La lista del paso 1, el orden de arriba y dónde se gestiona cada clave. La próxima vez, rotar te llevará una hora en lugar de un fin de semana.

Archivos .env expuestos: cómo los encuentran los atacantes y cómo revisar los tuyos

Checklist rápida

Repásala para cada app que despliegues:

  • Todos los secretos de todos los entornos están listados, con lo que desbloquea cada uno.
  • Cada uno se rotó en el orden crear, desplegar, verificar, revocar.
  • Uso y facturación de los proveedores de IA revisados desde el 20 de octubre, con topes de gasto configurados.
  • Logs de GitHub, registros, pagos y base de datos revisados.
  • Las bases de datos no son accesibles públicamente.
  • Producción y staging usan claves distintas.
  • Ningún secreto real viaja en el código frontend ni está en archivos accesibles desde la web.

La conclusión

Railway hizo lo correcto al informar rápido y presionar para que se rotaran las claves. Pero esto les sigue pasando a las plataformas de hosting y de desarrollo, porque ahí es donde están las claves. Quienes salen de esto con calma son quienes saben qué secretos tienen y pueden cambiarlos en una tarde.

Ya que estás limpiando, vale la pena revisar también lo que tu app expone desde fuera. AppSafe escanea tu web en producción en busca de problemas comunes como API keys en bundles de JavaScript, archivos .env y .git expuestos y encabezados de seguridad ausentes, con soluciones explicadas en lenguaje claro. Nuestra checklist de lanzamiento para apps hechas con IA cubre el resto de lo básico.

Cuando lo hayas rotado todo, lanza un escaneo gratuito de AppSafe para asegurarte de que no se filtra nada más.

Ejecuta este checklist automáticamente

Un solo escaneo gratis revisa todos estos problemas en tu app y te da un prompt de corrección con IA para cada hallazgo.

Escanear mi app gratis