Как отключить защиту от Spectre: в ядро Linux добавили новый параметр
В ядре Linux появился флаг, который отключает защиту от уязвимости Spectre v4 во всех дочерних процессах, запущенных на сервере. Подробнее о новом параметре — под катом.
/ Flickr / Rie H / CC BY / Фото изменено
Зачем вообще понадобилось отключать защиту
О группе уязвимостей процессоров Spectre впервые стало известно в начале 2018 года, и на протяжении следующих месяцев это семейство пополнялось новыми «дырами» в безопасности. Уязвимости связаны с работой систем, повышающих производительность процессоров — спекулятивным выполнением записи и чтения и предсказанием переходов — и позволяют злоумышленникам обходить механизмы изоляции памяти в процессорах от Intel и AMD.
Для закрытия уязвимостей разработчики операционных систем выпускают патчи, однако их установка часто приводит к снижению скорости работы серверов. Например, на Linux-машинах некоторые патчи от Spectre снижают производительность на 30–50%.
Проблемой оказались недовольны системные администраторы, особенно в крупных дата-центрах. Они начали просить разработчиков ядра Linux дать возможность выборочно отключать защиту от Spectre. Некоторые из обнаруженных уязвимостей носят лишь теоретический характер, а в ряде систем они в принципе не могут нанести вреда. К примеру, рендер-фермы и офлайн-суперкомпьютеры отключены от интернета, поэтому им не страшны инъекции вредоносного кода.
Команда Linux пошла навстречу пользователям и представила несколько функций, отключающих защиту от уязвимостей Spectre v1, v2 (подробнее о них мы расскажем дальше) и v4. Последнюю из них представили в начале февраля для всех актуальных версий ядра — это новый флаг PR_SPEC_DISABLE_NOEXEC.
Что и зачем отключает функция
Уязвимость Spectre v4 называется Speculative Store Bypass. Она позволяет вредоносным программам получить доступ к результатам спекулятивного вычисления, которые процессор ранее отбросил как ненужные.
Такая ситуация происходит, когда CPU по очереди выполняет операции чтения и записи с использованием косвенной адресации. Чтение происходит чаще записи, и процессор может использовать данные из памяти для определения адреса чтения, не дожидаясь вычисления смещения косвенной адресации. Если после вычисления смещения обнаруживается пересечение областей памяти для записи и чтения (то есть чтение было выполнено не из той области), то вторая операция выполняется заново, а спекулятивный результат отбрасывается.
В теории получается, что если злоумышленнику известны адреса и структура ячеек памяти, он может извлечь из них данные, например ключи шифрования.
Патч для Spectre v4 появился в ядре Linux спустя несколько дней после публикации информации об уязвимости — он по умолчанию отключал функцию memory disambiguation, которая разрешала внеочередное выполнение команд. Но это замедлило операции ввода-вывода процессора на 10–40%.
/ Flickr / Rie H / CC BY-SA
А в начале июня 2018 года в релизе ядра 4.17 появилась возможность отключить эту защиту. Оставалась одна проблема: параметр не передавался от родительского процесса к дочерним. Для них защиту приходилось отключать вручную, что доставляло системным администраторам неудобства. Но в начале февраля разработчики ядра реализовали флаг PR_SPEC_DISABLE_NOEXEC. Он дополняет предыдущую функцию и копирует режим работы патча от Spectre v4 из родительского процесса в дочерние. PR_SPEC_DISABLE_NOEXEC является частью prctl, и включить её можно при запуске любого нового процесса.
Что говорят эксперты
В рассылке для разработчиков ядра Linux о введении нового флага написал Уэйман Лонг (Waiman Long) из Red Hat. По его словам, защита от Spectre v4 значительно влияет на производительность приложений, которые выполняют много операций записи, например баз данных. PR_SPEC_DISABLE_NOEXEC поможет автоматизировать проверку на отключение патча и ускорить серверы с большим числом одновременно запущенных процессов.
При этом участники ИТ-сообщества отмечают, что в определенных ситуациях неосторожное обращение с новым флагом может привести к неприятным последствиям.
«Стоит обратить внимание, что в некоторых средах отключать защиту от Spectre v4 небезопасно, — отмечает начальник отдела развития IaaS-провайдера 1cloud.ru Сергей Белкин. — К ним относятся, например, веб-сервисы, использующие Java и JavaScript. Раскрытие управляемым кодом содержимого управляющего процесса может быть фатальным для безопасности приложения».
О других Spectre-патчах в ядре Linux
Помимо флага PR_SPEC_DISABLE_NOEXEC в ядре Linux есть и другие параметры, отключающие защиты от Spectre.
Первый из них — nospectre_v2. Функция отключает защиту от Spectre v2, которая даёт злоумышленникам возможность использовать блок предсказания переходов для того, чтобы «заставить» процессор спекулятивно выполнить операцию в конкретном модуле памяти. Для защиты патч отключает функцию косвенного прогнозирования переходов и запрещает перенос полученной информации между потоками в одном ядре CPU.
Отключение защиты приводит к повышению производительности процессоров на 30% — именно настолько она упала после установки патча от Spectre v2. Новую функцию поддержал даже создатель Linux Линус Торвальдс (Linus Torvalds). По его словам, уязвимость угрожает только процессорам с функцией SMT, в этом конкретном случае будет выгоднее отключить её.
Второй параметр — nospectre_v1 — отключает защиту от первого варианта Spectre. Хакеры с помощью вредоносов способны заставить процессор неверно предсказать результат условного перехода и отбросить результаты спекулятивных вычислений в нужную хакерам область памяти. Хотя патч от v1 незначительно влияет на производительность (по некоторым данным, снижением скорости процессора можно вовсе пренебречь), разработчики попросили добавить в ядро возможность отключить и эту защиту. Это позволило упростить структуру изолированных от внешнего доступа сетей.
Сообщество разработчиков ядра Linux остаётся верным идее свободного выбора, которую в самом начале заложил Линус Торвальдс: пользователи сами ответственны за баланс безопасности и производительности Linux-систем. Поэтому стоит ожидать, что и при обнаружении новых похожих на Spectre уязвимостей в ядре появится как патч, так и возможность отключить его.