EMZETT.
Войти

Переполнение буфера и защитные меры (ASLR, stack canary, DEP)

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

Подробнее: Типично для языков без автоматической проверки границ, таких как C и C++. Затёртыми могут оказаться переменные или адрес возврата в стеке.

Подробности

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

См. также: Эксплойт