Понедельник , 23 Июль 2018
ДомойПубликацииMeltdown: немного про уязвимость процессоров Intel

Meltdown: немного про уязвимость процессоров Intel

Начало года выдалось шикарным. Все новостники наперебой распространяли новость об аппаратной уязвимости процессоров Intel.

Диванные аналитики, особенно из конкурирующего лагеря, сразу провозгласили скорый крах «синей корпорации». Масла подлил и господин Брайан Кржанич, руководитель Интел. Он отметился декабрьской продажей всех своих акций, кроме необходимого минимума для занимаемой должности.

Meltdown процессоров Intel

Далее в тредах раздулась тема обрушения акций Intel. Обычно приводился скриншот выделенного красным участка:
IntelКапец. Или всё же нет?

Судя по картинке, падение и правда выглядит чудовищно. Если же посмотреть график за полгода, то всё очень даже неплохо.

Однако я отвлёкся.

Об уязвимостях

Да, их несколько. И известны они минимум с лета 2017 года. Проблему раскопала команда аналитиков безопасности Project Zero компании Google, после чего были уведомлены производители процессоров. Далее к теме (опять же, без огласки общественности) подключились разработчики операционных систем.

По сообщению того же Google, эти данные должны были обнародовать 9 января. Как же о них стало известно ранее запланированной даты?

Спасибо можно сказать открытости ОС Linux. Энтузиасты заметили масштабные изменения в ядре операционной системы. Что характерно, в документации это отражено не было. Зато были люди с электронными адресами Intel и Google в копиях рассылаемых Email. Вывод напрашивался сам: в процессорах обнаружили серьёзную аппаратную уязвимость, которую пытаются пофиксить на уровне операционной системы.

СМИ эту теорию радостно поддержали, а компаниям пришлось обнародовать имеющуюся информацию.

Первые две уязвимости под общим названием Spectre рассматривать нет смысла. Нужно отметить, что им подвержены почти все современные процессоры (и от AMD тоже), но вероятность выполнить подобные атаки, по крайней мере пока, стремится к нулю.

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

Что это за уязвимость Meltdown

Суть проблемы.

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

К слову, в современных процессорах успешность предсказаний превышает 90%.

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

Когда дело доходит до непосредственного выполнения кода и процессор «видит» обращение к нелегитимной области памяти, либо срабатывает контроль привилегий, выбрасывается исключение. Критический недостаток данной процедуры — «зеркалирование» части запрашиваемой памяти в кэш процессора. Любой памяти, это ключевой момент; не учитывая права доступа. По сути, эти операции выполняются параллельно.

Используется два вида памяти: физическая (те самые модули ОЗУ в наших компьютерах) и виртуальная. Операционная система и приложения работают с виртуальным адресным простанством. Как и современные процессоры.
Контроллеры кэша и памяти, в свою очередь, используют физическую адресацию.
Виртуальная память отображается на реальную. Любому запущенному приложению, условно, выделяется бесконечный пул памяти. Да-да, в пул входят и незанятые пространства памяти, и команды с данными приложения, и даже ядро операционной системы. Но это считалось несущественным — контроль привилегий процессора запрещает обращение к таким данным. Приложению «открыто окошко» только на авторизованную собственную память, выход за её пределы вызывает исключение и прерывает выполнение программы.

Происходит примерно следующее. Атакующая программа запускает процесс ветвления — аналог банальных условий if/then в языках высокого уровня. Здесь задача заставить работать механизм предсказания переходов, чтобы началось выполнение нелегитимных инструкций. Далее программа:

  1. Очищает 256 значений кэша для определения потенциально запрашиваемых адресов, назовём это доступная память. Кэш ассоциативен, поэтому каждая ячейка памяти строго привязана к определённому значению кэша. Важно: эти адреса должны быть доступны программе на чтение.
  2. Из области памяти, недоступной при штатной работы, читает значение байта. Это процедура на данном этапе выполняется, т. к. контроль привилегий ещё не выполнился.
  3. Читает данные по адресу начала доступной памяти + значение байта из предыдущего шага. На этом шаге содержимое запрашиваемой ячейки помещается в кэш.
  4. Дожидается выбрасывания исключения. Это происходит потому, что на шаге 2 была попытка доступа к неразрешённой области памяти. Следовательно, все предыдущие шаги объявляются недействительными и состояние процессора возвращается к точке ветвления.
  5. Пробегает по доступной памяти. Как помним, здесь всего 256 значений, которые легко обходятся в цикле. При этом засекается время. Ячейка памяти, вернувшая ответ быстрее всего, и будет тем самым значением байта из недоступной области памяти. Ещё раз, почему так происходит: на шаге 3 процессор читал содержимое из доступной памяти плюс значение байта. И процессор, для ускорения обращения к этому же байту в дальнейшем, поместил данное значение в кэш. Поэтому время чтения и получается минимальным.
  6. Повторить всё, но уже со следующим байтом из недоступной памяти.

Таким образом можно исследовать содержимое всей физической памяти.

Кто-то спросит: а как производится очистка значений кэша? Простым чтением из ОЗУ. И ответ на самом деле уже дан: ассоциативность. Допустим, ассоциативность кэша составляет 4096. Тогда в первой ячейке может быть содержимое одной из ячеек оперативной памяти: 1-ой, 4097-ой, 8193-ой и т. д. Во второй ячейке кэша могут размещаться данные ячеек: 2, 4098, 8194… Таким образом, приложению нужен буфер длиной 8192 байта: первая часть буфера (вернее, всего 256 байт) используется для очистки кэша, вторая нужна для получения значения байта. Чтобы стало понятнее, просто посмотрите на рисунок:

