Атака "return-to-libc" - это атака на компьютерную безопасность , которая обычно начинается с переполнения буфера , при которой адрес возврата подпрограммы в стеке вызовов заменяется адресом подпрограммы, которая уже присутствует в исполняемой памяти процесса , обходя функцию бита невыполнения (если она присутствует) и избавляя злоумышленника от необходимости внедрять свой собственный код. Первый пример этой атаки в дикой природе был предоставлен Александром Песляком в списке рассылки Bugtraq в 1997 году. [1]
В операционных системах, совместимых с POSIX, стандартная библиотека C (" ") обычно используется для предоставления стандартной среды выполнения для программ, написанных на языке программирования C. Хотя злоумышленник может заставить код вернуться в любое место, является наиболее вероятной целью, так как она почти всегда связана с программой и предоставляет полезные вызовы для злоумышленника (например, функцию, используемую для выполнения команд оболочки).libc
libc
system
Неисполняемый стек может предотвратить некоторую эксплуатацию переполнения буфера, однако он не может предотвратить атаку return-to-libc, поскольку в атаке return-to-libc используется только существующий исполняемый код. С другой стороны, эти атаки могут вызывать только уже существующие функции. Защита от разрушения стека может предотвратить или воспрепятствовать эксплуатации, поскольку она может обнаружить повреждение стека и, возможно, сбросить скомпрометированный сегмент.
« Бронирование ASCII » — это метод, который можно использовать для предотвращения такого рода атак. При бронировании ASCII все адреса системных библиотек (например, libc) содержат байт NULL ( 0x00
). Обычно это делается путем помещения их в первые 0x01010101
байты памяти (несколько страниц более 16 МБ, называемые «областью бронирования ASCII»), поскольку каждый адрес до (но не включая) этого значения содержит по крайней мере один байт NULL. Это делает невозможным размещение кода, содержащего эти адреса, с помощью функций обработки строк, таких как strcpy()
. Однако этот метод не работает, если у злоумышленника есть способ переполнить стек байтами NULL. Если программа слишком велика, чтобы поместиться в первые 16 МБ , защита может быть неполной. [2] Этот метод похож на другую атаку, известную как return-to-plt , где вместо возврата в libc злоумышленник использует функции таблицы связей процедур (PLT), загруженные в позиционно-независимый код (например, system@plt, execve@plt, sprintf@plt, strcpy@plt
). [3]
Рандомизация адресного пространства (ASLR) делает этот тип атаки крайне маловероятным для успеха на 64-битных машинах , поскольку расположение функций в памяти является случайным. Однако для 32-битных систем ASLR дает мало преимуществ, поскольку для рандомизации доступно только 16 бит, и их можно преодолеть методом грубой силы за считанные минуты. [4]