In this article
Criar uma API de upload de arquivos para Node.js com vibe coding gera vulnerabilidade de segurança
Ah, sim, Vibe Coding: o presente divino da inteligência artificial para desenvolvedores de software e pessoas sem formação em engenharia. É claro que isso pode multiplicar a produtividade e reduzir custos, além de acelerar a entrega de aplicações. Mas até que ponto você pode confiar nos grandes modelos de linguagem para gerar código seguro?
Vamos testar essa teoria. Pediremos a uma versão atual do ChatGPT, baseada em um modelo de ponta, que crie um endpoint de API em Node.js e veremos como ela se sai com relação às boas práticas de codificação segura.
API de upload de arquivos para Node.js com vibe coding
Imagine o seguinte cenário: no trabalho, você precisa criar um endpoint de API para upload de arquivos na sua aplicação Node.js, que usa o framework web Fastify.
É bem possível que você nunca tenha trabalhado com processamento de arquivos no back-end e não saiba ao certo quais mecanismos da web usar para que um servidor processe fluxos de dados binários e arquivos.
O que é um formulário HTTP multipart? Talvez você não saiba quais APIs pesquisar, onde aprender sobre elas ou por onde começar. Está meio perdido? Acontece.
Antigamente, você pesquisaria isso no Google e provavelmente acabaria em uma página do StackOverflow, lendo as respostas. Mas hoje? Hoje, podemos usar IA generativa para responder à pergunta e fornecer código funcional de acordo com nossos requisitos.
Vamos perguntar ao ChatGPT.
No vídeo a seguir, você pode me ver pedindo ao ChatGPT que implemente um endpoint POST para upload de arquivos, usado como uma rota do Fastify em /api/uploads:

O ChatGPT abre uma sessão de tela de código e começa a gerar o código necessário em Node.js, incluindo os componentes certos:
Importação do pacote Fastify
Importação do pacote Fastify Multipart, que auxilia no processamento de arquivos
Importação dos módulos principais do Node.js para manipular o sistema de arquivos e os caminhos
Em seguida, ele continua com a lógica da aplicação para registrar o plugin @fastify/multipart no Fastify e definir um endpoint de API /api/uploads. Essa função controladora recebe os dados do arquivo enviados pelo usuário, cria um caminho para salvá-lo no disco e transmite os dados para esse destino.
Aqui está o código funcional. Você consegue encontrar a vulnerabilidade de segurança?
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();
Vulnerabilidade de segurança introduzida pelo ChatGPT
Tomara que você tenha percebido a vulnerabilidade de segurança sorrateira no código server.js acima, gerado pelo ChatGPT. Vamos explicar o que acontece nessa rota vulnerável de API para upload de arquivos.
A vulnerabilidade de segurança está na forma como o caminho do arquivo é tratado no endpoint a seguir:
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 });
});A variável filePath é gerada pela concatenação do nome de arquivo informado pelo usuário (especificado em data.filename) com uploadDir, que é o diretório raiz de destino.
O que impede um usuário de chamar o arquivo enviado de ../../app.js em vez de something.zip? Nada. Agentes mal-intencionados podem manipular o nome do arquivo como quiserem, seja para sobrescrever arquivos confidenciais da aplicação ou do sistema operacional. Se as permissões do processo permitirem, eles podem derrubar o sistema ou, pior ainda, coletar dados e estabelecer um canal de comando e controle para ampliar o ataque.
Proteja o código gerado por IA com o Snyk
Para o Snyk, não importa se o seu código veio do ChatGPT, de um modelo Claude 3.7 Sonnet, de uma resposta no StackOverflow ou de um colega de equipe. Se o código no IDE tiver uma vulnerabilidade, a extensão do Snyk vai detectá-la e alertar você.
Veja como funciona. Copio e colo no VS Code o código gerado pelo ChatGPT para a API de upload de arquivos do Fastify e, assim que salvo o arquivo, o Snyk executa uma análise estática de segurança e encontra uma vulnerabilidade de traversal de caminho:

A experiência de desenvolvimento do Snyk é familiar e discreta. Ela usa realce de sintaxe, como o usado por ferramentas de análise estática de código (também conhecidas como linters), para chamar a atenção do desenvolvedor para a linha de código insegura que precisa ser corrigida.
Snyk Agent Fix
O Snyk Agent AI Fix vai além: usa o mecanismo proprietário do Snyk para gerar código sem vulnerabilidades de segurança.
Você não precisa ser especialista em segurança nem perder tempo consultando a documentação sobre boas práticas de segurança, embora recomendemos muito que faça isso! O Snyk entende que você provavelmente aproveita melhor o tempo trabalhando na lógica do seu domínio e nas principais competências de engenharia. Por isso, automatizamos a correção de segurança do código.
Veja a mágica do Snyk DeepCore AI Fix em ação:

A extensão do Snyk para IDE é gratuita para começar e analisa código, dependências e configurações de nuvem. Não deixe de proteger seu código. Com vibe coding ou sem, entregue código seguro.
Proteja seu código enquanto desenvolve
O Snyk analisa seu código em busca de problemas de qualidade e segurança e recomenda correções direto no seu IDE.