Command executed from externally controlled path

Аргумент путь из небезопасного источника

Описание

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

Риск

Атакующий может:

  • Измените команду, которую выполняет программа, возможно, на команду, которой может управлять только атака.

  • Измените окружение, в которой выполняется команда, под которым атакующий управляет тем, что обозначает и делает команда.

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

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

Примеры

расширить все

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

enum {
    SIZE10  =  10,
    SIZE100 = 100,
    SIZE128 = 128
};

void bug_taintedpathcmd() {
    char cmd[SIZE128] = "";
    char* userpath = getenv("MYAPP_PATH");

    strncpy(cmd, userpath, SIZE100);
    strcat(cmd, "/ls *");
    /* Launching command */
    system(cmd); 
}

Этот пример получает путь от переменного окружения MYAPP_PATH. system запускает команду из этого пути, не проверяя значение пути. Если путь не является намеченным путем, ваша программа выполняется в неправильном местоположении.

Коррекция - использование доверенного пути

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

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

enum {
    SIZE10  =  10,
    SIZE100 = 100,
    SIZE128 = 128
};

/* Function to sanitize a string */
int sanitize_str(char* s, size_t n) {
    int res = 0;
    /* String is ok if */
    if (s && n>0 && n<SIZE128) {
        /* - string is not null                     */
        /* - string has a positive and limited size */
        s[n-1] = '\0';  /* Add a security \0 char at end of string */
        /* Tainted pointer detected above, used as "firewall" */
        res = 1;
    }
    return res;
}

/* Authorized path ids */
enum { PATH0=1, PATH1, PATH2 };

void taintedpathcmd() {
    char cmd[SIZE128] = "";

    char* userpathid = getenv("MYAPP_PATH_ID");
    if (sanitize_str(userpathid, SIZE100)) {
        int pathid = atoi(userpathid);


        char path[SIZE128] = "";
        switch(pathid) {
            case PATH0:
                strcpy(path, "/usr/local/my_app0");
                break;
            case PATH1:
                strcpy(path, "/usr/local/my_app1");
                break;
            case PATH2:
                strcpy(path, "/usr/local/my_app2");
                break;
            default:
                /* do nothing */
		break;
        }
        if (strlen(path)>0) {
            strncpy(cmd, path, SIZE100);
            strcat(cmd, "/ls *");
            system(cmd);    
        }
    }
}

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

Группа: испорченные данные
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки: TAINTED_PATH_CMD
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 114, 426
Введенный в R2015b