Проект grsecurity представил защиту от атак с использованием заимствования кусков кода
Проект grsecurity, в рамках которого развивается серия надстроек для усиления безопасности ядра Linux, сообщил о важной вехе в своем развитии - в набор патчей для ядра Linux 4.5 включен механизм защиты RAP, позволяющий блокировать работу эксплоитов, основанных на технике заимствования кусков кода.
Данная техника атак используется для организации выполнения кода атакующего при переполнении буфера в условиях, когда в страницах памяти стека и буфера установлен запрет на исполнение кода. Суть метода в применении для построении логики выполнения shell-кода возвратно-ориентированного программирования (ROP), оперирующего уже имеющимися в библиотеках кусках машинных инструкций, завершающихся инструкцией возврата управления или перехода, как правило, это окончания предоставляемых библиотекой функций. Работа эксплоита сводится к построению цепочки вызовов подобных блоков ("гаджетов") для получения нужной функциональности. В том числе через вызов предопределенных в системной библиотеке блоков организуется работа условных операторов и циклов. Для автоматизации выявления блоков применяются специальные инструменты.
Ранее предлагаемые способы защиты от атак с использованием методов возвратно-ориентированного программирования, как правило, основывались на рандомизации адреса загрузки библиотеки, который при технике ASLR меняется при каждом запуске программы. Слабая сторона такого способа в том, что атакующий может подобрать точку входа в библиотеку (определить адрес известной функции) и вычислить смещение для вызова используемых в эксплоите гаджетов, относительная позиция которых в библиотеке сохраняется. Для нарушения вычисленных атакующим смещений гаджетов предлагаются методы перемешивании всех функций системной библиотеки, но они достаточно ресурсоемки, что мешает их практическому внедрению. Разработчики OpenBSD попытались найти компромисс и предложили выполнять перекомпоновку системной библиотеки на этапе загрузки системы.
Подход RAP (Return Address Protection), предлагаемый в grsecurity, позволяет достаточно надежно блокировать атаки на основе заимствования кусков кода и при этом оказывает минимальное влияние на производительность. Суть метода в организации проверки адресов, по которым производится возврат из функций. Для проверки используется проверочный ключ (RAP cookie), который сохраняется в резервном регистре (r12) и применяется к адресу возврата через операцию XOR. Ключ вычисляется сразу после сохранения в стек адреса возврата и проверяется перед осуществлением выхода из функции. Если в момент выхода сохраненный и вычисленный ключи не совпадают, то переход на код функции был произведен не на начало функции.