Destination buffer overflow in string manipulation

Функция записывает в буфер со смещением, большим, чем buffer size

Описание

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

Например, при вызове функции sprintf(char* buffer, const char* format), вы используете постоянную строку format большего размера, чем buffer.

Риск

Переполнение буфера может привести к непредвиденному поведению, такому как повреждение памяти или остановка системы. Переполнение буфера также вводит риск инъекции кода.

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

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

  • Если вы используете sprintf для записи форматированных данных в строку используйте snprintf, _snprintf или sprintf_s вместо этого, чтобы применить управление длиной. Кроме того, используйте asprintf автоматическое выделение памяти, необходимой для целевого буфера.

  • Если вы используете vsprintf чтобы записать форматированные данные из списка аргументов переменной в строку, используйте vsnprintf или vsprintf_s вместо этого, чтобы применить управление длиной.

  • Если вы используете wcscpy для копирования широкой строки используйте wcsncpy, wcslcpy, или wcscpy_s вместо этого, чтобы применить управление длиной.

Другим возможным решением является увеличение buffer size.

Примеры

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

#include <stdio.h>

void func(void) {
    char buffer[20];
    char *fmt_string = "This is a very long string, it does not fit in the buffer";

    sprintf(buffer, fmt_string);
}

В этом примере buffer может содержать 20 char элементы, но fmt_string имеет больший размер.

Коррекция - Использование snprintf Вместо sprintf

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

#include <stdio.h>

void func(void) {
    char buffer[20];
    char *fmt_string = "This is a very long string, it does not fit in the buffer";

    snprintf(buffer, 20, fmt_string);
}

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

Группа: Статическая память
Язык: C | C++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: STRLIB_BUFFER_OVERFLOW
Влияние: Высокий
ИДЕНТИФИКАТОР CWE: 121, 125, 135, 251, 787
Введенный в R2015b