Execution of externally controlled command

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

Описание

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

Риск

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

Фиксация

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

Примеры

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

#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
};

void taintedexternalcmd(char* usercmd)
{
    char cmd[SIZE128] = "/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(int usercmd)
{
    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