November 26, 2018

Meltdown и Spectre — что это, и как защититься? Ч.1.

Шалом, бегущие в тенях! Привет, случайный подписчик. Сегодня поговорим о двух самых жестоких уязвимостях текущего десятилетия. А то что-то давно я вам не напоминал, что безопасность, сука, решает.

Поехали:

В современных процессорах обнаружены две новые уязвимости, называемые Meltdown (CVE-2017-5754) и Spectre (CVE-2017-5753 и CVE-2017-5715). Атака с применением этих уязвимостей позволяет получить доступ к защищенной памяти из кода, который не обладает соответствующими правами.

Суть уязвимости, заключается в том, что процессоры Интел при спекулятивном выполнении кода не выполняют проверки на безопасность инструкций, которые позволяют читать сегменты памяти, что позволяет любому пользовательскому приложению получить доступ к памяти ядра.

Meltdown и Spectre

Meltdown и Spectre — худшие уязвимости IT за последние много лет. Heartbleed и Krack по сравнению с ними — детский сад.

Пожалуй, самое оче��идное и неприятное применение на данный момент — получение дампа системной памяти во время выполнения JavaScript. Это означает, что вредоносный скрипт может получить доступ к памяти и вытащить пароли, информацию об учетной записи, ключи шифрования, т.е. теоретически все, что хранится в памяти.

Уязвимость Meltdown

Эту уязвимость независимо друг от друга описали специалисты из Google Project Zero, Cyberus Technology и Грацского технического университета (Австрия), а также упомянутый выше криптограф Пол Кёхер. Вместе они обнаружили универсальный способ, позволяющий обойти разграничение адресов пользовательских и системных процессов в памяти.

3 января 2018 года они опубликовали описание уязвимости «злонамеренная загрузка данных в кеш» CVE-2017-5754, которая и получила название Meltdown из-за того, что «расплавляет» разграничение доступа к страницам памяти. Она нарушает базовый механизм безопасности из-за внеочередного исполнения процессорных инструкций и упреждающей загрузки данных в кеш.

Суть атаки такова:

  1. Зловред запускается и очищает процессорный кеш.
  2. Он создает в оперативной памяти массив из 256*4096 элементов. Номера строк массива отражают все возможные значения одного байта (0 – 255).
  3. Массив точно не попадает в кеш из-за размера и потому, что к нему еще не обращались.
  4. Троян объявляет переменную tmp и просит записать в нее значение байта, хранящегося по закрытому для него адресу другого процесса. Так делать нельзя, но, пока MMU это выяснит, конвейер обработает инструкцию на упреждение и подтянет запрошенные данные в кеш.
  5. Затем троян начинает выборку из своего массива, подставляя в качестве номера строки значение переменной tmp. Так тоже делать нельзя, но проверка условия вновь отложена, а запрошенная строка кешируется.
  6. Две последние операции в итоге заблокируются, и вернется исключение, но прежде из-за внеочередного исполнения инструкций будут обработаны запрещенные команды трояна и кешированы запрошенные им данные.
  7. Процессор просто откажется затем транслировать их трояну, узнав от MMU о ссылке на защищенную область памяти, но не удалит их из кеша.
  8. До обработки исключения троян успеет выполнить легальную операцию — чтение из ранее созданного массива, замеряя время получения каждой строки. Только строка, чей номер соответствует кешированному значению, прочитается быстрее других. Остальные будут загружаться из оперативной памяти в разы медленнее.

Последовательно выполняя атаку для других адресов, можно воссоздать в адресном пространстве трояна полную копию пароля, ключа или других данных в памяти, доступ к которым заблокирован.

Формально никаких нарушений безопасности при этом не происходит. Троян выполняет чтение только из своего адресного пространства, получая отказ при попытке доступа к памяти других процессов. Просто обработка исключения происходит не сразу, а запрошенные данные кешируются. Разница во времени чтения собственных данных позволяет трояну узнать, какое значение процессор кешировал, но не дал прочитать напрямую.

Уязвимость Spectre

Уязвимость Spectre была совместно описана десятью авторами. Среди них есть исследователи Meltdown, работу которых дополнили эксперты из отдела криптографии Rambus и разных университетов.

Данная атака более универсальна и потенциально имеет несколько сценариев реализации. Авторы приводят два наиболее очевидных:

  • Проверка обхода границ массива CVE-2017-5753.
  • Инъекция целевой ветви CVE-2017-5715.

