Целевое переполнение буфера в обработке строк

Функция пишет, чтобы буферизовать при смещении, больше, чем 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++
Значение по умолчанию: на
Синтаксис командной строки: STRLIB_BUFFER_OVERFLOW
Влияние: высоко
ID CWE: 121, 125, 135, 251, 787

Введенный в R2015b