exponenta event banner

MISRA C:2012 Правило 21.21

Функция «Стандартная библиотека» system из <stdlib.h> не должны использоваться

Описание

Определение правила

Функция «Стандартная библиотека» system из <stdlib.h> не должны использоваться.

Это правило основано на MISRA C ®: 2012 Поправка 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Функции -семейства не уязвимы для атак с помощью командной инъекции.

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

Группа: Стандартные библиотеки
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2021a