Seguridad en la codificación de Vibe: qué puede salir mal y cómo evitarlo
Oct 27, 2026
Los problemas de seguridad en la codificación de Vibe suelen provenir de tres cosas que un asistente de IA hace rápidamente: instalar paquetes que nadie revisó, poner secretos en el código y escribir archivos Docker que nadie lee. Los atacantes usan las tres, y un gusano puede copiarse de una máquina de desarrollador a otra mediante tokens robados. Un vault de contraseñas, menos derechos de administrador y la monitorización de cambios limitan hasta dónde puede llegar una mala instalación.
Estás hablando en voz alta con Claude Code. “Agrega Stripe checkout, conecta la base de datos, envíalo.” Tres minutos después la aplicación funciona y no has abierto ni un solo archivo.
Esa velocidad es la razón por la que a la gente le encanta el vibe coding. También es donde comienzan los riesgos de seguridad del vibe coding. Mientras hablabas, la IA seleccionó paquetes, escribió contraseñas en archivos y creó una imagen Docker. Tú dijiste que sí a todo sin leer.
La IA funciona con tus permisos y nadie revisa su trabajo
Cuando usas una herramienta de codificación AI, ejecuta comandos como tú. Puede instalar paquetes, leer tus archivos, editar tu configuración y usar tu inicio de sesión en la nube. El código normal se revisa antes de enviarse. El código Vibe-coded a menudo omite ese paso, porque la app funciona y nada parece estar mal.
Algunas personas también eliminan la última red de seguridad. Claude Code tiene una opción que omite cada solicitud de permiso:
# Omite cada solicitud de permiso. Ahora se ejecuta cada comando que el agente elige.
claude --dangerously-skip-permissions
En un sandbox desechable, está bien. En un portátil de trabajo lleno de tokens y claves, es un riesgo real.
Paquetes falsos y el gusano que se propaga a través de los reales
Los asistentes de IA a veces sugieren paquetes que no existen. Los atacantes vigilan esos nombres inventados, los registran y esperan a que alguien ejecute la instalación. Esto se llama slopsquatting. Aquí hay una lista de dependencias que parece correcta a simple vista:
{
"name": "my-saas-app",
"dependencies": {
"express": "^4.19.2",
"stripe": "^16.0.0",
"react-auth-helper-pro": "^1.0.3"
},
"scripts": {
"postinstall": "node scripts/setup.js"
}
}
Conoces los dos primeros. El tercero suena razonable, pero nadie de tu equipo lo eligió. La línea postinstall se ejecuta sola en el momento de la instalación, con tus permisos. Antes de aceptar un nuevo paquete, abre su página y verifica cuándo se publicó, cuántas personas lo descargan y si enlaza a un repositorio real. Un paquete que apareció la semana pasada con pocas descargas merece una segunda mirada.
Ahora añade el gusano. En septiembre de 2025, un gusano llamado Shai-Hulud se propagó a través de npm. Se ejecutaba cuando se instalaba un paquete, robaba tokens y claves de la nube de la máquina del desarrollador, y usaba esos tokens para publicar versiones infectadas de los propios paquetes de la víctima. Todos los que instalaron esos paquetes recibieron el mismo trato.
Un portátil con código vibe es un objetivo fácil para algo así. Los tokens están en archivos simples, el usuario tiene derechos de administrador local y las instalaciones se aprueban sin revisarlas.
Los secretos terminan en tu código
Pide a un asistente que “se conecte a Stripe y Postgres” y a menudo obtendrás esto:
// config.js
export const config = {
stripeKey: "sk_live_EXAMPLE_do_not_use",
databaseUrl: "postgres://admin:Summer2024!@prod-db.example.com:5432/app",
jwtSecret: "supersecret"
};
Funciona, así que sigues adelante. Luego llega el primer commit:
$ git add .
$ git commit -m "initial commit"
# No .gitignore, so .env went along too
Git recuerda todo. Si una clave queda en un commit y luego borras el archivo, sigue estando en el historial. Los bots escanean repositorios públicos en busca de claves todo el tiempo, por lo que una clave filtrada puede estar en uso antes de que lo notes. Si ya la subiste, trátala como robada y cámbiala. Los secretos también se filtran cuando los pegas en un prompt, ya que terminan en el contexto y los registros del agente.
Los secretos robados son de lo que se alimenta el gusano mencionado arriba. Un token en un archivo filtrado es una forma de publicar paquetes bajo tu nombre. Si no sabes dónde se encuentran los datos sensibles en tu empresa, sensitive data discovery es un buen punto de partida.
Archivos Docker que se construyen bien pero filtran de todos modos
Pide un Dockerfile y obtendrás uno que se construye. Para la mayoría, esa es la única prueba.
FROM node:latest
WORKDIR /app
COPY . .
ENV STRIPE_KEY=sk_live_EXAMPLE_do_not_use
RUN npm install
EXPOSE 3000 9229
CMD ["node", "server.js"]
Cinco problemas están en esas siete líneas. La etiqueta latest cambia sin aviso, por lo que la compilación de mañana puede ser diferente a la de hoy. COPY . . incluye tu archivo .env y la carpeta .git en la imagen. La línea ENV escribe el secreto en las capas de la imagen, donde cualquiera que pueda obtener la imagen puede leerlo. El contenedor se ejecuta como root. Y el puerto 9229 abre el depurador de Node.js a la red.
Aquí tienes una versión que puedes enviar sin dudar:
FROM node:20.17-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --ignore-scripts
COPY . .
USER node
EXPOSE 3000
CMD ["node", "server.js"]
Agrega un archivo .dockerignore con .env, .git y node_modules, y pasa la clave de Stripe al iniciar el contenedor, desde un vault o gestor de secretos.
El modelo de amenaza de codificación vibe en palabras simples
Tres cosas se juntan en cada proyecto codificado por vibe: el agente tiene tus permisos, nadie revisa el código y nadie verifica las dependencias. Cada una es un pequeño riesgo por sí sola. Juntas se encadenan. Un token filtrado se convierte en un paquete publicado a tu nombre, y ese paquete se convierte en la siguiente parada del gusano. Los expertos en seguridad llaman a esto un modelo de amenaza. Puedes verlo como una lista de las formas en que alguien podría entrar y qué podría alcanzar una vez dentro.
Directrices de codificación Vibe que puedes configurar hoy
Puedes seguir programando con estilo. Añade algunas verificaciones que no dependan de que alguien lea cada línea.
Problem | What to do | Example |
|---|---|---|
|
Unchecked packages |
Read every new dependency before installing, commit your lockfile, and turn off install scripts by default |
|
|
Secrets in code |
Keep secrets in a vault, load them at startup, and ignore .env before the first commit |
|
|
Risky Docker files |
Pin the image version, run as a non-root user, and exclude .env and .git |
|
|
Too many permissions |
Work as a standard user and keep permission prompts on |
Skip |
|
Changes nobody approved |
Watch files and configs after deploy and flag anything unexpected |
File integrity monitoring |
También puedes darle reglas permanentes al agente. Claude Code lee un archivo CLAUDE.md en tu proyecto, así que coloca tus directrices allí:
# CLAUDE.md
- Never put secrets, keys, or passwords in code. Read them from environment variables.
- Ask me before adding any new dependency, and tell me why it's needed.
- Never use the latest tag for Docker base images. Run containers as a non-root user.
El agente aún puede equivocarse, así que sigue revisando la diferencia. Las reglas solo reducen la frecuencia con la que debes detectar algo.
Cómo ayuda Netwrix
Netwrix Password Secure ofrece a tus credenciales un lugar donde vivir que no sea config.js. Es una bóveda cifrada con acceso basado en roles y un registro completo de quién usó qué contraseña, y las aplicaciones pueden obtener credenciales en tiempo de ejecución a través del SDK.
Netwrix Change Tracker supervisa contenedores, servidores y endpoints con monitoreo de integridad de archivos y compara cada cambio con lo aprobado. Por ejemplo, si un paquete edita un archivo del sistema a las 2 a. m. o un contenedor se desvía de su línea base. Change Tracker lo señala y tu equipo lo ve el mismo día.
Vea Netwrix Change Tracker en acción.
Más informaciónPreguntas frecuentes sobre seguridad de codificación Vibe
Compartir en
Aprende más
Acerca del autor
Dan Piazza
Gerente de Gestión de Producto
Dan Piazza es Gerente de Gestión de Producto en Netwrix, responsable de múltiples productos Endpoint, DSPM y Directory. Ha trabajado en roles técnicos desde 2013, con una pasión por la ciberseguridad, la protección de datos, la automatización y el código. Antes de su puesto actual, trabajó como Gerente de Producto e Ingeniero de Sistemas para una empresa de software de almacenamiento de datos, gestionando e implementando soluciones B2B tanto de software como de hardware.