exponenta event banner

MISRA C:2012 Rule 21.21

Функция Standard Library system от <stdlib.h> не может использоваться

Описание

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

Функция Standard Library system от <stdlib.h> не должны использоваться.

Это правило получено от MISRA C®: 2012 2 о внесении изменений.

Объяснение

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

Реализация Polyspace

Шашечные флаги используют функцию Standard Library 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 function, the system функция передает свой аргумент в окружение хоста для выполнения процессором команд. Этот код уязвим для атаки с помощью command-injection.

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

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

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