ПроблемаЭта проблема возникает, когда ваш код использует стандартные функции, которые записывают данные в буфер таким образом, который может привести к переполнению буфера.
В следующей таблице перечислены опасные стандартные функции, риски использования каждой функции и какие функции использовать вместо этого. Флажки шашки:
Любое использование по своей сути опасной функции.
Использование возможно опасной функции только в том случае, если размер буфера, в который записываются данные, может быть определено во время компиляции. Шашка не помечает использование такой функции динамически выделенным буфером.
| Опасная функция | Уровень риска | Более безопасная функция |
|---|
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;
}