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.
Представьте, что вы просите офисного ассистента распечатать документ 'отчет.pdf'. Инъекция команд происходит, когда кто-то указывает имя 'отчет.pdf; whoami', и ассистент слепо передает всю записку терминалу, заставляя его напечатать отчет и прочесть бейдж администратора.
Web Application SecurityCWE-918.CWE-918CWE-918): Standard Common Weakness Enumeration classification for command-injection-c-cpp.Defense-in-DepthПриложение принимает диагностические имена хостов, имена файлов или флаги напрямую из HTTP-запроса пользователя.
Бэкенд формирует строку команды оболочки с помощью склеивания строк вместо использования вектора разделенных аргументов.
Злоумышленник внедряет метасимволы оболочки, такие как ';', '&&', '|' или обратные кавычки (например, '127.0.0.1; id').
Командная оболочка ОС выполняет внедренную команду с привилегиями рабочего процесса веб-сервера.
// 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().