Вспоминая выше устройство процессора, мы намеренно пропустили важные элементы: модуль предсказания ветвлений (branch prediction unit) и блок предсказания адреса (branch target predictor), как несущественные для понимания механизма атаки Meltdown. Однако на манипуляциях с ними основаны разные сценарии использования Spectre.

Если среди инструкций встречается условный переход (if, switch), а в конвейере есть свободные исполнительные блоки (практически всегда), то варианты ветвления начинают обрабатываться еще до реальной проверки условия. Это экономит время, потому что обычно для проверки требуется потратить сотни процессорных тактов на загрузку данных, которые находятся где-то в оперативной памяти или вообще лежат в свопе на диске.

Процессору быстрее просчитать наиболее вероятный вариант ветвления заранее, а потом подставить его целиком или полностью отбросить неверную ветвь, если вдруг предсказание окажется неверным. При этом все, что успело подтянуться в кеш, в нем и остается.

Проблема состоит в том, что для предсказания ветвлений используется статистическая модель. Процессор каждый раз запоминает результат проверки типового условия и в зависимости от этого решает, какое ветвление алгоритма будет статистически более вероятным, начиная внеочередное исполнение инструкций выбранной ветви.

Среди этих инструкций может быть что угодно, включая чтение ключа по известному адресу в памяти. Троян такое действие выполнить не может, но он способен спровоцировать кеширование ключа самой легитимной программой, просто натренировав предсказатель ветвления.

Код современных программ имеет много шаблонных фрагментов, поэтому обычно у целевой программы (например, популярного менеджера паролей) можно найти какой-то стандартный кусок кода с пользовательским вводом и условным переходом.

Для первого варианта реализации Spectre пишется малварь (про малварь мы ещё подробно расскажем на нашем канале), в которой будет участок кода, сходный с целевым. Он «тренирует» предсказатель ветвлений, заставляя его много раз проверять валидность условия, аналогичного переходу в атакуемой программе.

В своей (вредоносной) программе мы можем сделать так, что выбранное условие всегда будет истинным. Когда накопится достаточная статистика условных переходов, блок предсказания ветвления начнет считать, что это типовое условие, которо�� в большинстве случаев проходит проверку.

При обработке инструкций атакуемой программы поведение «натренированного» предсказателя ветвлений станет аналогичным. Если теперь в ней задать неверное условие (например, ввести неверный мастер-пароль), то она все равно начнет выполнять его как истинное. Потом, конечно, опомнится и сбросит конвейер, замолчав как партизан, но ошибочно запрошенные данные (ключ расшифровки) останутся в кеше.

Техника их получения зловредом из кеша аналогична рассмотренной в атаке Meltdown с той лишь разницей, что троян вообще не обращался к заблокированной для него области памяти. Он лишь натаскал предсказатель переходов так, что уже легитимная программа сама потащила в кеш конфиденциальные данные, не успев проверить типовое условие.

Вторая разновидность атаки Spectre выглядит очень похоже. Разница лишь в том, что вместо модуля предсказания ветвлений «тренируется» блок предсказания адреса с собственным буфером. Фактически атака идет на кеш через branch target buffer. Он подставляет виртуальные адреса, которые нужны для выполнения косвенных переходов. Они выполняются по какому-то типовому условию, которое мы имитируем в своей программе.

После серии повторений буфер забивается, а блок предсказания адреса начинает считать, что такой участок кода (gadget в терминологии авторов исследования) всегда приводит к косвенному переходу по указанному адресу… и начинает заранее считывать из него данные в кеш.

Поскольку блоки предсказания и кеш есть практически во всех процессорах, атака Spectre затрагивает еще больше разных архитектур. Пока практического подтверждения нет разве что для MIPS и «Эльбруса», но это еще не означает их неуязвимости. Просто сценарий атаки может оказаться менее явным.

Конспирологические теории

Некоторые обозреватели считают найденную уязвимость троянской закладкой, оставленной в процессорах много лет назад. Как говорилось в этой показательной истории, основное условие эффективной закладки — ее массовость. В случае с Meltdown и Spectre данное условие выполняется на 101%.

Авторы исследования допускают, что они далеко не первые, кто обнаружил эту особенность. К примеру, осенью 2008 года Николай Лихачёв (известный под псевдонимом Крис Касперски) готовился выступить на конференции Hack In The Box с докладом о найденной им уязвимости, позволяющей взламывать компьютеры на базе процессоров Intel вне зависимости от используемой операционной системы. Звучит похоже, не правда ли?

