ISO/IEC TS 17961 [syscall]

Описание

Управляйте определением

Вызов системы. [1]

Примеры

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

Описание

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

  • Стандартная функция 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() передает свой аргумент серверной среде для командного процессора, чтобы выполниться. Этот код уязвим для нападения инжекции команды.

Исправление — санирует аргумент и использует 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 */
  }
} 

Проверяйте информацию

Разрешимость: неразрешимый

Введенный в R2019a


[1]  Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.