Переполнение буфера происходит, когда программа записывает больше данных в буфер, чем он может вместить. Это может привести к перезаписи соседних данных в памяти, что может быть использовано злоумышленниками для выполнения произвольного кода.
Пример уязвимого кода на C
Вот пример кода, который уязвим к переполнению буфера:
C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <stdio.h> #include <string.h> void vulnerable_function(char *input) { char buffer[50]; strcpy(buffer, input); // Уязвимость: нет проверки длины printf("Buffer content: %s\n", buffer); } int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s <input>\n", argv[0]); return 1; } vulnerable_function(argv[1]); return 0; } |
Защита от переполнения буфера
- Используйте безопасные функции: Вместо
strcpy
используйтеstrncpy
, чтобы ограничить количество копируемых байтов. - Проверка длины входных данных: Убедитесь, что входные данные не превышают размер буфера.
- Используйте компилятор с защитой: Включите защиту от переполнения буфера, например, с помощью флагов компилятора, таких как
-fstack-protector
. - Используйте современные языки программирования: Рассмотрите возможность использования языков, которые управляют памятью автоматически, таких как Python или Java.