flawopen.com/command-injection/C-cpp
Learn how to fix Command Injection (CWE-78) in C and C++. Side-by-side vulnerable vs secure code examples for posix_spawn(), execvp(), and system() shell hazards.
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.
Web Application SecurityCWE-918 betroffen ist.CWE-918Defense-in-DepthDie Anwendung akzeptiert Hostnamen, Dateinamen oder Diagnoseparameter direkt aus einer HTTP-Anfrage.
Das Backend erstellt den Shell-Befehlsstring durch einfache Zeichenfolgenverkettung statt über ein isoliertes Argumenten-Array.
Der Angreifer fügt Shell-Metazeichen wie ';', '&&', '|' oder Backticks ein (z. B. '127.0.0.1; id'), um den Befehlskontext zu verlassen.
Die Shell des Betriebssystems führt den angehängten Schadcode mit den Rechten des Webserverprozesses aus.
// system() invokes /bin/sh with sprintf buffer
#include <stdlib.h>
#include <stdio.h>
void ping_host(const char *user_input) {
char buffer[256];
// Attacker input: "127.0.0.1; reboot"
snprintf(buffer, sizeof(buffer), "ping -c 1 %s", user_input);
system(buffer);
}
// fork() and execvp() execute binary directly without a shell
#include <unistd.h>
#include <sys/wait.h>
void ping_host(const char *user_input) {
pid_t pid = fork();
if (pid == 0) {
// Child process: arguments are discrete pointers
char *args[] = {"ping", "-c", "1", (char *)user_input, NULL};
execvp("ping", args);
_exit(1);
} else {
waitpid(pid, NULL, 0);
}
}
system() and popen() with fork() and execvp().