Проблема
Небезопасный вызов системной функции происходит, когда вы используете функцию, которая вызывает заданный реализацией командный процессор. Эти функции включают:
Риск
Если аргумент функции, которая вызывает командный процессор, не санирован, он может вызвать годные для использования уязвимости. Атакующий может выполнить произвольные команды или считать и изменить данные где угодно по системе.
Фиксация
Не используйте 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()
передает его аргумент серверной среде для командного процессора, чтобы выполниться. Этот код уязвим для нападения инжекции команды.
Коррекция — санирует аргумент и использует 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 */
}
}