Mismatch between data length and size

Аргумент размера данных не вычисляется из фактической длины данных

Описание

Этот дефект возникает, когда вы не проверяете аргумент длины и аргумент буфера данных функций копирования памяти, таких как memcpy, memset, или memmove, для защиты от переполнения буфера.

Риск

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

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

Этот дефект похож на ошибку SSL Heartbleed.

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

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

Примеры

расширить все

#include <stdlib.h>
#include <string.h>

typedef struct buf_mem_st {
    char *data;
    size_t max;     /* size of buffer */
} BUF_MEM;

extern BUF_MEM beta;

int cpy_data(BUF_MEM *alpha)
{
    BUF_MEM *os = alpha;
    int num, length;

    if (alpha == 0x0) return 0;
    num = 0;

    length = *(unsigned short *)os->data;
    memcpy(&(beta.data[num]), os->data + 2, length);

    return(1);
}

Эта функция копирует буфер alpha в буферный beta. Однако length переменная не связана с data+2.

Коррекция - Проверяйте длину буфера

Одной из возможных коррекций является проверка длины вашего буфера на максимальное значение минус 2. Эта проверка гарантирует, что у вас есть достаточно пространство, чтобы скопировать данные в beta структура.

#include <stdlib.h>
#include <string.h>

typedef struct buf_mem_st {
    char *data;
    size_t max;     /* size of buffer */
} BUF_MEM;

extern BUF_MEM beta;

int cpy_data(BUF_MEM *alpha)
{
    BUF_MEM *os = alpha;
    int num, length;

    if (alpha == 0x0) return 0;
    num = 0;

    length = *(unsigned short *)os->data;
    if (length<(os->max -2)) {
        memcpy(&(beta.data[num]), os->data + 2, length); 
    }

    return(1);

}

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

Группа: Безопасность
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки: DATA_LENGTH_MISMATCH
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 130, 240
Введенный в R2015b