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() передает его аргумент в окружение хоста для выполнения процессором команд. Этот код уязвим для атаки с помощью 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 */
  }
} 

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

Решимость: Undecidable
Введенный в R2019a

[1] Выдержки из стандарта «Техническая спецификация ISO/IEC TS 17961 - 2013-11-15» воспроизводятся с согласия АФНОР. Только оригинальный и полный текст стандарта, опубликованный AFNOR Editions - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.