Как работают уязвимости Spectre и Meltdown. Самое понятное объяснение.

как работают уязвимости Spectre и Meltdown в процессорах Intel

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

Они были обнаружены еще в январе 2018. Под угрозой были смартфоны и компьютеры в основном на процессорах Intel. Но также уязвимости были обнаружены в парочке процессоров AMD и одном ARM .

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

Разберемся, как же работают уязвимости Spectre и Meltdown.

P.S. Все максимально упрощено и вообще я могу в чем-то ошибаться. Так что буду признателен за поправки в комментариях.

Компьютер состоит из разных частей, но нас, в текущем контексте, интересуют минимум две: процессор и оперативная память.

Оперативная память

Эта штука хранит в себе все наши данные, необходимые для работы (в том числе и пароли), а также инструкции для процессора.

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

Блоки разделены на две части:

  • Пользовательские данные. Та область данных, блоки из которой выделяются процессам программ, запущенным от пользователя.
  • Защищенные данные. В этой области лежит все, что под грифом Защищено: пароли, номера карт и прочие личные данные. Доступ к этим блокам есть у внутренних процессов ОС и у процессов с root правами.

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

Кэш процессора

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

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

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

Спекулятивное выполнение

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

Его суть заключается в том, что процессор заглядывает в будущее, пока выполняется текущая инструкция. Таким образом, когда она закончится, у него будут готовые данные к следующим инструкциям.

Как пример:

if ($a < $array1[$b]) {
    $c = $array2[$a];
}

Пока проверяется условие $a < $array1[$b] , процессор не ждет, а выполняет инструкцию $c = $array2[$a] и записывает результат в свой кэш. Если проверка прошла успешно, то процессор берет из кэша данные внутренней инструкции и идет дальше по программе. А если нет, то он возвращает состояние своих регистров в то, которое было до начала проверки. Пропускает проверку и идет дальше. Но кэш не очищает.

Переходим к сути

Как работают уязвимости Spectre и Meltdown

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

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

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

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

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

Таким образом можно получить все значения из защищенных ячеек памяти.

Если рассмотреть с технической стороны, то это выглядит примерно так:

  1. Создаем массив символов, которые предположительно может содержать защищенная ячейка. Например, А = [A, B, C, D].
  2. Пишем условие, которое 100% не выполнится. В нем должно быть обращение к оперативной памяти, потому что, как мы помним, это занимает время и , чтобы не ждать, процессор выполнит код внутри условия — спекулятивное выполнение. Например, если OLEG == А[4] то выполняем код внутри условия. A[4] — это буква D.
  3. Внутри него берем массив блоков памяти и обращаемся к защищенной ячейке: B[11]. И это значение пытаемся найти в массиве (ячейках памяти) наших символов: A[B[11]]. Пусть, например, в защищенной ячейке хранится буква B.
  4. Пока выполняется проверка 2, процессор решил заглянуть в будущее и выполнил код внутри условия. Он взял значение ячейки B[11] , нашел его в массиве А и сохранил в кэш.
  5. До процессора дошло, что условие не выполняется и он сбрасывает регистры, оставляя значение защищенной ячейки в кэше.
  6. Теперь хацкер проходит по массиву А , достает по очереди каждый элемент и засекает время, за которое процессор вернул текущее значение массива А: A[1] = A — 100ms, A[2] = B — 5ms, A[3] = C — 100ms, A[4] = D — 100ms.
  7. Находим самое маленькое время отклика — это и есть значение защищенной ячейки.
Кэш процессора ДО получение данных из защищенной ячейки
Кэш процессора ПОСЛЕ получение данных из защищенной ячейки
Ищем значение защищенной ячейки в кэше процессора

Подытожим

Стоит ли переживать по этому поводу? Я думаю, что нет.

Вы ведь не медийные личности, не политики, не владеете государственными тайнами и скорее всего, у вас нет денег. Короче говоря — у вас нечего красть. Так что спите спокойно.

Ну а если вы вдруг вы Трамп или Филлип Киркоров, то не забывайте устанавливать обновления на свой комп.

Спасибо за внимание

Телеграм-канал Bor64.com кнопка подписаться

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *