Какие аппаратные или программные решения можно использовать для предотвращения переполнения стека? - PullRequest
2 голосов
/ 22 марта 2011

Что такое аппаратное решение для предотвращения переполнения стека?Например, когда мы хотим разработать новую операционную систему, как мы можем предотвратить переполнение стека?

Спасибо

Ответы [ 4 ]

4 голосов
/ 23 марта 2011

Если статически можно подтвердить, что код не имеет прямой или косвенной рекурсии, статический анализ может привести к использованию стека в худшем случае.Убедитесь, что стек достаточно большой и не будет переполнения стека.Самая большая трудность заключается в том, что может быть трудно определить, какие функции могут вызываться указателями каких функций.Например, если один указатель функции может указывать на foo1 () или foo2 (), другой может указывать на bar1 () или bar2 (), а foo1 () вызывает второй указатель функции (таким образом, достигая bar1 или bar2), не будетвозможность рекурсии, но если компилятор не может определить, что второй указатель может указывать только на bar1 () или bar2 (), он может не знать об этом.

Если приложение может быть определено как нерекурсивноеи если граф вызовов наихудшего случая статического анализа не намного хуже, чем то, что на самом деле может произойти, возможно, удастся полностью избежать стека и статически распределить все переменные.В некоторых случаях (особенно на архитектурах без эффективной индексации) этот подход может существенно повысить производительность по сравнению с использованием стека.

С точки зрения безопасности, хорошим средством предотвращения эксплойтов с переполнением стека / буфера является предотвращение сохранения реальной программы.-счетчик адресов в любом месте, к которому могут обращаться «нормальные» указатели.Храните стек счетчиков программ отдельно от стека параметров / авто-переменных и не храните указатели на функции напрямую.Вместо этого пусть каждый «указатель на функцию» будет индексом в таблице функций, имеющих одинаковую сигнатуру, и проверьте индекс, чтобы убедиться, что он находится в диапазоне перед его использованием;если две или более группы функций имеют разные последствия для безопасности и должны вызываться совершенно разными указателями, при необходимости измените сигнатуру одной группы, чтобы она отличалась от другой (поэтому вызовы функции в первой группе не могут бытьпреобразуется в вызов функции во втором).

3 голосов
/ 22 марта 2011

Гарвардская архитектура обеспечивает некоторую защиту от атак переполнения стека. Защищены ли компьютеры архитектуры Гарварда от произвольного внедрения кода и атак на выполнение?

Но на уровне операционной системы вы можете подумать о том, чтобы иметь неисполняемый стек .

2 голосов
/ 23 марта 2011

Вы можете быть удивлены, но одним из вариантов является аппаратная архитектура без стека (действительная или эмулированная) ( обсуждается здесь ). Очевидно, нет стека - нет переполнения стека.

1 голос
/ 23 марта 2011

Некоторые микроконтроллеры предусматривают аппаратную ловушку, когда стек находится на предопределенном пороге.Это может быть использовано либо для корректного завершения работы, либо для вывода стека из внешнего ОЗУ и запуска заново.Существует аналогичная ловушка «недостаточного потока» для возврата к старому стеку.

...