Чи виявлено переповнення стека апаратним чи програмним забезпеченням?


26

Це завдання програмного забезпечення (операційної системи) виявити переповнення стека чи виявлено переповнення стека в апаратному забезпеченні, спричиняючи виняток у процесорі?


Я б сказав, апаратне забезпечення через помилки MMU на більшості процесорів. x86 в 32-бітовому режимі крім сегментування також мав сегментацію, і сегмент стека пов'язаний, як сегменти Code, Data, Ext ... з базовою адресою та розміром. Будь-який доступ поза цим діапазоном може викликати помилку.
TEMLIB

Відповіді:


25

Це може бути програмне забезпечення, або обладнання, або те, або інше.

Існує два види переповнення: переповнення при зростанні стека (при введенні функції) та переповнення при доступі до масиву стека. Переповнення при зростанні стека можна виявити, зробивши перевірку меж входу функції, щоб переконатися, що є достатньо місця (і або подати сигнал про помилку, або наростити стек, якщо його немає). Переповнення під час доступу до масиву в стеку є лише проблемою на мовах низького рівня, які не підтверджують межі масиву; рішення є в тому, щоб перевірити межі масиву.

Ці програмні підходи мають перевагу в тому, що вони працюють надійно: ви можете бути впевнені, що будь-яке переповнення стека буде виявлено. Їх недоліком є ​​те, що вони збільшують розмір коду та час виконання. Обладнання може допомогти, запропонувавши метод виявлення більшості переливів безкоштовно, доки не виникає переповнення. У архітектурі з MMU environment середовище виконання може організувати відображення стека на межі сторінки, при цьому наступна сторінка залишається немапазованою.

+---------------+---------------+---------------+---------------+
| stack                         | unmapped      | other stuff   |
|    ----> direction of growth  |               |               |
+---------------+---------------+---------------+---------------+
^               ^               ^               ^               ^  page boundaries

Таким чином, якщо програмне забезпечення намагатиметься отримати доступ до даних за межами сторінки (чи тому, що вказівник стека перемістився за межу, або через те, що доступ до масиву знаходиться поза межами та за межами межі), це спричинить помилку, звернувшись до немапарованої області . Це відбувається лише в тому випадку, якщо переповнення є досить малим: якщо кількість переповнення занадто велика, програма може отримати доступ до інших матеріалів з іншого боку проміжку в адресному просторі.

Мінуси апаратного підходу полягають у тому, що він не є повністю надійним, оскільки переповнення великою кількістю може бути не виявлено, а також те, що він не виявляє переповнення масиву, що залишаються в адресному просторі.

Для виявлення переповнення масиву іншою програмною технікою є канарка : помістіть спеціальне значення у верхній частині стека або між кадрами та перевірте, чи не змінилося значення канарного каналу при поверненні функції. Це також недосконала методика, оскільки переповнення може взагалі уникнути канарки або не бути виявленим, оскільки значення канарки було відновлено до моменту його перевірки. Тим не менш, корисно ускладнити експлуатацію деяких вразливих місць безпеки.

Найбезпечніший і найдешевший спосіб уникнути переповнення стека - це обчислити кількість стека, яка буде потрібна програмі перед початком її виконання, за допомогою статичного аналізу. Однак це не завжди практично: кількість стека, необхідна програмі, загалом не визначається і залежить від даних, якими маніпулює програма.

¹ Той же принцип може бути застосований з як раз MPU, або без захисту пам'яті , якщо є один потік , чий стек на краї існуючих фізичних відображень.


4
Я б не закликав до масиву поза межами доступу звертатися до переповнення стека, навіть якщо масив знаходиться в стеці. Це просто особливий випадок переповнення буфера.
CodesInChaos

Якщо не виділяти на елементи основного стека, на які посилається відносно покажчика не стека / кадру чи нестандартного зміщення, уникне традиційних переповненнях стеків. Використання окремого стека зворотних адрес (або стека розливу RA / регістру, як Itanium) принаймні значно зменшить можливості програмування, орієнтовані на повернення.
Пол А. Клейтон

Доступ поза межами межі правильніше називати перевищенням , а не переповненням.
Бен Войгт

3
@ awesomebing1 не кожна платформа виявляє переповнення стека. Ви можете просто перезаписати те, що є після стека (подібно до будь-якого іншого переповнення буфера).
користувач253751

1
@CodesInChaos, іноді переповнення буфера в буферах, виділених стеком, називаються "переповненням стека" (коротко). Зрозуміло, що термінологія може бути трохи заплутаною без контексту.
DW
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.