Уязвимости Meltdown и Spectre

Четвертого января 2018 года стало известно о масштабной концептуальной уязвимости, которая присутствует в большинстве процессоров Intel и позволяет любой непривилегированный программе получить доступ к данным, которые хранятся в оперативной памяти компьютера. Эта уязвимость получила название Meltdown. Чуть позже был обнаружен способ эксплуатации этой уязвимости почти на всех процессорах, который получил название уязвимость Spectre.

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

С чего все началось?

Нет, история началась не четвертого января. Еще в 2008 году на securitylab появилась новость о том, что российский специалист по информационной безопасности Крис Касперски обнаружил критическую уязввимость в процессорах Intel, которая позволяет взломать систему удаленно с помощью скрипта на JavaScript или просто через TCP/IP независимо от операционной системы. Исследователь собирался представить работающий код для Windows и Linux и сделать его общедоступным. Но затем все стихло на целых десять лет. Таким образом, можно предположить, что обнаружены уязвимости spectre и meltdown были еще в 2008 году.

Второй раз уязвимость была обнаружена несколькими независимыми группами исследователей, а именно Google Project Zero, Cyberus Technology, и Грацского технического университета летом 2017 года. Все это время данные оставались засекреченными, чтобы разработчики успели придумать и выпустить патчи для защиты от этих уязвимостей. Все это время разработчики Windows и Linux работали вместе над исправлением этих проблем. Публикация данных об уязвимости Meltdown была запланирована на 9 января 2018, но данные утекли в сеть чуть раньше — 4 января. Журналисты из The Register каким-то образом узнали об уязвимости из рассылки разработчиков ядра Linux об исправлении KAISER, которое добавляет изоляцию адресации процессов.

Уязвимости Meltdown и Spectre

Давайте попытаемся разобраться в чем же состоит суть уязвимости Meltdown и Spectre и чего нам стоит бояться. Действительно ли все так страшно, как везде пишут. Сначала нужно понять как работают процессоры. Процессору часто нужно извлекать значения из оперативной памяти или ожидать ввода от пользователя, а это занимает время. Во всех современных процессорах есть блок прогнозирования, который пытается определить какая инструкция будет выполнена дальше. И процессор выполняет эту инструкцию, сохраняя данные в кэше. Давайте рассмотрим небольшой пример. У нас есть переменная с именем «данные», и мы пытаемся прочитать в переменную «данные» какую-либо информацию, к которой у нас нет доступа, например, из ядра системы. Для повышения производительности виртуальная память ядра находится в том же адресном пространстве, что и память процесса:

данные = информация ядра

Естественно, что мы получаем ошибку. А теперь пробуем использовать предсказательное выполнение инструкций. Нам понадобится еще одна переменная, например «размер архива», она будет храниться в оперативной памяти и процессору нужно будет тратить много времени, на то, чтобы ее прочитать. Рассмотрим такой код:

Если (размер архива < 1000) выполнить
данные = информация ядра

Процессору каждый раз приходиться извлекать переменную «размер архива» из памяти, это долго. Поэтому когда мы повторим выполнение этого кода очень много раз, то блок предсказаний будет думать, что и в следующий раз сравнение вернет положительный результат. И уже наперед станет выполнять нашу команду. И тут кроется еще одна проблема. Обычно, процессор сразу проверяет, имеет ли программа право читать данные, от туда, откуда она пытается это делать. Но это долго, поэтому для выполняемых наперед операций эта проверка не успевает выполниться и команда выполняется в любом случае. Результат выполнения команды успешно сохраняется в кэше, а процессор помнит адрес. Далее, приходит значение переменной «размер архива» из памяти и приходит результат проверки полномочий может ли программа читать данные из того адреса. Если да, то все хорошо и данные используются, если же нет, то процессор возвращает ошибку и просто забывает адрес.

Но проблема в том, что в кэше данные все равно остаются. И программе остается только извлечь их оттуда. Что она имеет полное право сделать не вызвав никаких ошибок доступа, останется только узнать по какому адресу расположены данные. А это можно сделать просто замерив время доступа к адресам. Это все может быть реализовано даже на JavaScript, что делает проблему очень глобальной.

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

Это что касается Meltdown, которой присвоен номер CVE-2017-5754, уязвимость Spectre, обнаруженная в процессорах AMD имеет похожий принцип работы. Ей присвоены два идентификатора: CVE-2017-5753 и CVE-2017-5715. Там тоже процессор предугадывает какая инструкция будет выполнена и сохраняет результат в кэше. Но Spectre позволяет только обойти ограничение на доступ к памяти других приложений, к ядру системы доступа нет и реализовать ее сложнее. Этой уязвимости подвержено намного больше процессорных архитектур, не только Intel и AMD, но и ARM. Защититься от Spectre невозможно просто добавив изоляцию, для этого необходимо чтобы каждое приложение само защищало свою память или постоянно сбрасывать кэш. Что, во-первых, требует перекомплирования всех приложений, а во-вторых, снижает производительность. Универсального патча от Spectre пока не существует. Более подробная информация есть на Geektimes.

Как защититься от Meltdown и Spectre в Linux

