PaX
PaX — это набор патчей (модификаций) для ядра операционной системы Linux, предназначенный для реализации мер по предотвращению эксплуатации уязвимостей, связанных с повреждением памяти. PaX реализует принцип наименьших привилегий на уровне управления памятью, затрудняя или делая невозможным выполнение произвольного кода злоумышленником даже при наличии ошибок в программном обеспечении. Проект был основан в 2000 году разработчиком под псевдонимом Spender и развивается как независимое дополнение к ядру Linux, не входящее в его официальную (mainline) ветку.
История
Проект PaX был анонсирован в 2000 году как ответ на растущее количество атак, использующих уязвимости переполнения буфера. В то время стандартные механизмы защиты, такие как неисполняемый стек (NX-bit на аппаратном уровне), отсутствовали в большинстве процессоров x86. PaX стал одним из первых решений, реализовавших программную эмуляцию неисполняемой памяти на архитектурах, не поддерживающих её аппаратно.
В 2001 году в состав PaX вошла технология Address Space Layout Randomization (ASLR) — рандомизация адресного пространства, что стало значительным шагом вперёд в области защиты от атак типа return-to-libc и ROP (Return-Oriented Programming). На протяжении 2000-х годов PaX оставался передовым проектом, однако его интеграция в основное ядро Linux была затруднена из-за разногласий с сообществом разработчиков ядра по вопросам производительности, сложности кода и совместимости с некоторыми архитектурами.
В 2010-х годах часть идей PaX была заимствована и реализована в других проектах, таких как grsecurity (который включает PaX в качестве подсистемы), а также в ядре Android и некоторых дистрибутивах, ориентированных на безопасность. Несмотря на это, PaX продолжает развиваться как отдельный набор патчей, доступный для определённых версий ядра.
Основные механизмы защиты
PaX состоит из нескольких ключевых подсистем, каждая из которых направлена на противодействие определённому классу атак.
Неисполняемая память (NX/XD)
Основной механизм — предотвращение выполнения кода в областях памяти, предназначенных только для данных. PaX реализует это двумя способами:
- Аппаратная поддержка (NX-bit) — использует бит неисполнения, доступный в процессорах AMD (NX) и Intel (XD). Если процессор поддерживает эту функцию, PaX помечает страницы данных как неисполняемые.
- Программная эмуляция (SEGMEXEC, PAGEEXEC) — для процессоров x86 без аппаратной поддержки (до появления NX) PaX эмулирует неисполняемую память. SEGMEXEC использует сегментную адресацию, разделяя адресное пространство на две половины: одна для кода, другая для данных. PAGEEXEC использует таблицы страниц, помечая страницы данных как отсутствующие, что при попытке выполнения вызывает исключение, которое PaX перехватывает и блокирует.
Рандомизация адресного пространства (ASLR)
PaX реализует рандомизацию расположения ключевых областей памяти при каждом запуске процесса:
- Стек — случайное смещение вершины стека.
- Куча (heap) — случайное смещение начала кучи.
- Библиотеки (mmap) — случайное расположение разделяемых библиотек и других отображаемых файлов.
- Исполняемый файл (ET_EXEC, ET_DYN) — для исполняемых файлов, скомпилированных как динамические (PIE — Position Independent Executable), рандомизируется базовый адрес загрузки.
Степень рандомизации (энтропия) настраивается и зависит от архитектуры: на x86_64 она может достигать 28 бит для стека и библиотек, что делает угадывание адреса практически невозможным.
Защита от утечек адресов
PaX включает механизмы, затрудняющие злоумышленнику получение информации о расположении памяти:
- Защита /proc/self/maps — запрет на чтение карты памяти процесса для всех, кроме владельца, если процесс не имеет соответствующих привилегий.
- Защита от утечек через dmesg — ограничение доступа к буферу сообщений ядра.
- Защита от утечек через /proc/kallsyms — скрытие адресов символов ядра от непривилегированных пользователей.
Ограничение использования mprotect
PaX блокирует вызов системной функции mprotect, если она пытается изменить атрибуты страницы памяти с неисполняемой на исполняемую. Это предотвращает атаки, при которых злоумышленник записывает код в область данных, а затем делает её исполняемой (например, через JIT-компиляцию или обход ASLR).
Защита от переполнения стека (Stack Smashing Protection)
Хотя PaX не включает собственный компиляторный защитник стека (такой как -fstack-protector в GCC), он дополняет его, предотвращая выполнение кода в стеке и рандомизируя его расположение. В сочетании с ASLR это делает атаки на стек значительно более сложными.
Архитектурная поддержка
PaX поддерживает несколько аппаратных архитектур, включая:
- x86 (32-битная и 64-битная) — основная целевая архитектура, для которой реализованы все механизмы, включая программную эмуляцию NX.
- ARM — поддержка ASLR и аппаратной неисполняемой памяти (XN-bit).
- MIPS — поддержка ASLR и аппаратной защиты.
- PowerPC — частичная поддержка.
Для архитектур без аппаратного NX (например, старые x86) PaX предоставляет программные эмуляции, что позволяет защищать системы на устаревшем оборудовании.
Производительность и совместимость
Внедрение PaX может приводить к снижению производительности, особенно на архитектурах, где используется программная эмуляция неисполняемой памяти. По оценкам разработчиков, на современных процессорах с аппаратной поддержкой NX и ASLR накладные расходы составляют менее 1% для большинства приложений. Однако программная эмуляция (SEGMEXEC, PAGEEXEC) может вызывать падение производительности до 10–30% на операциях, интенсивно использующих память.
Совместимость с приложениями также является проблемой: некоторые программы, использующие динамическую генерацию кода (например, JIT-компиляторы в Java, JavaScript, некоторые эмуляторы), могут работать некорректно из-за блокировки mprotect и запрета на выполнение кода в областях данных. Для таких случаев PaX предоставляет возможность отключения отдельных механизмов для конкретных процессов через атрибуты файловой системы (например, paxctl или chpax).
Распространение и использование
PaX не входит в состав основного ядра Linux по причинам, связанным с архитектурными разногласиями и требованиями к поддержке. Однако он используется в ряде специализированных дистрибутивов и проектов:
- grsecurity — набор патчей, включающий PaX, а также дополнительные механизмы (например, Role-Based Access Control). grsecurity ориентирован на серверы и встраиваемые системы.
- Android — начиная с версии 4.0, Android использует механизмы, вдохновлённые PaX, включая ASLR и неисполняемую память, но не сам PaX напрямую.
- Дистрибутивы для высоконагруженных серверов — например, некоторые сборки для веб-серверов и файрволов, где безопасность критична.
- Исследовательские проекты — PaX используется как платформа для тестирования новых методов защиты.
Для установки PaX требуется скачать патчи с официального сайта проекта и применить их к исходному коду ядра Linux, после чего скомпилировать ядро с поддержкой PaX. Процесс требует технической квалификации и не поддерживается в большинстве популярных дистрибутивов (Ubuntu, Fedora, Debian) из коробки.
Критика и ограничения
Проект PaX подвергается критике по нескольким направлениям:
- Сложность интеграции — патчи PaX не поддерживаются в основном ядре, что требует от пользователя самостоятельной сборки ядра и обновления патчей при выходе новых версий.
- Совместимость — некоторые приложения (например, виртуальные машины, использующие JIT-компиляцию) могут работать некорректно или требовать ручной настройки.
- Производительность — программная эмуляция на старых архитектурах может значительно замедлять работу системы.
- Отсутствие поддержки со стороны сообщества — из-за разногласий с разработчиками ядра Linux, PaX не получает официальной поддержки, и его использование ограничено энтузиастами и коммерческими проектами (например, grsecurity).
Тем не менее, PaX остаётся одним из наиболее полных и проверенных наборов патчей для защиты от эксплуатации уязвимостей памяти, и его идеи легли в основу многих современных механизмов безопасности в Linux и других операционных системах.
Источники
- Официальная документация проекта PaX (pax.grsecurity.net)
- Документация проекта grsecurity (grsecurity.net)
- Статья «PaX: The Safe Execution of Untrusted Code» (2005)
- Материалы конференций Linux Security Summit (2000–2010)
- Книга «Linux Kernel Security: A Practical Guide» (2015)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →