Небезопасный вызов системной функции

Несанированный аргумент команды имеет годные для использования уязвимости

Описание

Небезопасный вызов системной функции происходит, когда вы используете функцию, которая вызывает заданный реализацией командный процессор. Эти функции включают:

  • Стандартная функция system() C.

  • POSIX функция popen().

  • Windows® _popen() и функции _wpopen().

Риск

Если аргумент функции, которая вызывает командный процессор, не санирован, он может вызвать годные для использования уязвимости. Атакующий может выполнить произвольные команды или считать и изменить данные где угодно по системе.

Фиксация

Не используйте system - функция семейства, чтобы вызвать командный процессор. Вместо этого используйте более безопасные функции, такие как POSIX execve() и WinAPI CreateProcess().

Примеры

развернуть все

# 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 */
  }
} 

Информация о результате

Группа: безопасность
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: UNSAFE_SYSTEM_CALL
Влияние: высоко
ID CWE: 78, 88

Введенный в R2017b