Главная >> Новости >> Уязвимости Meltdown и Spectre

Уязвимости 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.

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

11 комментариев к “Уязвимости Meltdown и Spectre”

  1. и чего делать?
    изоляция включена а уязвимость есть...

    Checking for vulnerabilities against live running kernel Linux 4.14.12-1-MANJARO #1 SMP PREEMPT Sat Jan 6 21:03:39 UTC 2018 x86_64

    CVE-2017-5753 [bounds check bypass] aka 'Spectre Variant 1'
    * Checking count of LFENCE opcodes in kernel: UNKNOWN
    > STATUS: VULNERABLE (only 21 opcodes found, should be >= 70, heuristic to be improved when official patches become available)

    CVE-2017-5715 [branch target injection] aka 'Spectre Variant 2'
    * Mitigation 1
    * Hardware (CPU microcode) support for mitigation: NO
    * Kernel support for IBRS: NO
    * IBRS enabled for Kernel space: NO
    * IBRS enabled for User space: NO
    * Mitigation 2
    * Kernel compiled with retpoline option: NO
    * Kernel compiled with a retpoline-aware compiler: NO
    > STATUS: VULNERABLE (IBRS hardware + kernel support OR kernel with retpoline are needed to mitigate the vulnerability)

    CVE-2017-5754 [rogue data cache load] aka 'Meltdown' aka 'Variant 3'
    * Kernel supports Page Table Isolation (PTI): YES
    * PTI enabled and active: YES
    > STATUS: NOT VULNERABLE (PTI mitigates the vulnerability)

    Ответить
  2. Надо заметить, что для SPECTRE необходим физический доступ к оборудованию!!!
    В AMD уже заявили,
    (https://www.cnbc.com/2018/01/03/amd-rebukes-intel-says-flaw-poses-near-zero-risk-to-its-chips.html)
    что к CVE-2017-5753 их процессоры вообще неуязвимы, уязвимость есть только CVE-2017-5715, но эксплуатация ее по многим факторам фактически равна 0.
    Вообще, создается впечатление, что во всей этой истории кому-то очень хочется оправдаться за чужой счет.

    Ответить
  3. Миллионы простых пользователей понятия не имеют ни о каких уязвимостях. Им что делать? Да им чихать на всё это с высокой колокольни

    Ответить
  4. А ядро 4.4 в Ubuntu server 16.04 LTS Xenial Xerus содержит патч, если установлены все обновления через apt upgrade? Версия по uname называется 4.4-15 (простите за ламерский вопрос).

    Ответить

Оставьте комментарий