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