Переповнення буфера та захисні заходи (ASLR, stack canary, DEP)
Коротко: Переповнення буфера виникає, коли програма записує в ділянку пам’яті більше даних, ніж вміщується, і затирає сусідні дані. Сучасні системи ускладнюють експлуатацію кількома рівнями захисту.
Докладніше: Типово для мов без автоматичної перевірки меж, таких як C і C++. Затертими можуть опинитися змінні або адреса повернення в стеку.
Подробиці
- Причина: Функції на кшталт
strcpyчиgetsне перевіряють довжину. Безпечнішіstrncpy/snprintf, перевірки довжини або мови з перевіркою меж (Rust, Java, Python). - Stack canary: Секретне значення перед адресою повернення перевіряється перед виходом із функції. Якщо воно відрізняється, програма завершується.
- DEP/NX: Ділянки даних не виконувані, впроваджений код не запускається.
- ASLR: Адреси стеку, купи й бібліотек змінюються під час кожного запуску, фіксованих цілей для переходів немає.
- Інше: Цілісність потоку керування (CFI), попередження компілятора, санітайзери (див. Valgrind і санітайзери), фазинг.
- У довгостроковій перспективі: Безпечні щодо пам’яті мови запобігають усьому цьому класу проблем.
Див. також: Експлойт