Use of path manipulation function without maximum sized buffer checking

Буфер назначения getwd или realpath меньше PATH_MAX байты

Описание

Этот дефект возникает, когда целевой аргумент функции манипуляции путем, такой как realpath или getwd имеет buffer size меньше PATH_MAX байты.

Риск

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

Для образца, char *getwd(char *buf) копирует абсолютный путь к имени текущей папки в ее аргумент. Если длина абсолютного имени пути больше PATH_MAX байты, getwd возвращает NULL и содержимое *buf не определено. Можно проверить возврат значение getwd для NULL чтобы увидеть, был ли вызов функции успешным.

Однако, если разрешенный буфер для buf меньше PATH_MAX bytes, отказ может произойти для меньшего абсолютного имени пути. В этом случае getwd не возвращается NULL даже если произошел отказ. Поэтому допустимый буфер для buf должен быть PATH_MAX bytes long.

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

Возможные исправления:

  • Используйте buffer size PATH_MAX байты. Если вы получаете буфер из неизвестного источника, прежде чем использовать буфер в качестве аргумента getwd или realpath function, убедитесь, что размер меньше PATH_MAX байты.

  • Используйте функцию манипуляции путем, которая позволяет вам задать buffer size.

    Например, если вы используете getwd чтобы получить абсолютное имя пути к текущей папке, используйте char *getcwd(char *buf, size_t size); вместо этого. Дополнительный аргумент size позволяет вам задать размер, больший или равный PATH_MAX.

  • Разрешить функции динамически выделять дополнительную память, если это возможно.

    Для образца, char *realpath(const char *path, char *resolved_path); динамически выделяет память, если resolved_path является NULL. Тем не менее, вы должны отселить эту память позже, используя free функция.

Примеры

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

#include <unistd.h>
#include <linux/limits.h>
#include <stdio.h>

void func(void) {
    char buf[PATH_MAX];
    if (getwd(buf+1)!= NULL)         {
        printf("cwd is %s\n", buf);
    }
}

В этом примере, хотя и buf массива имеет PATH_MAX bytes, аргумент getwd является buf + 1, чей разрешенный буфер меньше PATH_MAX байты.

Коррекция - Используйте массив размера PATH_MAX Байты

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

#include <unistd.h>
#include <linux/limits.h>
#include <stdio.h>

void func(void) {
    char buf[PATH_MAX];
    if (getwd(buf)!= NULL)         {
        printf("cwd is %s\n", buf);
    }
}

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

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