«Процессоры содержат недоработки, которые позволяют использовать уязвимости как непосредственно сидя за компьютером, так и дистанционно, вне зависимости от установленных обновлений и приложений», — писал он в анонсе. Однако доклад так и не был представлен. Крис улетел в США, стал работать на подконтрольную Intel компанию McAfee, а позже разбился при странных обстоятельствах.

Если наточить бритву Оккама поострее, то внимание на себя обратит другой факт: уже давно предполагалось, что внеочередное исполнение команд подрывает базовое разграничение привилегий, известное как кольца защиты. Суть этой модели безопасности в том, что отдельные процессорные инструкции могут выполняться только в наиболее привилегированном нулевом кольце, где властвует ядро ОС (а также продвинутые отладчики вроде SoftIce и руткиты уровня ядра).

Следующие кольца с номерами один и два менее привилегированные. Они отданы драйверам, а также гипервизорам, эмуляторам, песочницам и прочим системам виртуализации. Что именно там будет выполняться — зависит от ОС. Например, Windows 7 вообще не использует первое и второе кольцо, ограничиваясь нулевым и третьим.

В любой ОС все пользовательские процессы запускаются в непривилегированном (обычно последнем) кольце защиты. В реальной ОС они обращаются к системным процессам и физическим устройствам через драйверы, а в виртуальной — через гипервизоры, когда им нужно выполнить какую-то из зарезервированных инструкций. Ядро ОС проверяет легитимность системных вызовов (syscalls) и выполняет либо отклоняет запросы приложения. Чтобы далеко не бегать за данными для проверки, их часто помещают в соседний диапазон виртуальной памяти, выделяемой пользовательскому процессу. Просто у него стоит бит-идентификатор привилегий уровня ядра, и прочитать их напрямую процесс из userspace не может.

Например, ядро заблокирует для приложения trojan.exe или malware.js чтение из оперативной памяти по адресам, ранее выделенным для chrome.exe. Троян останется в своей песочнице и не прочитает пароли из браузера с наскока. Чтобы сделать это, ему пришлось бы использовать какой-то обходной путь. Например, отдельный лоадер, который внедрит DLL в процесс chrome.exe, повысит привилегии трояна в обход sandbox, UAС и прочих защитных механизмов. На произвольной системе это сделать довольно сложно, поэтому проще использовать социальную инженерию и спровоцировать пользователя выполнить необходимые автору трояна действия вручную. Это был приоритетный механизм атаки до появления Meltdown и Spectre.

С новыми уязвимостями трояну больше не нужно идти сложным путем или рассчитывать на беспечность пользователя. Вместо этого он использует внеочередное исполнение процессорных инструкций для того, чтобы получить в своей области памяти копию данных по любому заблокированному адресу.

FAQ по Meltdown и Spectere

Список вопросов и ответов касаемо уязвимостей Meltdown и Spectre:

Влияет ли на меня данная уязвимость?

Конечно, да.

Могу ли я обнаружить, что кто-то применил атаки Meltdown или Spectre против меня?

Нет. Эксплуатация данных атак не оставляет следов в файлах журнала.

Может ли мой антивирус обнаружить или заблокировать эту атаку?

На данный момент — нет. В отличие от обычных вредоносных программ, Meltdown и Specter почти невозможно отличить от обычных приложений.

Есть ли исправления?

Существуют патчи против Meltdown для Linux (KPTI (ранее KAISER)), Windows и OS X. Также ведется работа по созданию новых патчей.

На какие системы влияет Meltdown?

Атаке Meltdown подвержены любые компьютеры (как стационарные, так и ноутбуки), облачные серверы, смартфоны работающие на всех операционных системах. Каждый процессор Intel выпущенный с 1995 года потенциально подвержен атаке. На данный момент неясно, затронуты ли процессоры ARM и AMD.

05.01.2018 Выяснилось, что процессоры AMD также подвержены атаке Spectre.

На какие облачные провайдеры влияет Meltdown?

На те, которые используют процессоры Intel и Xen PV в качестве виртуализации без применения патчей. Кроме того, облачные провайдеры без реальной виртуализации оборудования, полагающиеся на контейнеры, которые используют одно ядро, например Docker, LXC или OpenVZ, подвержены влиянию.

На сегодня всё, киберсталкеры. В продолжении этой статьи мы рассмотрим более подробно описанные выше уязвимости, а так же возможную защиту от них. Оставайтесь с нами.