Проект grsecurity, в рамках которого развивается серия надстроек для усиления безопасности ядра Linux, сообщил о важной вехе в своём развитии - в набор патчей grsecurity включён механизм защиты RAP, позволяющий блокировать работу эксплоитов, основанных на технике заимствования кусков кода. RAP реализован в форме плагина к GCC и распространяется под лицензией GPLv3. Блокирование атак обеспечивается благодаря применению двух механизмов: контроля возврата в точку вызова функции и определения какие функции могут быть вызваны из данного места и куда может быть возвращено управление.

Данная техника атак используется для организации выполнения кода атакующего при переполнении буфера в условиях, когда в страницах памяти стека и буфера установлен запрет на исполнение кода. Суть метода в применении для построения логики выполнения 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