Проблема
Небезопасный вызов системной функции происходит, когда вы используете функцию, которая вызывает определяемый реализацией командный процессор. Эти функции включают:
Стандартные system()
C
функция.
Система POSIX popen()
функция.
Windows®
_popen()
и _wpopen()
функций.
РискЕсли аргумент функции, которая вызывает процессор команды, не санируется, это может вызвать эксплуатируемые уязвимости. Атакующий может выполнить произвольные команды или считать и изменять данные в любом месте системы.
ЗафиксироватьНе используйте system
- функция семейства для вызова процессора команды. Вместо этого используйте более безопасные функции, такие как POSIX execve()
и WinAPI CreateProcess()
.
Пример - system()
Названный# include <string.h>
# include <stdlib.h>
# include <stdio.h>
# include <unistd.h>
enum {
SIZE512=512,
SIZE3=3};
void func(char *arg)
{
char buf[SIZE512];
int retval=sprintf(buf, "/usr/bin/any_cmd %s", arg);
if (retval<=0 || retval>SIZE512){
/* Handle error */
abort();
}
/* Use of system() to pass any_cmd with
unsanitized argument to command processor */
if (system(buf) == -1) {
/* Handle error */
}
}
В этом примере system()
передает его аргумент в окружение хоста для выполнения процессором команд. Этот код уязвим для атаки с помощью command-injection.
Коррекция - Санирование аргументов и использование execve()
В следующем коде аргумент any_cmd
санирован, а затем передан в execve()
для выполнения. exec
-семейные функции не уязвимы к атакам инъекций команд.
# include <string.h>
# include <stdlib.h>
# include <stdio.h>
# include <unistd.h>
enum {
SIZE512=512,
SIZE3=3};
void func(char *arg)
{
char *const args[SIZE3] = {"any_cmd", arg, NULL};
char *const env[] = {NULL};
/* Sanitize argument */
/* Use execve() to execute any_cmd. */
if (execve("/usr/bin/time", args, env) == -1) {
/* Handle error */
}
}