exponenta event banner

Несоответствие между длиной и размером данных

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

Описание

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

Риск

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

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

Этот дефект аналогичен ошибке SSL Heartbleed.

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

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

Примеры

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

#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++
По умолчанию: Откл.
Синтаксис командной строки: DATA_LENGTH_MISMATCH
Воздействие: среднее
CWE ID: 130, 240
Представлен в R2015b