exponenta event banner

Команда, выполняемая по внешнему управляемому тракту

Аргумент 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++
По умолчанию: Откл.
Синтаксис командной строки: TAINTED_PATH_CMD
Воздействие: среднее
CWE ID: 114, 426
Представлен в R2015b