exponenta event banner

Выделение памяти с запятнанным размером

Аргумент размера функции памяти получен из небезопасного источника

Описание

Этот дефект возникает, когда функция выделения памяти, например, calloc или malloc, использует аргумент размера из небезопасного источника. Чтобы считать все входные данные вне текущего периметра анализа небезопасными, используйте -consider-analysis-perimeter-as-trust-boundary.

Риск

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

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

Перед выделением памяти проверьте значение аргументов, чтобы убедиться, что они не превышают границы.

Примеры

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

#include<stdio.h>
#include <stdlib.h>

int* bug_taintedmemoryallocsize(void) {
    size_t size;
    scanf("%zu", &size);
    int* p = (int*)malloc(size);
    return p;
}

В этом примере: malloc ассигнует size байты памяти указателя p. Переменная size поступает от пользователя программы. Его значение не проверяется и может превышать объем доступной памяти. Если size превышает количество доступных байтов, возможно сбой программы.

Исправление - Проверка размера выделяемой памяти

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

#include<stdio.h>
#include <stdlib.h>

enum {
    SIZE10  =  10,
    SIZE100 = 100,
    SIZE128 = 128
};

int* corrected_taintedmemoryallocsize(void) {
    size_t size;
    scanf("%zu", &size);
    int* p = NULL;
    if (size>0 && size<SIZE128) {          /* Fix: Check entry range before use */
        p = (int*)malloc((unsigned int)size);
    }
    return p;
}

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

Группа: Запятнанные данные
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: TAINTED_MEMORY_ALLOC_SIZE
Воздействие: среднее
CWE ID: 128, 131, 789
Представлен в R2015b