ПроблемаЭта проблема возникает, когда ваш код использует стандартные функции, которые записывают данные в буфер таким образом, который может привести к переполнению буфера.
В следующей таблице перечислены опасные стандартные функции, риски использования каждой функции и какие функции использовать вместо этого. Флажки шашки:
Любое использование по своей сути опасной функции.
Использование возможно опасной функции только в том случае, если размер буфера, в который записываются данные, может быть определено во время компиляции. Шашка не помечает использование такой функции динамически выделенным буфером.
Опасная функция | Уровень риска | Более безопасная функция |
---|
gets | По своей сути опасно - Вы не можете контролировать длину входов с консоли. | fgets |
cin | По своей сути опасно - Вы не можете контролировать длину входов с консоли. | Избегайте или предварительные вызовы cin с cin.width . |
strcpy | Возможно, опасно - если длина источника больше, чем адрес назначения, может произойти переполнение буфера. | strncpy |
stpcpy | Возможно, опасно - если длина источника больше, чем адрес назначения, может произойти переполнение буфера. | stpncpy |
lstrcpy или StrCpy | Возможно, опасно - если длина источника больше, чем адрес назначения, может произойти переполнение буфера. | StringCbCopy , StringCchCopy , strncpy , strcpy_s , или strlcpy |
strcat | Возможно, опасно - если результат конкатенирования больше, чем адрес назначения, может произойти переполнение буфера. | strncat , strlcat , или strcat_s |
lstrcat или StrCat | Возможно, опасно - если результат конкатенирования больше, чем адрес назначения, может произойти переполнение буфера. | StringCbCat , StringCchCat , strncay , strcat_s , или strlcat |
wcpcpy | Возможно, опасно - если длина источника больше, чем адрес назначения, может произойти переполнение буфера. | wcpncpy |
wcscat | Возможно, опасно - если результат конкатенирования больше, чем адрес назначения, может произойти переполнение буфера. | wcsncat , wcslcat , или wcncat_s |
wcscpy | Возможно, опасно - если длина источника больше, чем адрес назначения, может произойти переполнение буфера. | wcsncpy |
sprintf | Возможно, опасно - если выходная длина зависит от неизвестных длин или значений, может произойти переполнение буфера. | snprintf |
vsprintf | Возможно, опасно - если выходная длина зависит от неизвестных длин или значений, может произойти переполнение буфера. | vsnprintf |
РискЭти функции могут вызвать переполнение буфера, которое злоумышленники могут использовать, чтобы проникнуть в вашу программу.
Пример - Использование sprintf
#include <stdio.h>
#include <string.h>
#include <iostream>
#define BUFF_SIZE 128
int dangerous_func(char *str)
{
char dst[BUFF_SIZE];
int r = 0;
if (sprintf(dst, "%s", str) == 1)
{
r += 1;
dst[BUFF_SIZE-1] = '\0';
}
return r;
}
Эта функция , взятая в качестве примера, использует sprintf
чтобы скопировать строку str
на dst
. Однако, если str
больше буфера, sprintf
может вызвать переполнение буфера.
Коррекция - Использование snprintf
с Buffer sizeОдной из возможных коррекций является использование snprintf
вместо этого задайте buffer size.
#include <stdio.h>
#include <string.h>
#include <iostream>
#define BUFF_SIZE 128
int dangerous_func(char *str)
{
char dst[BUFF_SIZE];
int r = 0;
if (snprintf(dst, sizeof(dst), "%s", str) == 1)
{
r += 1;
dst[BUFF_SIZE-1] = '\0';
}
return r;
}