ISO/IEC TS 17961 [syscall]

Описание

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

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

Реализация Polyspace

Это средство проверки проверяет на Небезопасный вызов системной функции.

Примеры

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

Проблема

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

  • Стандартный 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 - имеет нормативное значение.