exponenta event banner

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

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

Описание

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

Риск

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

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

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

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

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

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

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

    Например, если используется 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 Байты

Одной из возможных корректировок является использование аргумента массива с размером, равным 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++
По умолчанию: Откл.
Синтаксис командной строки: PATH_BUFFER_OVERFLOW
Воздействие: Высокое
ИДЕНТИФИКАТОР CWE: 785
Представлен в R2015b