In this article
Vibe-Coding einer Node.js-Datei-Upload-API führt zu Sicherheitslücke
Ach ja, Vibe-Coding – das göttliche Geschenk künstlicher Intelligenz an Softwareentwickler und Menschen ohne technischen Hintergrund. Sicherlich steigert es die Produktivität und verspricht Kosteneinsparungen sowie eine schnelle Bereitstellung von Anwendungen. Doch wie sehr können Sie darauf vertrauen, dass Large Language Models sicheren Code generieren?
Testen wir diese Theorie: Wir bitten eine aktuelle Version von ChatGPT mit einem modernen Foundation Model, für uns einen API-Endpunkt in Node.js zu erstellen, und prüfen, wie gut dabei sichere Programmierkonventionen eingehalten werden.
Vibe-Coding: Eine Node.js-Datei-Upload-API
Stellen Sie sich folgenden Anwendungsfall vor: Bei Ihrer Arbeit sollen Sie einen Datei-Upload-API-Endpunkt für Ihre Node.js-Anwendung erstellen, die auf dem Fastify-Webframework basiert.
Vielleicht haben Sie bisher noch nie mit der Dateiverarbeitung im Backend gearbeitet und wissen nicht genau, welche Webmechanismen ein Webserver verwenden sollte, um binäre Datenströme und Dateien zu verarbeiten.
Was ist ein mehrteiliger HTTP-Formularinhalt? Vielleicht wissen Sie nicht, nach welchen APIs Sie suchen, worüber Sie mehr erfahren oder wo Sie anfangen sollen. Fühlen Sie sich ein wenig festgefahren? Das ist nachvollziehbar.
Früher hätte man danach gegoogelt und wäre wahrscheinlich auf einer StackOverflow-Seite gelandet, um sich durch die Antworten zu arbeiten. Aber heute? Heute können wir generative KI nutzen, um die Frage zu beantworten und funktionierenden Code zu erhalten, der auf unsere spezifischen Anforderungen zugeschnitten ist.
Fragen wir ChatGPT.
Im folgenden Video sehen Sie, wie ich ChatGPT auffordere, einen POST-Endpunkt für Datei-Uploads zu implementieren, der als Fastify-Route unter /api/uploads verwendet werden soll:

ChatGPT startet eine Code-Canvas-Sitzung und beginnt, den benötigten Node.js-Code mit den passenden Komponenten zu generieren:
Import des Fastify-Pakets
Import des Fastify-Multipart-Hilfspakets für die Dateiverarbeitung
Import der zentralen Node.js-Module für die Verarbeitung von Dateisystem und Pfaden
Anschließend ergänzt ChatGPT die Anwendungslogik, um das @fastify/multipart-Plugin in Fastify zu registrieren und einen API-Endpunkt unter /api/uploads zu definieren. Diese Controller-Funktion übernimmt Dateidaten aus der Benutzereingabe, erstellt einen Pfad zum Speichern auf der Festplatte und streamt die Daten dorthin.
Hier sehen Sie den funktionierenden Code. Finden Sie die Sicherheitslücke?
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();
Von ChatGPT eingeführte Sicherheitslücke
Hoffentlich haben Sie die versteckte Sicherheitslücke im oben gezeigten server.js-Code entdeckt, den ChatGPT generiert hat. Sehen wir uns an, was in dieser anfälligen Datei-Upload-API-Route passiert.
Die Sicherheitslücke entsteht durch die Verarbeitung des Dateipfads im folgenden Endpunkt:
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 });
});Die Variable filePath wird gebildet, indem die Benutzereingabe für den Dateinamen (angegeben in data.filename) an uploadDir, das Stammverzeichnis, angehängt wird.
Was hindert einen Benutzer daran, die hochgeladene Datei ../../app.js statt something.zip zu nennen? Nichts. Angreifer können den Dateinamen nach Belieben manipulieren – etwa, um vertrauliche Anwendungs- oder Betriebssystemdateien zu überschreiben. Wenn die Prozessberechtigungen es zulassen, können sie das System lahmlegen oder Schlimmeres: Daten abgreifen und darauf eine Command-and-Control-Infrastruktur einrichten, um ihren Angriff weiter auszuweiten.
Mit Snyk KI-generierten Code absichern
Snyk ist es gleich, ob Ihr Code von ChatGPT, einem Claude-3.7-Sonnet-Modell, einer StackOverflow-Antwort oder einem Teammitglied stammt. Wird der Code in der IDE als anfällig erkannt, erkennt die Snyk-Erweiterung die Schwachstelle und warnt Sie.
So sieht das in der Praxis aus: Ich kopiere den von ChatGPT generierten Code für die Fastify-Datei-Upload-API in meine VS-Code-IDE. Sobald ich die Datei speichere, führt Snyk eine statische Sicherheitsanalyse durch und findet eine Path-Traversal-Schwachstelle:

Die Developer Experience von Snyk bietet ein vertrautes, unaufdringliches Erlebnis. Durch Syntaxhervorhebung – wie sie auch bei der statischen Codeanalyse (auch bekannt als Linters) zum Einsatz kommt – wird die Aufmerksamkeit der Entwickler auf die unsichere Codezeile gelenkt, die behoben werden muss.
Snyk Agent Fix
Snyk Agent AI Fix geht noch einen Schritt weiter und setzt die proprietäre Engine von Snyk ein, um Code ohne Sicherheitslücken zu generieren.
Sie müssen weder Sicherheitsexpertin oder Sicherheitsexperte sein noch Zeit damit verbringen, Dokumentationen zu Best Practices für Sicherheit zu lesen – auch wenn wir das sehr schätzen und empfehlen! Snyk weiß, dass Sie Ihre Zeit wahrscheinlich besser in Ihre Fachlogik und Ihre zentralen Engineering-Kompetenzen investieren. Deshalb automatisieren wir die Behebung von Sicherheitsproblemen im Code.
Hier sehen Sie Snyk DeepCore AI Fix in Aktion:

Die Snyk-IDE-Erweiterung ist kostenlos und scannt Code, Abhängigkeiten und Cloud-Konfigurationen. Sorgen Sie dafür, dass Ihr Code sicher ist. Ob Vibe-Coding oder nicht: Veröffentlichen Sie sicheren Code.
Sichern Sie Ihren Code während der Entwicklung
Snyk scannt Ihren Code auf Qualitäts- und Sicherheitsprobleme und gibt Ihnen direkt in Ihrer IDE Empfehlungen zur Behebung.