На 35-м Chaos Communications Congress, спустя почти год после первой публикации об аппаратных уязвимостях процессоров, получивших названия Meltdown и Spectre, группа исследователей из технологического университета Граца (Австрия) рассказала о том, как сейчас обстоят дела с аппаратными уязвимостями в процессорах. Спойлер: теперь их известно намного, намного больше.
Кратко объясняем суть Meltdown и Spectre
Для начала немного напомним, что это за звери такие — Meltdown и Spectre —и чем они различаются.
Уязвимость Meltdown возникла из-за того, что современные процессоры умеют обрабатывать инструкции вне очереди. Это очень удобно и действительно ускоряет обработку кода, вот только в некоторых случаях процессор успевает обработать тот код, который на самом деле выдает ошибку и который не надо было выполнять. То есть сначала процессор исполняет код, а потом уже выясняется, что эту операцию выполнить невозможно — и такие ситуации случаются именно из-за выполнения инструкций вне очереди.
Конечно, потом результаты этой операции никуда не идут и нигде не используются, но они оставляют следы на микроархитектурном уровне — в кеш-памяти процессора. И их можно оттуда извлечь. Например, это приводит к тому, что из кеша можно достать те данные, к которым не должно быть доступа: скажем, извлечь оставшийся там пароль. Это выглядит так: программа запрашивает доступ к этим данным в памяти — на это она получит вполне резонный ответ от системы, что доступ к ним ей не полагается. Но при этом из-за выполнения операций вне очереди пароль все же будет загружен в кеш, откуда его в результате вполне можно выудить. В общем, Meltdown может возникнуть при попытке выполнить недозволенное действие.
Уязвимость Spectre похожа на Meltdown, но имеет другую причину, впрочем, тоже относящуюся к способам ускорения вычислений в процессоре — она возникла из-за наличия в современных процессорах предсказания ветвлений. По сути, процессор умеет предсказывать с определенной точностью, что после действия A обычно идет действие B, и успевает сделать действие B еще до того, как будут ясны результаты действия A. Если и правда надо было делать B, то все хорошо, ну а если результаты A оказываются такими, что после A нужно было выполнять не B, а C, то процессор забрасывает ту ветвь, где он сделал операцию B, и переходит к другой ветви, где надо делать C.
Поскольку блок предсказания ветвления обучаем, то в большинстве случаев он запоминает закономерности в последовательностях действий — и оказывается, что предсказание ветвлений действительно ускоряет работу (если несколько раз после А надо было делать B, то процессор логично предположит, что и в этот раз после А надо делать именно B). Однако неправильные предсказания тоже случаются (иногда все же надо делать не B, а C, хотя блок предсказания помнит, что после А чаще идет B).
Если долго тренировать систему, показывая ей, что определенная ветвь является правильной и всегда выполняется, а потом поменять параметр так, чтобы она оказалась неверной, то процессор все равно ее сначала выполнит, а затем отменит, поскольку выяснит, что выполняться должна была другая ветвь. Но, как и в случае с Meltdown, результат действия останется, например, в кеш-памяти, и его опять-таки можно будет оттуда извлечь.
Последствия у этой проблемы примерно те же: возможность получить несанкционированный доступ к данным. Spectre может возникнуть только при неправильном предсказании ветвлений — а оно, в свою очередь, возникает просто по теории вероятности.
Год спустя
После обнаружения первых Meltdown и Spectre исследователи стали намного активнее копать в этом направлении и вскоре нашли похожие проблемы, но чуть отличающиеся в деталях. Оказалось, что разработчики процессоров используют и другие оптимизации, которые приводят к появлению Meltdown-подобных или Spectre-подобных уязвимостей. Исследователи из университета Граца упоминают 14 вариаций Meltdown-подобных уязвимостей и 13 Spectre-подобных уязвимостей, итого целых 27 штук разных аппаратных уязвимостей в процессорах — против всего двух из тех же семейств на начало 2018 года.
![За год исследователи нашли 14 вариантов Meltdown и 13 вариантов Spectre](/images/blog/2019-01/e536fd23e7.jpeg)
Классификация найденных за год вариаций Meltdown и Spectre
Более того, хотя раньше, например, AMD заявляла, что ее процессоры не подвержены уязвимостям класса Meltdown, исследователи смогли обнаружить вариант Meltdown (его назвали Meltdown-BR), который очень даже работал на процессорах AMD. То есть на текущий момент процессоры трех крупнейших мировых разработчиков — AMD, ARM и Intel — подвержены как Meltdown, так и Spectre. Ну или как минимум каким-то из вариаций обоих семейств уязвимостей.
По счастью, немалая часть из всех многочисленных найденных вариаций вообще не работает ни на ARM, ни AMD, ни на Intel — по крайней мере исследователям не удалось заставить их работать. Впрочем, большая часть все же работает хоть где-то.
Еще в январе 2018-го компании начали выпускать патчи для микрокода процессоров, операционных систем и отдельных программ, которые в теории должны были закрыть эти уязвимости. Но к сожалению, Spectre и Meltdown — это аппаратные уязвимости, они существуют на уровне компьютерного «железа», и программными заплатками их полностью просто не исправишь.
Например, одна из «заплаток» была реализована в ядре операционной системы Linux, но, поскольку она очень сильно замедляла работу компьютера, через некоторое время ее удалили из кода системы — с обещаниями, что появится более эффективный патч.
Ну и в целом проблема со Spectre состоит в том, что уязвимыми оказываются разные микроархитектурные компоненты, и для каждого нужно изобретать свой патч. А каждый такой патч негативно влияет на производительность, поскольку требует либо отключения каких-то функций, либо выполнения дополнительных действий.
Собственно, во многих случаях патчи влияют на производительность настолько катастрофическим образом, что система с патчами работает медленнее, чем система, в которой вообще отключены уязвимые компоненты процессора.
![Шутливая картинка про единственный способ полного решения проблемы Meltdown/Spectre](/images/blog/2019-01/36ad3a40ae.png)
Радикальный способ решения проблемы — удаление уязвимой части процессора с помощью высверливания в отмеченном месте (на самом деле это шутка)
Будущее Spectre и Meltdown
В октябре 2018-го Intel объявила о том, что в новых процессорах (речь про поколение, которое появится в 2019 году) на аппаратном уровне будет реализована защита от Spectre и Meltdown. Правда, речь шла всего про две «базовые» версии уязвимостей, а их, как мы выяснили выше, куда больше. AMD также собирается залатать одну из вариаций Spectre в новом поколении процессоров с архитектурой Zen 2, которое должно выйти в 2019-м. ARM тоже обещает исправления на аппаратном уровне, заявляя, что «все грядущие процессоры будут защищены от Spectre-подобных атак».
Это все, конечно, хорошо, вот только речь идет именно о новых устройствах. Тем же, кто приобрел компьютер, смартфон или какое-то другое устройство на базе процессоров Intel, AMD или ARM в 2018 году или раньше, остается устанавливать патчи для всего на свете, которые ощутимо снижают производительность. Вероятно, делать это будут далеко не все.
Производители слишком долго игнорировали уязвимости на аппаратном уровне, оптимизируя процессоры исключительно для повышения производительности, но все такие оптимизации оказываются не совсем бесплатными — что-то удалось улучшить, но где-то при этом добавились проблемы. Теперь же устранять эти уязвимости будет довольно тяжело — слишком уж на глубинном уровне они находятся. Впрочем, и эксплуатировать такие уязвимости довольно непросто — и на это вся надежда. По крайней мере до выхода новых поколений процессоров.