Команда выполняется от внешне управляемого пути

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

Описание

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

Риск

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

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

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

Фиксация

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

Примеры

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

#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
Влияние: носитель
ID CWE: 114, 426

Введенный в R2015b