In this article
Programar con vibe una API de carga de archivos en Node.js genera una vulnerabilidad de seguridad
Ah, sí: programar con vibe, el regalo divino de la inteligencia artificial para los desarrolladores de software y para quienes no tienen formación en ingeniería. Sin duda, promete multiplicar la productividad, reducir costos y acelerar la entrega de aplicaciones. Pero ¿cuánto puedes confiar en que los modelos de lenguaje grandes generen código seguro?
Pongamos a prueba esta teoría. Le pediremos a una versión actual de ChatGPT, con un modelo base actualizado, que cree un endpoint de API en Node.js y veremos qué tal sigue las convenciones de programación segura.
Programar con vibe una API de carga de archivos en Node.js
Imagina este caso: en el trabajo te asignan crear un endpoint de API para cargar archivos en una aplicación de Node.js que usa el framework web Fastify.
Es muy posible que nunca hayas trabajado con el procesamiento de archivos en el backend y no tengas del todo claro cuáles son los mecanismos web adecuados para que un servidor web maneje archivos mediante flujos de datos binarios.
¿Qué es un formulario HTTP multiparte? Tal vez no tengas claro qué API buscar, qué aprender o por dónde empezar. ¿Te sientes un poco perdido? Es comprensible.
Antes, habrías buscado en Google y probablemente habrías terminado en una página de StackOverflow, leyendo las respuestas. Pero ¿y ahora? Ahora podemos usar IA generativa para responder la pregunta y proporcionar código funcional según nuestros requisitos específicos.
Preguntémosle a ChatGPT.
En el siguiente video, puedes ver cómo le pido a ChatGPT que implemente un endpoint POST para cargar archivos, que se usará como ruta de Fastify en /api/uploads:

ChatGPT inicia una sesión de lienzo de código y empieza a generar el código necesario de Node.js, incorporando los componentes adecuados:
Importa el paquete Fastify
Importa el paquete auxiliar Fastify Multipart para procesar archivos
Importa los módulos principales de Node.js para gestionar el sistema de archivos y las rutas
Luego, continúa con la lógica de la aplicación para registrar el plugin @fastify/multipart en Fastify y definir un endpoint de API /api/uploads. Esta función controladora toma los datos del archivo proporcionados por el usuario, crea una ruta para guardarlo en el disco y transmite los datos a esa ubicación.
Este es el código funcional. ¿Puedes detectar la vulnerabilidad de seguridad?
import fastify from 'fastify';
import multipart from '@fastify/multipart';
import fs from 'fs';
import path from 'path';
const fastify = Fastify({ logger: true });
// Register multipart plugin
fastify.register(multipart);
// Ensure the uploads directory exists
const uploadDir = path.join(process.cwd(), 'uploads');
if (!fs.existsSync(uploadDir)) {
fs.mkdirSync(uploadDir);
}
fastify.post('/api/uploads', async (req, reply) => {
const data = await req.file();
if (!data) {
return reply.status(400).send({ error: 'No file uploaded' });
}
const filePath = path.join(uploadDir, data.filename);
const writeStream = fs.createWriteStream(filePath);
await data.file.pipe(writeStream);
return reply.send({ message: 'File uploaded successfully', filename: data.filename });
});
const start = async () => {
try {
await fastify.listen({ port: 3000 });
console.log('Server running on http://localhost:3000');
} catch (err) {
fastify.log.error(err);
process.exit(1);
}
};
start();
Vulnerabilidad de seguridad introducida por ChatGPT
Ojalá hayas detectado la sutil vulnerabilidad de seguridad en el código server.js anterior generado por ChatGPT. Veamos qué sucede en esta ruta vulnerable de la API para cargar archivos.
La vulnerabilidad de seguridad se debe a la forma en que se maneja la ruta del archivo en el siguiente endpoint:
fastify.post('/api/uploads', async (req, reply) => {
const data = await req.file();
if (!data) {
return reply.status(400).send({ error: 'No file uploaded' });
}
const filePath = path.join(uploadDir, data.filename);
const writeStream = fs.createWriteStream(filePath);
await data.file.pipe(writeStream);
return reply.send({ message: 'File uploaded successfully', filename: data.filename });
});La variable filePath se genera al concatenar el nombre de archivo ingresado por el usuario (especificado en data.filename) con uploadDir, que es el directorio raíz límite.
¿Qué impide que un usuario asigne al archivo que sube el nombre ../../app.js en vez de something.zip? Nada. Los atacantes pueden manipular el nombre del archivo como quieran, ya sea para sobrescribir archivos confidenciales de la aplicación o del sistema operativo. Si los permisos del proceso lo permiten, podrían dejar el sistema fuera de servicio o, peor aún, robar datos y establecer un canal de comando y control para intensificar el ataque.
Protege el código generado por IA con Snyk
A Snyk no le importa si tu código viene de ChatGPT, de un modelo Claude 3.7 Sonnet, de una página de respuestas de StackOverflow o de un compañero de equipo. Si el código en el IDE tiene una vulnerabilidad, la extensión de Snyk la detectará y te avisará.
Así funciona: copio y pego en mi IDE de VS Code el código que generó ChatGPT para la API de carga de archivos de Fastify y, en cuanto guardo el archivo, Snyk ejecuta un análisis estático de seguridad y detecta una vulnerabilidad de recorrido de rutas:

La experiencia para desarrolladores de Snyk es sutil y familiar. Usa resaltado de sintaxis, como el que se utiliza en el análisis estático de código (también conocido como linters), para llamar la atención del desarrollador sobre la línea de código insegura que debe corregir.
Snyk Agent Fix
Snyk Agent AI Fix va un paso más allá y aplica el motor propietario de Snyk para generar código sin vulnerabilidades de seguridad.
No necesitas ser experto en seguridad ni dedicar tiempo a leer la documentación sobre las prácticas recomendadas de seguridad, aunque lo valoramos mucho y te lo recomendamos. Snyk entiende que probablemente te convenga dedicar ese tiempo a la lógica de tu dominio y a tus habilidades esenciales de ingeniería, así que automatiza la corrección de la seguridad del código.
Así funciona la magia de Snyk DeepCore AI Fix:

La extensión de Snyk para IDE es gratis para comenzar y analiza el código, las dependencias y la configuración de la nube. No dejes tu código desprotegido. Con vibe coding o sin él, publica código seguro.
Protege tu código mientras desarrollas
Snyk analiza tu código para detectar problemas de calidad y seguridad, y te ofrece recomendaciones para corregirlos directamente en tu IDE.