Атака возврата в библиотеку — Википедия

Атака возврата в библиотеку (англ. Return-to-libc attack) — один из видов компьютерных атак, популярных на x86-совместимых машинах и схожие с ними, связанных с переполнением буфера, когда адрес возврата функции на стеке подменяется адресом иной функции в программе, и в последующую часть стека записываются параметры для вызываемой функции. Эта техника позволяет нападающему выполнить какую-либо существующую функцию без необходимости внедрять вредоносный код в программу.

В GNU, GNU/Linux и других UNIX-подобных ОС имеется разделяемая библиотека libc, предоставляющая функции языка Си и стандарта POSIX, например system() для выполнения произвольных программ. Подобные библиотеки существуют и в ОС семейства Windows. Хотя атакующий может заставить программу совершить переход по любому адресу, большинство программ используют libc (слинкованы с ней), в ней имеются удобные функции запуска произвольных программ. Поэтому функции стандартной библиотеки являются наиболее вероятной целью подобных эксплойтов, что и дало название классу атак. Тем не менее возможно использование и других адресов возврата, в том числе функций из других библиотек и (или) фрагментов кода (в том числе возврат на середину инструкции[1]), подробнее см. Возвратно-ориентированное программирование.

Защита от атаки

[править | править код]

Стек с защитой от выполнения кода может предотвратить некоторые способы использования переполнений буфера, но не возврат в библиотеку, поскольку в данной атаке используется уже существующий в адресном пространстве процесса исполняемый код. С другой стороны, в отличие от классических shellcode, данная атака может использовать только существующие функции. Защита stack-smashing из GCC (известная как ProPolice) и подобные защиты других систем могут предотвратить или сильно усложнить данную атаку, так как они обнаруживают нарушение целостности стека и, возможно, заметят внедренные данные.

Технология Address Space Layout Randomization (ASLR), добавляющая случайность в расположение библиотек внутри адресного пространства процессов, делает атаку данного типа чрезвычайно сложной и практически бесполезной на 64-битных системах, так как адреса функций становятся случайными. Для систем с 32-битной адресацией технология ASLR менее полезна, поскольку для добавления случайности доступно лишь около 16 бит, и с подобными случайностями можно бороться при помощи перебора грубой силой в рамках нескольких минут.[2]

Как и с обычными переполнениями буфера, данная атака значительно усложнена для архитектур, не хранящих адрес возврата в том же стеке, что и данные. Такими архитектурами являются, например, SPARC[1], хранящий адрес возврата из текущей функции на регистре %i7, и MIPS (регистр $ra). Атака может быть невозможной для процессоров, хранящих регистровые окна предыдущих функций в теневых регистрах, например PowerPC, стек вызовов в котором реализован как стекирующийся (сохраняющий старые значения в теневой области, недоступной программисту) регистр.

Схожие атаки

[править | править код]

Техника «Возвратно-ориентированное программирование» является развитием идей, лежащих в основе данной атаки, и позволяет выполнять более сложные действия за счет последовательного объединения нескольких меньших атак, каждая из которых исполняет небольшое количество инструкций за раз. В этой технике не обязательно использовать переходы на начало функций, а допустимо делать «возврат» на инструкцию, находящуюся недалеко от инструкции возврата управления из функции (ret). После выполнения одного фрагмента, команда ret возьмет со стека следующий адрес и запустит своим возвратом другой фрагмент. Таким образом, при помощи тщательного компонования стека возможно создание достаточно сложных последовательностей инструкций.

Примечания

[править | править код]
  1. 1 2 Hovav Shacham: When Good Instructions Go Bad. Дата обращения: 15 июня 2012. Архивировано 16 мая 2018 года.
  2. Shacham, Hovav. "On the Effectiveness of Address-Space Randomization" (PDF). Proceedings of Computer and Communications Security (CCS'04), October 25–29, 2004, Washington (DC). Архивировано из оригинала (PDF) 15 сентября 2011. Дата обращения: 4 июля 2010. {{cite conference}}: Неизвестный параметр |coauthors= игнорируется (|author= предлагается) (справка)