Несколько способов предотвратить переполнение буфера обмена при работе с большими объёмами данных:
- Использовать интерпретируемый язык программирования, который не подвержен проблемам переполнения буфера. proglib.io
- Избегать использования функций, которые не выполняют проверку буфера. proglib.io Например, в C вместо функции gets() использовать функцию fgets(). proglib.io
- Применять компиляторы, которые помогают определить небезопасные функции или найти ошибки. proglib.io
- Использовать canaries. proglib.io Они вставляются перед обратным адресом в стеке и проверяются перед обращением к нему. proglib.io Если программа обнаружит изменение значения canary, она прервёт процесс. proglib.io
- Переставлять локальные переменные так, чтобы скалярные (отдельные объекты данных фиксированного размера) были выше переменных массива, содержащих несколько значений. proglib.io Это означает, что если переменные массива переполняются, они не будут влиять на скалярные переменные. proglib.io
- Использовать неисполнимый буфер. naupri.ru В стеке и сегментах данных запрещается исполнение кода, происходит только запись и чтение. naupri.ru
- Использовать ASLR (рандомизацию расположения адресного пространства). developer.apple.com proglib.io Это означает, что всякий раз, когда файл библиотеки или другая функция вызывается запущенным процессом, её адрес сдвигается на случайное число. proglib.io
- Использовать различные защитные утилиты, такие как PointGuard, StackGuard, StackShield и другие. naupri.ru
Также рекомендуется заполнять нулями все буферы перед использованием. spec-zone.ru Буфер, содержащий только нули, не может содержать устаревшую уязвимую информацию. spec-zone.ru