Введение

Атака "возврата в libc" – это компьютерная атака, обычно начинающаяся с переполнения буфера, в которой адрес возврата подпрограммы в стеке вызовов заменяется адресом подпрограммы, уже находящейся в исполняемой памяти процесса. Это позволяет обойти защиту NX (если она присутствует) и избавляет злоумышленника от необходимости внедрять собственный код. Первый пример этой атаки был опубликован Александром Песляком в списке рассылки Bugtraq в 1997 году. В POSIX-совместимых операционных системах стандартная библиотека C ("libc") обычно используется для обеспечения стандартной среды выполнения программ, написанных на языке C. Хотя злоумышленник теоретически может перенаправить выполнение в любую точку кода, libc является наиболее вероятной целью, поскольку она почти всегда подключается к программе и предоставляет полезные функции для злоумышленника, такие как функция `system`, используемая для выполнения команд оболочки.

Защита от атак "возвращения в Либию"

Неисполняемый стек может предотвратить некоторые уязвимости, связанные с переполнением буфера, однако он не может предотвратить атаку типа "возврат в libc", поскольку в этой атаке используется только существующий исполняемый код. С другой стороны, такие атаки могут вызывать только предопределенные функции. Защита от повреждения стека может предотвратить или затруднить эксплуатацию уязвимости, поскольку она может обнаружить повреждение стека и, возможно, очистить скомпрометированный сегмент. "ASCII-бронирование" – это техника, которую можно использовать для затруднения такого рода атак. При ASCII-бронировании все адреса системных библиотек (например, libc) содержат нулевой байт (0x00). Обычно это достигается путем размещения этих адресов в первые 0x01010101 байт памяти (на несколько страниц больше 16 МБ, называемые "зоной ASCII-брони"), поскольку каждый адрес до (но не включая) этого значения содержит как минимум один нулевой байт. Это делает невозможным внедрение кода, содержащего эти адреса, с помощью функций манипулирования строками, таких как strcpy. Однако эта техника не работает, если у злоумышленника есть способ перезаписать нулевые байты в стеке. Если программа слишком велика, чтобы поместиться в первые 16 МБ, защита может быть неполной. Эта техника аналогична другой атаке, известной как "возврат в PLT", где вместо возврата в libc злоумышленник использует функции таблицы связей процедур (PLT), загруженные в позиционно-независимый код (например, system@plt, execve@plt, sprintf@plt, strcpy@plt). Рандомизация адресного пространства (ASLR) делает этот тип атаки крайне маловероятным для успешного осуществления на 64-битных машинах, поскольку адреса функций в памяти случайны. Однако для 32-битных систем ASLR предоставляет мало преимуществ, поскольку для рандомизации доступно всего 16 бит, и их можно преодолеть методом перебора за несколько минут.