PaX

Из Википедии, бесплатной энциклопедии

Логотип PaX: пингвин Такс (символ Linux) имеющий демонический вид.

В компьютерной безопасности PaX (произн. «Пакс») — это патч к ядру Linux, который предоставляет возможность настроить минимальные права доступа приложений к страницам памяти. Таким образом обеспечивается достаточно тонкая настройка, с помощью которой программам разрешается выполнять только те действия, которые необходимы, исходя из предоставляемой ими функциональности, но не более того. PaX был впервые выпущен в 2000 году. С 2014 года распространяется только в составе проекта grsecurity[1], который стал платным с апреля 2017 года[2].

PaX помечает сегмент данных программ в памяти как недоступный для исполнения (так как он по определению не может содержать программных директив, которые необходимо выполнить), а сегмент кода — как не перезаписываемый, и, в придачу, при каждом запросе выделяет память программе из произвольных мест (рандомизация страниц памяти). Любая программа, которая пытается передать управление коду, находящемуся в недоступной для исполнения памяти, принудительно завершается[1].

Эта методика эффективна против применения различных эксплоитов, использующих, например, уязвимость, основанную на переполнении буфера памяти. Такая защита изначально полностью предотвращает прямое выполнение кода из памяти, и одновременно, с прикладной точки зрения, делает, так называемые, return-to-libc (ret2libc) атаки сложными для выполнения (они становятся выполняемыми скорее наудачу, без заранее предсказуемого результата). Однако, вместе с тем, PaX не предотвращает ошибки, приводящие к возможности переопределения переменных и значений указателей.

PaX был написан одноимённой командой разработчиков. Основатель PaX в настоящее время предпочитает оставаться анонимным по неизвестным общественности причинам.

Описание[править | править код]

Довольно большая часть от общего числа уязвимостей в компьютерных системах вызвана ошибками в программах, которые допускают возможность переопределять свои функции, переписывая их «на лету» (напрямую в оперативной памяти). Принцип работы многих червей, вирусов, а также многочисленные методики непосредственных попыток взлома систем основаны на изменении содержимого памяти внедрением с последующим выполнением вредоносного кода, на исполнении части содержимого области памяти через умышленное изменение указателей и т. п. Если подобные действия заблокировать каким-либо образом, то общий ущерб становится довольно незначительным, или его может не быть вовсе, даже если вирус и проник в систему. К тому же, многие черви (например, такие как Sasser) в этом случае не смогут внедриться в систему вообще.

PaX был создан для того чтобы предотвращать подобные атаки и делать это как можно более обобщённым способом, то есть не допускать выполнение нелегитимного кода, контролируя доступ к памяти (на чтение, запись, исполнение и их возможные комбинации), причём, при этом не касаясь непосредственно самого исполняемого кода. Столь малой ценой PaX обеспечивает большую устойчивость системы ко взлому, снижает количество эксплойтов, приводящих к отказу приложения в обслуживании (DoS) или удалённо отслеживающих процесс выполнения кода; эксплойтов, которые используют подобные уязвимости для предоставления атакующему прав суперпользователя, доступа к важной информации в системе или могут причинить ещё какой-либо ущерб. Взамен этого дело может ограничиться прекращением функционирования какого-либо процесса или программы, с минимальными последствиями для всей системы.

Чаще всего, вред, наносимый DoS атакой, состоит в потере времени и ресурсов из-за отказа функциональности атакуемого объекта. Однако, в данном случае, PaX предотвращает нелегитимный доступ и распространение конфиденциальных данных системы вследствие атаки, а не препятствует самому нападению. Между тем, прямые последствия DoS также весьма нежелательны, особенно для систем, где критичен любой перерыв в обслуживании, и проникновение взломщика наносит заведомо меньший ущерб, чем прекращение функционирования сервисов. В этом случае, PaX будет не самым хорошим решением, но тем не менее, это довольно таки приемлемый метод защиты важной информации.

Многие (но конечно далеко не все) ошибки разработчиков приводят к неправильному обращению их программ к памяти. Это предоставляет гипотетическую возможность заставить программу выполнять то, что она не должна делать по замыслу (например выдавать привилегированный шелл). Цель PaX — не нахождение и исправление подобных уязвимостей, а, скорее, предотвращение их использования атакующими приложениями. Последствия ошибок будут сведены к минимуму — выполнение программы будет попросту прервано, что с точки зрения PaX лучше, чем её скомпрометированный функционал.

Следует понимать, что PaX напрямую не предотвращает переполнение буфера, а лишь пытается эффективно пресечь потенциальные, связанные с ним, ошибки разработчиков, которые могут привести, например, к предоставлению непредусмотренного доступа к системе. Однако, существуют такие разработки, как Stack-Smashing Protector и StackGuard, которые пытаются определить именно само переполнение буфера и остановить выполнение компрометирующих систему программ. Такая методика называется stack-smashing protection. Она ориентирована на непосредственное блокирование прямых атак, в случае, если это возможно. Хотя и PaX, и stack-smashing protection, по сути, преследуют одну цель, они не взаимозаменяемы. Однако, внедрение обеих технологий, безусловно, сделает систему более защищённой. Некоторые дистрибутивы Linux уже имеют в своём составе оба компонента сразу (PaX и Stack Smash Protection)[3].

По состоянию на октябрь 2006 года PaX ещё не включён в основную ветку ядра, так как разработчики патча полагают, что он всё ещё недостаточно готов. Но, несмотря на то, что PaX успешно используется на многих архитектурах, он всё ещё остаётся лишь частично, или вообще не поддерживаемым, в ряде других. Так, PaX успешно применяется на IA-32 (x86), AMD64, IA-64, Alpha, PA-RISC, 32 и 64 bit MIPS, PowerPC и SPARC.

См. также[править | править код]

Примечания[править | править код]

  1. 1 2 Robert C. Seacord. Secure Coding in C and C++: Secure Coding in C and C++. — Addison-Wesley, 2013. — С. 115—116. — 1169 с. — ISBN 978-0-13-298197-2.
  2. Jonathan Corbet. Grsecurity goes private [LWN.net] (англ.). lwn.net (4 мая 2017). Дата обращения: 26 мая 2020. Архивировано 1 апреля 2020 года.
  3. about | Alpine Linux. www.alpinelinux.org. Дата обращения: 19 января 2016. Архивировано 15 января 2016 года.

Литература[править | править код]

Ссылки[править | править код]