Аппаратная уязвимость — Meltdown
Аппаратная уязвимость, обнаруженная в ряде микропроцессоров, в частности, производства Intel и архитектуры ARM. Meltdown использует ошибку реализации спекулятивного выполнения команд (англ.)русск. в процессорах Intel и ARM, из-за которой при спекулятивном выполнении инструкций чтения из памяти процессор игнорирует права доступа к страницам. Уязвимость позволяет локальному атакующему (при запуске специальной программы) получить несанкционированный доступ на чтение к привилегированной памяти (памяти, используемой ядром операционной системы).[1][2][3] Уязвимость не затрагивает микропроцессоры корпорации AMD.[4][5] Атаке был выделен CVE-идентификатор уязвимости CVE-2017-5754[6].
Возможность атаки порождается тремя механизмами, позволяющими ускорить работу процессора, причём каждый из этих механизмов по отдельности не создаёт уязвимости:
Глубокое спекулятивное выполнение операций, в том числе чтения из оперативной памяти без проверки прав доступа процесса к читаемым областям. Если в итоге спекулятивное исполнение будет признано ошибочным, то исключение по доступу к запретной области памяти не генерируется, а результаты загрузки данных в регистры просто отменяются.
Отсутствия очистки кэша от результатов ошибочного спекулятивного исполнения (подобная очистка, вероятно, снизила бы скорость работы процессора). Формально содержимое кэша недоступно программе напрямую; но анализ времени доступа к отдельным ячейкам оперативной памяти может косвенно указать, есть ли конкретные данные в кэше или нет (в данном случае — были ли эти данные загружены при спекулятивном выполнении команд).
Ядро операционной системы держит свои данные в адресном пространстве процесса, защищая их от доступа уровнем привилегий. Данная технология позволяет быстрее исполнять системные вызовы. При таких вызовах повышается уровень привилегий, а при возврате обратно уровень привилегий снова понижается, при этом не требуется перезагружать таблицу страничных дескрипторов.
Современные высокопроизводительные микропроцессоры имеют возможность исполнять новый код, не дожидаясь окончания исполнения предыдущих действий. Например, если инструкция ветвления ожидает получения данных из оперативной памяти для принятия решения, простаивающий процессор может заняться исполнением одного из направлений ветвления (а в некоторых архитектурах — даже обеих ветвей) в надежде иметь готовый результат вычислений к тому моменту, когда результат ветвления станет известен. Эта техника называется спекулятивным исполнением. В случае успешного угадывания, спекулятивно исполненный код изменяет видимые значения регистров (архитектурное состояние), и исполнение продолжится. Если же ветка исполнения была предположена неверно, команды из неё не меняют видимого состояния процессора, и фактическое исполнение будет возвращено к точке ветвления.
Из-за особенностей ряда реализаций, во время спекулятивного исполнения доступ к памяти фактически осуществляется независимо от прав доступа исполняемого процесса к этой памяти; это позволяет исполнять команды, не дожидаясь ответа от контроллера памяти. Если впоследствии эта ветка спекулятивного исполнения окажется правильной, то будет сгенерировано исключение ошибочного доступа к памяти. Если же ветку отбросят как ошибочную, то исключение сгенерировано не будет; но переменные, загруженные в кэш в процессе исполнения ветки, останутся в кэше. Соответственно, авторами атаки был предложен метод анализа наличия данных в кэше (на основании времени доступа к ним), что при правильном построении атаки может дать представление о том, что происходило в отброшенной ветке спекулятивного исполнения и о содержимом более привилегированной памяти.
Существует надежный программный способ борьбы с атакой, при котором в таблице страниц пользовательских процессов не отображаются страницы памяти ядра ОС (за исключением небольшого количества служебных областей памяти ядра), технология Kernel page-table isolation (KPTI). При этом несколько замедляются вызовы со сменой уровня привилегий (в частности, системные вызовы), так как им приходится дополнительно переключаться на другую таблицу страниц, описывающую всю память ядра ОС.
Корпорация Microsoft выпустила экстренное обновление Windows 10 для предотвращения атаки 3 января 2018,[13] ожидается выход аналогичных патчей для других поддерживаемых версий ОС Windows в следующий Вторник Патчей. [14]
Разработчики ядра Linux предложили набор патчей по имени Kernel page-table isolation (KPTI, рабочие названия KAISER, UASS, FUCKWIT), который войдет в ядро версии 4.15 в начале 2018 года и будет портирован в ядро версии 4.14.11.[15][16]
Ядро macOS получило исправление в версии 10.13.2.
В некоторых случаях исправление может снижать производительность ряда функций, например, приложений, очень часто выполняющих системные вызовы. В то же время тесты Phoronix показывают отсутствие замедления в играх, запущенных на Linux с KPTI-патчем[17][18].
0 Comments