30 Марта, 2018

Дырявые CPU: все что есть сегодня об Meltdown и Spectre

Иван Пискунов
Как все началось в январе 2018

Отгремели новогодние праздники и в мире ИБ год начался с плохих новостей, в первых числах января 2018 года ИТ-сообщество узнало о глобальных уязвимостях Meltdown и Spectre, которым подвержены практически все современные процессоры и, следовательно, устройства (телефоны, планшеты, встраиваемая техника и т.д.).
Как показала практика, сами уязвимости – это еще не самое страшное, что произошло, так как вскоре оказалось, что исправить эти баги очень и очень трудно - патчи выпущенные вендорами были зачастую несовместимы с антивирусными решениями, вызывают отказ в работе некоторых систем, провоцируют BSOD и частые перезагрузки , а также снижают производительность как отдельных машин таки целых ЦОД.



Greetz!:)

Отельное спасибо журналу ][акер, Хабру и экспертам ИБ любезно поделившимися своим мнением и материалами для публикации.

Что за аппаратные проблемы были найдены?

Meltdown — аппаратная уязвимость, обнаруженная в ряде микропроцессоров, в частности, производства Intel и архитектуры ARM. Meltdown использует ошибку реализации спекулятивного выполнения команд  в процессорах Intel и ARM, из-за которой при спекулятивном выполнении инструкций чтения из памяти процессор игнорирует права доступа к страницам.
Уязвимость позволяет локальному атакующему (при запуске специальной программы) получить несанкционированный доступ на чтение к привилегированной памяти (памяти, используемой ядром операционной системы). Атаке был выделен CVE-идентификатор уязвимости CVE-2017-5754 (подробный обзор на Хабре).



Spectre — еще одна аппаратная уязвимость, ошибка в большинстве современных процессоров, имеющих спекулятивное выполнение команд  и развитое предсказание ветвлений, позволяющая проводить чтение данных через сторонний канал в виде общей иерархии кэш-памяти. Затрагивает большинство современных микропроцессоров, в частности, архитектур х86/x86_64 (Intel и AMD) и некоторые процессорные ядра ARM. Уязвимость потенциально позволяет локальным приложениям (локальному атакующему, при запуске специальной программы) получить доступ к содержимому виртуальной памяти текущего приложения или других программ. Угрозе присвоены два CVE-идентификатора: CVE-2017-5753 и CVE-2017-5715 .



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

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






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

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

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

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

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

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

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

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

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

Для тех у кого уже чешутся руки на GitHub есть исходники для эксплуатации
тут MetlDown ,






Meltdown reading process memory knowing only pid
а тут Spectre
Execute the exploit
taskset -c 1 ./exploit [+] Testing for Spectre[+] Dumping memory from 0xffffffffffdfeea8 to 0xffffffffffdfeec2[+] Dumped bytes match the expected value[+] System vulnerable to spectre

Как узнать, есть ли эти уязвимости у меня?

Неполный список уязвимых процессоров можно посмотреть здесь ( листинг аж на 7 страниц, приятного чтения:). Для определения процессора на устройстве можно использовать утилиту CPU-Z (для Windows и Android). Если же у вас Windows, то можно поступить проще: скачать и запустить утилиту InSpectre . Она почти мгновенно протестирует систему и скажет, есть ли уязвимости, а также сообщит о возможном снижении производительности (об этом позже). YES означает, что проблем нет. NO! означает, что проблема есть.


Защита от Meltdown есть, от Spectre нет. Производительность в норме.


Защита от Meltdown есть, от Spectre нет. Производительность может быть пониженной.


Защита от Meltdown и Spectre есть. Производительность в норме.
Но нужно проверить ещё один важный компонент — веб-браузер. Для этого надо зайти на специальный веб-сайт и нажать кнопку Click to Check. Если ниже появится надпись "Your browser is NOT VULNERABLE to Spectre" , то, скорее всего, ваш браузер защищён от Spectre. А вот если результат значится как  "is VULNERABLE" , то уязвимость совершенно точно есть.


Проблем со Spectre в браузере нет.
Проблемы с антивирусами?

Патчи для Windows конфликтуют со многими антивирусами и защитными решениями, что приводит к неполадкам в работе системы, BSOD и другим неприятным последствиям. Дело в том, что разработчики ряда антивирусов использовали для работы своих продуктов весьма спорные техники — их можно приравнять к эксплуатации проблем, с которыми и призваны бороться новые патчи. Так, антивирусы различными способами обходят Kernel Patch Protection, внедряют свои гипервизоры для перехвата системных вызовов (syscalls) и строят предположения об адресах ячеек памяти.



Что можно предпринять самостоятельно для защиты от уязвимостей на своем компе?

Для материнских плат и ноутбуков всех вендоров, версий и голов выпуска можно начать поиск отсюда . Что точно не стоит делать, так это самостоятельно пытаться собрать прошивку или BIOS/UEFI, потому что можно попросту загубить оборудование.

Кроме того, вне зависимости от устройства и ОС крайне желательно установить и/или обновить антивирус. Все остальные программы, а в особенности браузеры, так же стоит обновить до самой последней версии. Желательно сделать это до установки обновлений самой ОС — чтобы избежать проблем с совместимостью.
В Google Chrome также есть экспериментальная функция, помогающая в защите от Spectre. Для её включения нужно перейти в раздел настроек (адрес chrome://flags/), включить (Enable) опцию Strict site isolation и перезапустить браузер.



Intel обещает впредь больше думать о безопасности

Компания Intel, в свою очередь, рассказала о том, что новые модели процессоров будут защищены от проблем, подобных Meltdown и Spectre, на аппаратном уровне.
В частности, глава Intel Брайан Кржанич (Brian Krzanich) сообщил, что встроенной защитой от side-channel атак оснастят серверные процессоры Intel Xeon Scalable (кодовое название Cascade Lake), а также 8 поколение Intel Core. Релиз данных моделей CPU запланирован на вторую половину 2018 года.
Кржанич опубликовал в блоге компании видео, которое можно увидеть ниже. Ролик рассказывает о том, как именно будет реализован эта защита. Так, компания планирует использовать специальные «разделы» и «защитные стены» для физического удержания вредоносного кода в других областях CPU, тем самым не давая малвари осуществить «спекулятивную» атаку в принципе.



Всем удачи, тепла и хорошего настроения!
Следите за новостями в нашем паблике w2hack