exponenta event banner

Выполнение команды внешнего управления

Аргумент команды из небезопасного источника, уязвимого для ввода команд операционной системой

Описание

Этот дефект возникает, когда команды полностью или частично создаются на основе внешнего ввода. Чтобы считать все входные данные вне текущего периметра анализа небезопасными, используйте -consider-analysis-perimeter-as-trust-boundary.

Риск

Злоумышленники могут использовать внешние входные данные в качестве команд операционной системы или аргументов приложения. Злоумышленник может прочитать или изменить конфиденциальные данные, а также выполнить непреднамеренный код или получить доступ к другим аспектам программы.

Зафиксировать

Проверьте входные данные, чтобы разрешить только предполагаемые входные значения. Например, создайте белый список приемлемых входных данных и сравните входные данные с этим списком.

Примеры

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

#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "unistd.h"
#include "dlfcn.h"
#include "limits.h"
#define MAX 128


void taintedexternalcmd(void)
{
	char* usercmd;
	fgets(usercmd,MAX,stdin);
	char cmd[MAX] = "/usr/bin/cat ";
	strcat(cmd, usercmd);
	system(cmd); 
}

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

Исправление - использование предопределенной команды

Одной из возможных корректировок является использование switch для выполнения предопределенной команды с использованием пользовательского ввода в качестве переменной переключения.

#define _XOPEN_SOURCE
#define _GNU_SOURCE

#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "unistd.h"
#include "dlfcn.h"
#include "limits.h"

enum {
    SIZE10  =  10,
    SIZE100 = 100,
    SIZE128 = 128
};
enum { CMD0 = 1, CMD1, CMD2 };

void taintedexternalcmd(void)
{
    int usercmd = strtol(getenv("cmd"),NULL,10);
    char cmd[SIZE128] = "/usr/bin/cat ";

    switch(usercmd) {
        case CMD0:
            strcat(cmd, "*.c");
            break;
        case CMD1:
            strcat(cmd, "*.h");
            break;
        case CMD2:
            strcat(cmd, "*.cpp");
            break;
        default:
            strcat(cmd, "*.c");
    }
    system(cmd); 
}

Информация о результатах

Группа: Запятнанные данные
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: TAINTED_EXTERNAL_CMD
Воздействие: среднее
CWE ID: 77, 78, 88, 114
Представлен в R2015b