Memory allocation with tainted size

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

Описание

Этот дефект происходит когда функция выделения памяти, такая как 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++
Значение по умолчанию: Off
Синтаксис командной строки: TAINTED_MEMORY_ALLOC_SIZE
Удар: Средняя
ID CWE: 128, 131, 789
Введенный в R2015b