Meltdown (уязвимость)
Meltdown — аппаратная уязвимость категории утечка по стороннему каналу, обнаруженная в ряде микропроцессоров, в частности, производства Intel и архитектуры ARM. Meltdown использует ошибку реализации спекулятивного выполнения команд (англ.) (рус. в некоторых процессорах Intel и ARM (но не AMD[1][2]), из-за которой при спекулятивном выполнении инструкций чтения из памяти процессор игнорирует права доступа к страницам.
Уязвимость позволяет локальному атакующему (при запуске специальной программы) получить несанкционированный доступ на чтение к привилегированной памяти (памяти, используемой ядром операционной системы)[3][4][5].
Атаке был выделен CVE-идентификатор уязвимости CVE-2017-5754[6].
ИсторияПравить
Об уязвимости в процессорах Intel ещё в 2008 году предупреждал Крис Касперски о чём он пытался сообщить на конференции [1]. Лишь спустя годы, атака Meltdown была независимо обнаружена исследователями из Google Project Zero[en], Cyberus Technology, и Грацского технического университета в середине 2017 года и несколько месяцев находилась на стадии закрытого обсуждения и исправления. Публикация подробной информации и исправлений была запланирована на 9 января 2018 года, но детали уязвимости были обнародованы 4 января 2018 года одновременно с атакой Spectre, из-за публикаций журналистов The Register[7], которые узнали об исправлениях KAISER/KPTI из списка рассылки ядра Linux[8].
Краткое описаниеПравить
Возможность атаки порождается тремя механизмами, позволяющими ускорить работу процессора, причём каждый из этих механизмов по отдельности не создаёт уязвимости:
- Глубокое спекулятивное выполнение операций, в том числе чтения из оперативной памяти без проверки прав доступа процесса к читаемым областям. Если в итоге спекулятивное исполнение будет признано ошибочным, то исключение по доступу к запретной области памяти не генерируется, а результаты загрузки данных в регистры просто отменяются.
- Отсутствие очистки кэша от результатов ошибочного спекулятивного исполнения (подобная очистка, вероятно, снизила бы скорость работы процессора). Формально содержимое кэша недоступно программе напрямую; но анализ времени доступа к отдельным ячейкам оперативной памяти может косвенно указать, есть ли конкретные данные в кэше или нет (в данном случае — были ли эти данные загружены при спекулятивном выполнении команд).
- Ядро операционной системы держит свои данные в адресном пространстве процесса, защищая их от доступа уровнем привилегий. Данная технология позволяет быстрее исполнять системные вызовы. При таких вызовах повышается уровень привилегий, а при возврате обратно уровень привилегий снова понижается, при этом не требуется перезагружать таблицу страничных дескрипторов.
Современные высокопроизводительные микропроцессоры имеют возможность исполнять новый код, не дожидаясь окончания исполнения предыдущих действий. Например, если инструкция ветвления ожидает получения данных из оперативной памяти для принятия решения, простаивающий процессор может заняться исполнением одного из направлений ветвления (а в некоторых архитектурах — даже обеих ветвей) в надежде иметь готовый результат вычислений к тому моменту, когда результат ветвления станет известен. Эта техника называется спекулятивным исполнением. В случае успешного угадывания, спекулятивно исполненный код изменяет видимые значения регистров (архитектурное состояние), и исполнение продолжится. Если же ветка исполнения была предположена неверно, команды из неё не меняют видимого состояния процессора, и фактическое исполнение будет возвращено к точке ветвления.
Из-за особенностей ряда реализаций, во время спекулятивного исполнения доступ к памяти фактически осуществляется независимо от прав доступа исполняемого процесса к этой памяти; это позволяет исполнять команды, не дожидаясь ответа от контроллера памяти. Если впоследствии эта ветка спекулятивного исполнения окажется правильной, то будет сгенерировано исключение ошибочного доступа к памяти. Если же ветку отбросят как ошибочную, то исключение сгенерировано не будет; но переменные, загруженные в кэш в процессе исполнения ветки, останутся в кэше. Соответственно, авторами атаки был предложен метод анализа наличия данных в кэше (на основании времени доступа к ним), что при правильном построении атаки может дать представление о том, что происходило в отброшенной ветке спекулятивного исполнения и о содержимом более привилегированной памяти.
МеханизмПравить
Атака может быть проведена примерно следующим образом.[9]
Для того, чтобы прочитать бит 0 из защищённой области памяти Ap, атакующий:
- Очищает кеш для адресов A0u и A1u (из адресного пространства атакующего, доступного для чтения/записи)
- Выполняет ветвление по условию, заведомо известному атакующему
- В ветке кода, которая, по условию, никогда выполняться не должна (но будет выполнена при спекулятивном выполнении):
- Читает значение V(Ap) из защищённой области памяти по адресу Ap
- Посредством выполнения побитовой операции над значением V(Ap) получает адрес A0u либо A1u
- Читает память по полученному адресу (A0u или A1u)
При обычном выполнении шаг 4 вызывает ошибку защиты, однако на этапе спекулятивного выполнения на уязвимых архитектурах эта ошибка временно игнорируется, продолжая выполнение шагов 5 и 6. В результате в кеш загружается одно из значений — с адреса A0u или A1u. Выяснив условие ветвления, процессор аннулирует все результаты выполнения шагов 4, 5 и 6, но состояние кеша остается неизменным.
После этого атакующему достаточно прочитать «свои» адреса A0u и A1u, измеряя время доступа к ним. И на основании замеров определить, какой бит (0 или 1) был прочитан из защищённой области памяти Ap.
Повторяя этот алгоритм для других битов значения V(Ap), можно получить всё содержимое защищённой области памяти целиком.
ВлияниеПравить
По мнению исследователей, «любой микропроцессор корпорации Intel, реализующий внеочередное исполнение, потенциально подвержен атаке, то есть любой процессор с 1995 года (за исключением Intel Itanium и Intel Atom, выпущенных до 2013 года).»[10]
Уязвимость, как ожидается, может затронуть крупнейших мировых облачных провайдеров, в частности, Amazon Web Services (AWS)[11], Google Cloud Platform, Microsoft Azure. Облачные провайдеры позволяют различным пользователям запускать свои приложения на общих физических серверах. Так как программы могут обрабатывать конфиденциальные данные пользователей, используются меры защиты и изоляции, предоставляемые процессором, для предотвращения несанкционированного доступа к привилегированной памяти (используемой ядром ОС). Атака Meltdown при использовании на системах, не реализующих программной защиты (патчей), позволяет обойти некоторые меры изоляции памяти и получить доступ на чтение к памяти операционной системы.
Один из авторов публикации об уязвимости указывает, что системы паравиртуализации (Xen) и контейнерные системы (Docker, LXC, Openvz, и т. п.) также подвержены атаке[12]. Системы с полной виртуализацией позволяют пользовательским приложениям читать лишь память гостевого ядра, но не память хост-системы.
Программные исправленияПравить
Существует надежный программный способ борьбы с атакой, при котором в таблице страниц пользовательских процессов не отображаются страницы памяти ядра ОС (за исключением небольшого количества служебных областей памяти ядра), технология 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].
См. такжеПравить
- Ошибка процессора Pentium FDIV
- Ошибка процессора Pentium F00F
- Строковый молот (англ.) (рус. (Row Hammer) — непреднамеренный побочный эффект в динамической памяти (DRAM), вызывающий незапланированное электрическое межвзаимодействие ячеек памяти
- Spectre — сходная уязвимость процессоров Intel, AMD и ARM, не исправляемая программным патчем KPTI
- TLBleed — уязвимость процессоров Intel, использующая буфер ассоциативной трансляции в качестве побочного канала утечки данных.
ПримечанияПравить
- ↑ Gleixner, Thomas x86/cpu, x86/pti: Do not enable PTI on AMD processors (неопр.) (3 января 2018). Дата обращения: 4 января 2018. Архивировано 28 июня 2020 года.
- ↑ Lendacky, Tom [tip:x86/pti] x86/cpu, x86/pti: Do not enable PTI on AMD processors (неопр.). lkml.org. Дата обращения: 3 января 2018. Архивировано 3 августа 2020 года.
- ↑ Metz, Cade. Researchers Discover Two Major Flaws in the World’s Computers (англ.), The New York Times (2018). Архивировано 3 января 2018 года. Дата обращения: 4 января 2018.
- ↑ Intel’s processors have a security bug and the fix could slow down PCs, The Verge. Архивировано 3 января 2018 года. Дата обращения: 4 января 2018.
- ↑ Linux Gaming Performance Doesn't Appear Affected By The x86 PTI Work - Phoronix (англ.). www.phoronix.com. Дата обращения: 3 января 2018. Архивировано 20 февраля 2021 года.
- ↑ CVE-2017-5754 Systems with microprocessors utilizing speculative execution and indirect branch prediction may allow unauthorized disclosure of information to an attacker with local user access via a side-channel analysis of the data cache. (неопр.) Дата обращения: 6 января 2018. Архивировано из оригинала 6 января 2018 года.
- ↑ Архивированная копия (неопр.). Дата обращения: 4 января 2018. Архивировано 7 апреля 2018 года.
- ↑ Understanding Meltdown & Spectre: What To Know About New Exploits That Affect Virtually All CPUs (неопр.). Дата обращения: 6 января 2018. Архивировано 6 января 2018 года.
- ↑ Meltdown (неопр.) (PDF). Meltdown and Spectre 8 sec. 5.1. Дата обращения: 4 января 2018. Архивировано 4 января 2018 года.
- ↑ Meltdown and Spectre: Which systems are affected by Meltdown? (англ.). meltdownattack.com. Дата обращения: 3 января 2018. Архивировано 3 января 2018 года.
- ↑ Processor Speculative Execution Research Disclosure (англ.). Amazon Web Services, Inc.. Дата обращения: 3 января 2018. Архивировано 4 января 2018 года.
- ↑ Cyberus Technology Blog - Meltdown (неопр.). Дата обращения: 4 января 2018. Архивировано 4 января 2018 года.
- ↑ Warren, Tom Microsoft issues emergency Windows update for processor security bugs (неопр.). The Verge. Vox Media, Inc.. Дата обращения: 3 января 2018. Архивировано 3 января 2018 года.
- ↑ Kernel-memory-leaking Intel processor design flaw forces Linux, Windows redesign (англ.), The Register. Архивировано 7 апреля 2018 года. Дата обращения: 4 января 2018.
- ↑ Corbet, Jonathon KAISER: hiding the kernel from user space (неопр.). LWN (15 ноября 2017). Дата обращения: 3 января 2018. Архивировано 8 декабря 2020 года.
- ↑ Corbet, Jonathon The current state of kernel page-table isolation (неопр.). LWN (20 декабря 2017). Дата обращения: 3 января 2018. Архивировано 4 января 2018 года.
- ↑ NVIDIA Gaming Performance Minimally Impacted By KPTI Patches — Phoronix
- ↑ Linux KPTI Tests Using Linux 4.14 vs. 4.9 vs. 4.4 — Phoronix
СсылкиПравить
- Официальный сайт атак Spectre и Meltdown (англ.)
- Статья «Meltdown» (англ.)
- Google Project Zero: Reading privileged memory with a side-channel (англ.)
- Intel Analysis of Speculative Execution Side Channels Whitepaper, Intel, January 2018 (англ.)
- Artem S. Tashkinov. Раскрыты подробности двух атак на процессоры Intel, AMD и ARM64 (рус.). OpenNET (4 января 2018). Дата обращения: 6 января 2018.
- Новогодние подарки, часть первая: Meltdown — блог пользователя olartamonov, 5 января 2018 года, Geektimes.