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