Использование манипуляции с путями функционирует без максимальной размерной буферной проверки

Целевой буфер 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, отказ может произойти для меньшего абсолютного пути. В этом случае getwd не возвращает NULL даже при том, что отказ произошел. Поэтому позволенный буфер для buf должен быть байтами PATH_MAX долго.

Фиксация

Возможные меры:

  • Используйте buffer size байтов PATH_MAX. Если вы получаете буфер из неизвестного источника, перед использованием буфера в качестве аргумента getwd или функции realpath, убедитесь, что размер является меньше, чем байты 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, аргументом getwd является buf + 1, чей позволенный буфер меньше, чем байты PATH_MAX.

Исправление — массив использования размера байты PATH_MAX

Одно возможное исправление должно использовать аргумент Array с размером, равным байтам 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
Влияние: высоко
ID CWE: 785

Введенный в R2015b