Уязвимость Stack Clash позволяет повысить права на Linux и других свободных ОС

Проблема, получившая название Stack Clash, затрагивает Linux, OpenBSD, NetBSD, FreeBSD и Solaris.

Эксперты компании Qualys описали уязвимость в блоке управления памятью ряда свободных операционных систем. Проблема, получившая название Stack Clash, затрагивает Linux, OpenBSD, NetBSD, FreeBSD и Solaris. Она может быть проэксплуатирована с целью повышения привилегий на системе до уровня суперпользователя и выполнения произвольного кода.

Уязвимость была обнаружена в ходе изучения возможности эксплуатации проблем, приводящих к пересечению содержимого стека и кучи. При смежном размещении стека и кучи не исключены ситуации, когда содержимое переполненной кучи может оказаться в области стека, или стек, наоборот, может переписать область кучи, если куча растет в сторону увеличения, а стек – в сторону уменьшения,

Для предотвращения подобных ситуаций в Linux и других операционных системах используется защитная техника stack guard-page, заключающаяся в подстановке граничных страниц памяти, обращение к которым приводит к генерации исключения (page-fault). Данная защита была представлена после того, как в 2005 и 2010 годах был выявлен ряд уязвимостей в блоке управления памятью.

В ходе исследования эксперты выявили множественные уязвимости в реализации «сторожевой страницы» (guard-page), основной из которых является CVE-2017-1000364, и выделили три метода атаки:

– Столкновение стека с другой областью памяти: выделение памяти производится до тех пор, пока стек не достигнет другой области памяти или память не достигнет стека;

– «Прыжок» через сторожевую страницу: указатель стека перемещается из стека в другую область памяти не затрагивая страницу защиты памяти;

– Разбиение стека или другой области памяти: производится перезапись стека содержимым другой области памяти либо другой области памяти содержимым стека.

Для демонстрации уязвимостей исследователи подготовили 15 рабочих PoC-эксплоитов, позволяющих повысить привилегии на системе посредством различных приложений в Debian, CenOS, Fedora, Ubuntu, OpenBSD, NetBSD, FreeBSD, Solaris. Эксплоиты были протестированы на платформах под управлением процессоров с архитектурой х86-64.

Большинство разработчиков затронутых дистрибутивов уже представили обновления, исправляющие вышеуказанную проблему. В качестве временной меры по предотвращению эксплуатации уязвимости предлагается пересобрать и переустановить все приложения и динамические библиотеки в пространстве пользователя с использованием функции -fstack-check в GCC.

Стек – область оперативной памяти, которая создается для каждого потока. Он работает в порядке LIFO (Last In, First Out), то есть последний добавленный в стек фрагмент памяти будет первым в очереди на вывод из стека. Каждый раз, когда функция объявляет новую переменную, она добавляется в стек, а когда эта переменная пропадает из области видимости (например, когда функция заканчивается), она автоматически удаляется из стека.

Куча – хранилище памяти, также расположенное в ОЗУ, которое допускает динамическое выделение памяти и не работает по принципу стека.