/ 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 уязвимостей в ядре появится как патч, так и возможность отключить его.
Посты из нашего корпоративного блога:
Комментарии (10)
Sfinx88
01.03.2019 10:16Вот конкретный я. Обычный юзер убунту. Как мне отключить эту защиту? Я предпочитаю производительность безопасности. Это осознанный выбор.
serf
01.03.2019 11:16+1Если вы задумались о вопросе только увидев эту статью, то производительности вам и так хватало.
powerman
01.03.2019 18:48Скорее всего, просадка производительности при обычном использовании убунты на десктопе — слишком незначительная (единицы процентов), чтобы это можно было визуально заметить, и чтобы ради этого стоило заморачиваться. А вот на сервере БД расклад будет совсем другой.
arheops
01.03.2019 14:08Тоесть только хардкор, только перекомпиляция ядра?
Я, например, не готов перекомпилировать ядро каждый раз когда выходят патчи на моем сервере БД.powerman
01.03.2019 18:45Зачем ядро перекомпилировать? Всё управляется параметрами ядра, которые можно передать из grub при загрузке.
arheops
01.03.2019 20:44Вот. Я не нашел информации, как это сделать и проверить результат.
Поделитесь?powerman
02.03.2019 00:05Почитайте про параметры
[no]spec_store_bypass_disable
,nospectre_v1
и[no]spectre_v2
в доке ядра (обычно в/usr/src/linux/Documentation/admin-guide/kernel-parameters.txt
).
Что до проверки результата — погоняйте тесты/бенчмарки тех операций, которые типичны для задач этого компа. Например, если много компилируете, то неплохой тест это полная перекомпиляция ядра. Если это сервер БД — погонять какие-то тесты БД. Если это рабочая станция, то всё сложнее — можно разве что попытаться оценить "на глаз" есть ли видимая разница в скорости работы, но учитывая психологию очень высока вероятность того, что субъективно покажется что вариант без этих защит работает быстрее, в то время как на самом деле заметной разницы нет… поэтому лучше если выбирать загружается комп с этими параметрами или без них будет кто-то другой (и не скажет Вам что именно загрузил), чтобы Вы не знали включены ли защиты сейчас, и оценивали скорость работы в режиме слепого тестирования.
arheops
02.03.2019 00:13Ага, спасибо, нашел.
В rhel7 надо поставить kernel-doc и файлик называется
/usr/share/doc/kernel-doc-X.XX.0/Documentation/kernel-parameters.txt
yerden
02.03.2019 12:15Обычно, если выходят патчи на ядро, его обновляют из репозитория дистрибутива. Я думал, мода на linux from scratch и перекомпиляцию ядра давно прошла. Тем более на боевых серверах.
geoolekom
Как сделать сисадминов Linux счастливыми? Надо отобрать у них 30% производительности серверов, а потом вернуть как было.