Как работает кэш процессора

Как видим, каждая ячейка физической памяти определяется пересечением Rn:Cn. Кэш является сквозным, его первое значение может использоваться для всего столбца R1, второе — для R2 и т. д. Какое именно значение в кеше сейчас показывает адрес ячейки. После чтения из памяти ячейки R1:C1 её содержимое помещается в первую ячейку кэша, а заодно записывается адрес для дальнейшего сопоставления — C1.
При следующем чтении из памяти содержимого R1:C1 процессор сначала проверит, есть ли данные в кэше. В данном случае есть. Если в дальнейшем понадобится значение R1:C3, процессор не обнаружит нужных данных и запросит их из оперативной памяти, после чего обновит кэш: в адрес будет записано C3, а в содержимое — 8193. Естественно, старое значение из кэша будет утеряно, и при очередном запросе R1:C1 процессору снова придётся получать данные из ОЗУ.

Теоретически, за время перебора 256 значений содержимое нужной ячейки кэша может измениться. В таком случае логичнее использовать побитовое получение данных. Тогда из кэша нужны всего 2 значения (0 и 1, что соответствует двум соседним ячейкам). На шаге 3 из прочитанного байта требуется получить соответствующий бит, что легко сделать с помощью операций сдвига и логического and.

Что в этом страшного

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

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

Теоретически возможна эксплуатация хоть с помощью JavaScript. Гугл уже выпустил очередной апдейт Chrome, где Meltdown и Spectre вроде как фиксятся. Соответствующий апдейт выпущен и для Firefox.

Пути решения

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

Microsoft выпустила обновление для своих операционных систем. И они были бы не они, не случись казуса. После обновления у некоторых пользователей, сидящих на процессорах AMD (да-да!), ОС переставала загружаться. По старой традиции виноват оказался кто-то другой, коим выступила сама AMD. Оказывается, процессоры Advanced Micro Devices не соответствуют своей же документации.

Рядовые юзеры замедления, скорее всего, не заметят. Чего не сказать о корпоративных клиентах — замедление работы даже на 5% вызывает потребность нарастить парк машин на такой же процент, что чревато незапланированными расходами. Просто представьте, сколько серверов у Гугла, и какую сумму составляет 1/20 часть от этого.

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

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

Проблема в том, что неизвестно, используется ли данная уязвимость в злостных целях. Даже если исходить со слов Intel о том, что проблема касается процессоров Intel Core i, это конец 2008 года. Кто знает, что экспертам удалось накопать за 9 лет?

Рейтинг: 0

Автор публикации

1 857
не в сети 8 часов

x64 (aka andi)

Комментарии: 2706Публикации: 380Регистрация: 02-04-2009
Так себеНеплохоХорошоЗамечательноСупер! (2 голосов, в среднем: 5,00 из 5)
Загрузка...

4 комментария

  1. Константин

    Андрей, доброго времени суток! Можно, я как «не программист» глупый вопрос задам? Ну понятно, есть уязвимость, дающая доступ к чтению оперативной памяти моего ПК. Непонятно, каковы последствия такого вмешательства: скачивание моих логинов/паролей, заражение вирусом, что-то еще? Каков максимальный вред для обычного пользователя?

    Рейтинг: 2
    • Константин, приветствую!
      Получение логинов и паролей частный случай. В память так или иначе заносятся все вводимые данные, включая пластиковые карты, параметры авторизации в сервисах и текущее состояние программах (что грозит угоном ключей лицензий или получением подробнейшего досье), да всё, чем пользователь занимается (или занимался, память далеко не всегда сразу очищается после работы с программами).
      Конечно, с кейлоггерами проще. Но в данном случае всё выполняется скрытно, операционная система даже не догадается, что происходит что-то неправильное с точки зрения безопасности. Программам-зловредам не нужны какие-то особые права, как их запустили, так они и будут работать, хоть из-под кучи виртуальных машин — кэш-то у процессора один. Не зря сейчас все переполошились.
      Максимальный вред — возможность потерять всё, чем манипулируем в Сети. Но самое печальное, что мы-то может и предотвратим возможность вторжения с помощью установки патчей или замены процессора, а какие-то организации этого не сделают, чем подставят под удар анонимность своих пользователей.

      Рейтинг: 1
  2. Привет Анди!

    Говорят что многие крупные акционеры знали про тему с глюками процессоров интел и до афиширования, начали по тихонькую продавать акции.
    Рисоводство должно было знать про это: однозначно !

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

    Но акции АМД будут расти smile

    Рейтинг: 2
    • Айк, доброго дня!
      Очень даже может быть, что знали. Инсайдерскую информацию ещё не отменили. А тут такая замечательная возможность продать акции на пике, подождать падения и перезакупиться. Неплохая прибавка к новому году.
      По 2006 году, есть информация, что это не совсем так. И данная уязвимость чуть ли не с первых Пентиумов существует. Возможно, Intel и раньше об этом знали и просто игнорировали. Но в прошлом году Гугл отрапортовал, а его просто так игнорировать нельзя, всё же серверов закупают будь здоров сколько.

      Рейтинг: 0

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

Ваш email не будет опубликован.Необходимы поля отмечены *

*

Добавьте изображение (jpg/gif/png)

Политика конфиденциальности

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

Принять

Авторизация

Регистрация

Пароль не введен

Генерация пароля