Execution of externally controlled command

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

Описание

Этот дефект происходит, когда команды полностью или частично создаются из внешне управляемого входа. Чтобы рассмотреть весь вход снаружи текущего аналитического периметра как небезопасный, используйте -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++
Значение по умолчанию: Off
Синтаксис командной строки: TAINTED_EXTERNAL_CMD
Удар: Средняя
ID CWE: 77, 78, 88, 114
Введенный в R2015b