Command executed from externally controlled path

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

Описание

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

Риск

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

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

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

Фиксация

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

Примеры

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

#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система запускает команду от того пути, не проверяя значение пути. Если путь не является намеченным путем, ваша программа выполняется в неправильном месте.

Коррекция — использует доверяемый путь

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

#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