EMZETT.
Увійти

Переповнення буфера та захисні заходи (ASLR, stack canary, DEP)

Коротко: Переповнення буфера виникає, коли програма записує в ділянку пам’яті більше даних, ніж вміщується, і затирає сусідні дані. Сучасні системи ускладнюють експлуатацію кількома рівнями захисту.

Докладніше: Типово для мов без автоматичної перевірки меж, таких як C і C++. Затертими можуть опинитися змінні або адреса повернення в стеку.

Подробиці

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

Див. також: Експлойт