stringtranslate.com

Атака с возвратом в libc

Атака «возврата в libc» — это атака на компьютерную безопасность, обычно начинающаяся с переполнения буфера , при котором адрес возврата подпрограммы в стеке вызовов заменяется адресом подпрограммы, которая уже присутствует в исполняемой памяти процесса , минуя функция no-execute bit (если имеется) и избавляет злоумышленника от необходимости внедрять собственный код. Первый пример этой атаки в реальной жизни был предоставлен Александром Песляком в списке рассылки Bugtraq в 1997 году. [1]

В POSIX -совместимых операционных системах стандартная библиотека C (« » ) libcобычно используется для обеспечения стандартной среды выполнения программ, написанных на языке программирования C. Хотя злоумышленник может вернуть код где угодно, libcэто наиболее вероятная цель, поскольку он почти всегда связан с программой и предоставляет злоумышленнику полезные вызовы (например, функцию, systemиспользуемую для выполнения команд оболочки).

Защита от атак возврата в libc

Неисполняемый стек может предотвратить некоторые случаи переполнения буфера, однако он не может предотвратить атаку 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]

Смотрите также

Рекомендации

  1. Solar Designer (10 августа 1997 г.). «Bugtraq: обход неисполняемого стека (и исправление)».
  2. Дэвид А. Уилер (27 января 2004 г.). «Безопасный программист: Противодействие переполнению буфера». IBM DeveloperWorks. Архивировано из оригинала 18 октября 2013 г.
  3. ^ Болезнь (13 мая 2011 г.). «Разработка эксплойта Linux, часть 4 — обход брони ASCII + возврат к plt» (PDF) .
  4. ^ Шахам, Х.; Пейдж, М.; Пфафф, Б.; Гох, Э.Дж.; Модадугу, Н.; Боне, Д. (октябрь 2004 г.). «Об эффективности рандомизации адресного пространства». Материалы 11-й конференции ACM по компьютерной и коммуникационной безопасности (PDF) . стр. 298–307. дои : 10.1145/1030083.1030124. ISBN 1-58113-961-6. S2CID  5864467.

Внешние ссылки