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 оператор для запуска предопределенной команды с использованием входа в качестве переменной 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
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 77, 78, 88, 114
Введенный в R2015b