MISRA C:2012 Rule 21.21

Стандартная Библиотечная функция system из <stdlib.h> не буду использоваться

Описание

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

Стандартная Библиотечная функция system из <stdlib.h> не буду использоваться.

Это правило прибывает из MISRA C®: 2 012 Поправок 2.

Объяснение

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

Реализация Polyspace

Средство проверки отмечает использование Стандартной Библиотечной функции system.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

enum { 
SIZE512=512,
SIZE3=3};

void func_noncompliant(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) { //Noncompliant
    /* Handle error */
  }
} 

void func_compliant(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) { //Compliant
      /* Handle error */
    }
} 

В этом примере, в func_noncompliant функция, system функционируйте передает его аргумент серверной среде для командного процессора, чтобы выполниться. Этот код уязвим для нападения инжекции команды.

В совместимой версии той же функции, func_compliant, аргумент any_cmd санирован, и затем передан execve функция для выполнения. exec- функции семейства не уязвимы для инжекционных командой нападений.

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

Группа: стандартные библиотеки
Категория: необходимый
Категория AGC: необходимый
Введенный в R2021a