Разработчики Linux очень сильно потрудились над решением проблемы и эта работа все еще продолжается. Версия ядра 4.14.2 содержит все доступные на данный момент исправления. Через несколько дней выйдет версия 4.14.13 с дополнительными исправлениями багов. Патчи исправлений также были добавлены для стабильных версий ядра 4.4 и 4.9, но эти патчи очень сильно отличаются оттого, что есть в 4.14 и 4.15 и закрывают намного меньше проблем.

Если вы используете Linux с более старым ядром, то патчей для вас нет и не будет. Грег Кроах-Хартман сказал что отсутствие исправлений Meltdown настолько незначительно по сравнению с другими проблемами в этих ядрах, что выпускать его бессмысленно. Если вы используете процессор ARM64 то патчей пока нет, но они будут доступны в ядре 4.15 через несколько недель. Для ARM исправления будут бэкпортированы в ветки 3.18, 4.4 и 4.9. Все что было написано выше — решает уязвимость Meltdown (CVE-2017-5754).

Spectre — это совсем другая история. Универсальных патчей для исправления Spectre пока нет. Это объясняется тем, что все разработчики ядра работали над решением более серьезной проблемы — Meltdown. А также у разработчиков было недостаточно информации о том, что представляет из себя эта уязвимость. Разработчикам потребуется несколько недель чтобы решить эти проблемы. Все усложняется тем, что здесь недостаточно применить одно исправление на уровне ядра, нужно вносить изменения в каждое приложение отдельно. И что-то мне подсказывать что разработчики многих продуктов просто забьют на все это.

Если вы используете Linux не на x86 или ARM, то будьте очень осторожны. Для других платформ патчей пока нет и не предвидеться. Известно что уязвимы не только чипы Intel и AMD, но и Power 8, Power 9, System z и SPARC.

Что касается дистрибутивов, то Red Hat, CentOS, Ubuntu, Debian, ArchLinux, LinuxMint, OpenSUSE и другие уже выпустили патчи для защиты от Meltdown. Вы можете уже сейчас обновить систему или хотя бы ядро и быть спокойным по поводу этой атаки.

sudo apt update && sudo apt full-upgrade
sudo dnf update
sudo yum update

И не забудьте перезагрузить систему после обновления. Со Spectre все намного сложнее. Изменения на уровне ядра, снижающие вероятность атаки тоже уже есть в большинстве дистрибутивов, так что желательно обновиться. Что касается приложений, то разработчики и мэйнтейнеры работают над исправлениями. За исправлением meltdown и spectre Ubuntu вы можете следить на этих страницах CVE-2017-5753  и CVE-2017-5715. На данный момент Firefox 57.0.4 уже исправлен, а чтобы включить защиту в Chromium необходимо открыть вкладку chrome://flags и включить параметр «Strict site isolation»:

Уязвимости meltdown и spectre

Далее, еще можно обновить видео драйвер NVIDIA до версии 384.111. Это пока что все, что доступно для защиты.

Как проверить уязвимость системы

Дальше поговорим о том как проверить на уязвимость spectre и meltdown. Вы можете посмотреть защищена ли ваша система от Meltdown, проверив включена ли изоляция на уровне ядра. Для этого можно использовать несколько команд:

grep CONFIG_PAGE_TABLE_ISOLATION=y /boot/config-`uname -r` && echo "patched :)" || echo "unpatched :("

Уязвимости meltdown и spectre

Если команда выдает unpatched — значит вы все еще уязвимы. Другая команда для той же цели — посмотреть конфигурационный файл запущенного ядра:

zgrep CONFIG_PAGE_TABLE_ISOLATION /proc/config.gz

 

Или посмотреть в лог dmesg:

dmesg | grep "Kernel/User page tables isolation: enabled"

Уязвимости meltdown и spectre

Опять же, если такой строчки нет — значит изоляция отключена и вы в опасности. Также существует скрипт, который можно использовать для проверки как Spectre, так и Meltdown. Для его загрузки вам понадобится git:

git clone https://github.com/speed47/spectre-meltdown-checker.git
cd spectre-meltdown-checker/
chmod +x spectre-meltdown-checker.sh
sudo ./spectre-meltdown-checker.sh

Уязвимости meltdown и spectre

Проверить уязвим ли ваш браузер для Spectre и Meltdown вы можете с помощью этого сервиса.

Выводы

Разработчики тоже люди и время от времени они ошибаются одним из примеров таких ошибок можно считать уязвимости Meltdown и Spectre. Нам остается только заботиться о своей безопасности, вовремя обновлять операционную систему и программы чтобы защитить свои данные от злоумышленников. Во всяком случае, теперь вы знаете как защититься meltdown и spectre.

Видео с объяснением сути уязвимости от Дмитрия Бачило:

Creative Commons License
Статья Уязвимости Meltdown и Spectre распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.
Ваше имя тоже может быть здесь. Начните писать статьи для Losst. Это просто! Смотрите подробнее как начать писать статьи - Пишите для нас

Оцените статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (5 оценок, среднее: 5,00 из 5)
Загрузка...

9 комментариев

  1. Игорь Январь 11, 2018 Ответить
    • Oleg Январь 13, 2018 Ответить
      • admin Январь 13, 2018 Ответить
  2. JnB Январь 11, 2018 Ответить
  3. Евген Январь 11, 2018 Ответить
  4. Vlad Январь 12, 2018 Ответить
  5. Valery Январь 12, 2018 Ответить
  6. гость Январь 13, 2018 Ответить
  7. Дмитрий Январь 14, 2018 Ответить

Ответить