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