Memory allocation with tainted size

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

Описание

Этот дефект возникает, когда функция выделения памяти, такая как calloc или malloc, использует аргумент size из небезопасного источника. Чтобы считать все входы за пределами периметра анализа тока небезопасными, используйте -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
Влияние: Средний
ИДЕНТИФИКАТОР CWE : 128, 131, 789
Введенный в R2015b