Проект grsecurity представил защиту от атак с использованием заимствования кусков кода
Данная техника атак используется для организации выполнения кода атакующего при переполнении буфера в условиях, когда в страницах памяти стека и буфера установлен запрет на исполнение кода. Суть метода в применении для построения логики выполнения shell-кода возвратно-ориентированного программирования (ROP), оперирующего уже имеющимися в библиотеках кусками машинных инструкций, завершающихся инструкцией возврата управления, как правило, это окончания библиотечных функций. Работа эксплоита сводится к построению цепочки вызовов подобных блоков ("гаджетов") для получения нужной функциональности. В том числе через вызов гаджетов организуется работа условных операторов и циклов. Для автоматизации выявления гаджетов применяются специальные инструменты.
Ранее предлагаемые способы защиты от атак с использованием методов возвратно-ориентированного программирования, как правило, основывались на рандомизации адреса загрузки библиотеки, который при технике ASLR меняется при каждом запуске программы. Слабая сторона такого способа в том, что атакующий может подобрать точку входа в библиотеку (определить адрес известной функции) и вычислить смещение для вызова используемых в эксплоите гаджетов, относительная позиция которых в библиотеке сохраняется. Для нарушения вычисленных атакующим смещений гаджетов предлагаются методы перемешивания всех функций системной библиотеки, но они достаточно ресурсоёмки, что мешает их практическому внедрению. Разработчики OpenBSD попытались найти компромисс и предложили выполнять перекомпоновку системной библиотеки на этапе загрузки системы.
Подход RAP (Return Address Protection), предлагаемый в grsecurity, позволяет достаточно надёжно блокировать атаки на основе заимствования кусков кода и при этом оказывает минимальное влияние на производительность. Суть метода в организации проверки адресов, по которым производится возврат из функций. Для проверки используется проверочный ключ (RAP cookie), который сохраняется в резервном регистре (r12). Ключ вычисляется сразу после сохранения в стек адреса возврата и проверяется перед осуществлением выхода из функции. Если в момент выхода сохранённый и вычисленный ключи не совпадают, то переход на код функции был произведён не на начало функции.
Вторая часть защиты основана на идее категоризации функций по типам и определении допустимых мест, где могут применяться данные типы. При сборке приложения RAP формирует хэши, идентифицирующие используемые в программе функции, их параметры и тип возвращаемого значения. В процессе работы хэши проверяются на этапе косвенного вызова функции или выхода из функции.
Дополнение 1: В экспериментальной ветке grsecurity устранена DoS-уязвимость, позволяющая инициировать крах ядра при вставке слишком длинной строки в эмулятор терминала (например, "script /dev/null ‹ /dev/zero"). В связи с этой уязвимостью разгорелся не совсем понятный конфликт - с одной стороны сведения о проблеме были адекватно приняты в форуме grsecurity и был сразу выпущен патч, но, с другой стороны, опубликованная на следующий день демонстрация простейшего метода эксплуатации проблемы в Twitter привела к блокировке анонсировавшего проблему пользователя и авторов ретвитов, а также к ограничению публичного доступа к каналу @grsecurity. Мотивы удаления пока не ясны, возможно это была реакция на волну троллинга и попытки дискредитации проекта.
Дополнение 2: Опубликован FAQ с подробным описанием принципов работы RAP и особенностей реализации.
Источник: http://www.opennet.ru/opennews/art.shtml?num=44348
|
0 | Tweet | Нравится |
|