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