Стеки уязвимы для атак с переполнением буфера из-за особенностей их структуры и работы. 12
Стек содержит последовательность вложенных функций, каждая из которых возвращает адрес вызывающей функции, к которому стек должен вернуться после завершения выполнения функции. 24 Этот обратный адрес может быть заменён инструкцией для выполнения фрагмента вредоносного кода. 24
Переполнение буфера происходит, когда размер информации, записанной в ячейку памяти, превышает тот, который был выделен. 2 Если пользователь вводит больше данных, чем количество, присвоенное переменной, введённая строка перезапишет следующие ячейки памяти в стеке вызовов. 24
Ещё одна причина уязвимости — отсутствие проверки границ во многих функциях управления памятью, особенно в языках C и C++. 4 Например, в языке C нет средств контроля соответствия типов, поэтому в переменную одного типа можно занести значение другого типа. 15
Реакция на переполнение буфера может быть непредсказуемой, начиная от программных сбоев и заканчивая выполнением вредоносного кода. 24