Атака возврата в библиотеку
Атака возврата в библиотеку (англ. Return-to-libc attack) — вид компьютерной атаки, распространённый на x86-совместимых архитектурах и аналогичных им, использующий механизм переполнение буфера, при котором адрес возврата функции в стеке подменяется на адрес другой функции в программе, а в оставшуюся часть стека заносятся параметры вызываемой функции. Такая техника позволяет злоумышленнику выполнить одну из уже имеющихся в адресном пространстве программы функций без необходимости внедрения собственного вредоносного кода[1].
В системах GNU, GNU/Linux и других UNIX-подобных операционных системах имеется разделяемая библиотека libc, реализующая функции языка C и стандарта POSIX, такие как system() для запуска внешних программ. Подобные библиотеки есть и в ОС семейства Windows. Хотя злоумышленник может инициировать выполнение программы по любому адресу, большинство приложений используют libc (связываются с ней при компиляции), и в данной библиотеке присутствуют функции запуска других программ. Поэтому функции стандартной библиотеки чаще всего становятся основной целью подобного рода эксплойтов, что и дало название этому классу атак. Однако возможно и перенаправление управления на другие адреса, в том числе на функции из других библиотек или даже на отдельные фрагменты кода, включая возврат в середину инструкции[2]. Более подробно эта техника раскрыта в статье возвратно-ориентированное программирование.
Защита от атаки
Стек с защитой от исполнения кода (NX-бит) может предотвратить отдельные методы эксплуатации переполнения буфера, однако он не препятствует атакам возврата в библиотеку, так как при них используется уже существующий в адресном пространстве процесса исполняемый код. В отличие от классического shellcode, подобная атака оперирует только уже имеющимися в программе функциями. Технология защиты стека от модификации stack-smashing (например, ProPolice в GCC), а также аналогичные методы, применяемые в других системах, могут затруднить или предотвратить такие атаки — они обнаруживают нарушение структуры стека и способны выявлять внедрённые данные.
Технология Address Space Layout Randomization (ASLR), основанная на рандомизации расположения библиотек внутри адресного пространства процессов, существенно усложняет атаки данного типа и практически лишает их смысла на 64-битных архитектурах благодаря большой размерности пространства адресов функций. На 32-битных системах ASLR менее эффективен из-за ограниченного количества бит (около 16), выделяемых под случайность; в этом случае перебор возможен за несколько минут[3].
Как и при обычных переполнениях буфера, атака возврата в библиотеку становится гораздо менее осуществимой для архитектур, где адрес возврата не хранится в том же стеке, что и пользовательские данные. Примером таких архитектур являются SPARC[2], где адрес возврата текущей функции хранится в регистре %i7, и MIPS, где используется регистр $ra. Для процессоров, реализующих регистровое окно предыдущих уровней вызова в специальных теневых регистрах (например, PowerPC, где стек вызовов реализован как стекирующийся регистр, значения которого хранятся в недоступной области), атака может быть невозможна.
Схожие атаки
Техника возвратно-ориентированное программирование является развитием идей, лежащих в основе атаки возврата в библиотеку, и позволяет выполнять более сложные действия за счёт последовательного объединения нескольких фрагментов кода, каждый из которых осуществляет небольшой набор инструкций. При таком подходе не обязательно переходить на начало целевой функции, допускается возврат к инструкции, расположенной непосредственно перед командой возврата из функции. После выполнения блока управляющая команда ret извлекает из стека следующий адрес и тем самым запускает следующий фрагмент. Таким образом, тщательное построение содержимого стека позволяет реализовать достаточно сложные последовательности инструкций.
Примечания
Ссылки
- Bypassing non-executable-stack during exploitation using return-to-libc by c0ntex at InfoSecWriters.com


