Атака «возврата в libc» — это атака на компьютерную безопасность, обычно начинающаяся с переполнения буфера , при котором адрес возврата подпрограммы в стеке вызовов заменяется адресом подпрограммы, которая уже присутствует в исполняемой памяти процесса , минуя функция no-execute bit (если имеется) и избавляет злоумышленника от необходимости внедрять собственный код. Первый пример этой атаки в реальной жизни был предоставлен Александром Песляком в списке рассылки Bugtraq в 1997 году. [1]
В POSIX -совместимых операционных системах стандартная библиотека C (« » ) libc
обычно используется для обеспечения стандартной среды выполнения программ, написанных на языке программирования C. Хотя злоумышленник может вернуть код где угодно, libc
это наиболее вероятная цель, поскольку он почти всегда связан с программой и предоставляет злоумышленнику полезные вызовы (например, функцию, system
используемую для выполнения команд оболочки).
Неисполняемый стек может предотвратить некоторые случаи переполнения буфера, однако он не может предотвратить атаку return-to-libc, поскольку при атаке return-to-libc используется только существующий исполняемый код . С другой стороны, эти атаки могут вызывать только уже существующие функции. Защита от разрушения стека может предотвратить или затруднить эксплуатацию, поскольку она может обнаружить повреждение стека и, возможно, очистить скомпрометированный сегмент.
« Защита ASCII » — это метод, который можно использовать для предотвращения такого рода атак. При бронировании ASCII адреса всех системных библиотек (например, libc) содержат нулевой байт ( 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]