[litleleprikon]

Blog of one technomaniac

View on GitHub

Meltdown and Spectre-часть вторая

05 January 2018

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

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

Ликбез(опять)

Виртуальная память

В современных ОС программы не имеют доступа ко всей оперативной памяти компьютера. Вместо того, чтобы напрямую работать с оперативной памятью, программы работают с абстрактной памятью, называемой виртуальной памятью. Для программы виртуальная память выглядит как непрерывная бесконечная память. Виртуальная память состоит из страниц. Каждая страница может проецироваться на какую-то область физической оперативной памяти или может быть перенесена из оперативной памяти в долговременную память(HDD/SSD), если процесс давно не обращался к данной странице и быть возвращена обратно в оперативную память, если данная страница понадобилась процессу и была выгружена из оперативной памяти.

Виртуальная память

Адресные пространства оперативной памяти делятся на user space и kernel space. Непривилегированные процессы видят только user space. Ядро же ОС видит все адресное пространство. Если пользовательский процесс пытается получить доступ к kernel space, то процессор генерирует исключение.

Внеочередное исполнение

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

Meltdown

Чтобы понять атаку Meltdown, достаточно взглянуть на пример ниже:

raise_exception();
access(probe_array[data * 4096]);

Тут вызывается исключение и следующая за исключением строчка не должна выполниться. Однако из-за внеочередного выполнения инструкции строки access(probe_array[data * 4096]); могут уже находиться в буфере и могут исполниться раньше, нежели передача управления обработчику исключения если операнды для них будут готовы.

Внеочередное выполнение

Эта ситуация и является ключевым условием выполнения атаки meltdown. Атака состоит их трех шагов:

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

Первый шаг

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

Второй шаг

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

Третий шаг

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

; rcx = kernel address
; rbx = probe array
retry:
mov al, byte [rcx] 5 shl rax, 0xc
jz retry
mov rbx, qword [rbx + rax]

Оригинальное исследование: https://meltdownattack.com/meltdown.pdf

Чем это грозит?

Данные уязвимости показали, что несмотря на механизмы защиты, зловред может читать данные даже из защищенных участков оперативной памяти. Код, находящийся в песочнице, может без проблем читать приватные данные из kernel space. Особую опасность представляет возможность производить атаку Spectre из JavaScript, что чревато кражами приватных данных при посещении сайтов, использующих данную уязвимость.

Пример работы атаки Meltdown для кражи мастер-пароля менеджера паролей

Кто подвержен уязвимостям?

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

Как от этого защититься?

  1. Купить новый процессор
  2. Купить новые гаджеты на новых процессорах
  3. Надеяться на патчи, выпускаемые производителями ос и софта

Для каждой из уязвимостей предложены следующие исправления:

  1. Spectre - Bounds check bypass (CVE-2017-5753): Анализ всех программ, которые могут исполнять код, исправление опасных участков и перекомпиляция их компиляторами, не генерирующими уязвимые последовательности кода.
  2. Spectre - Branch target injection (CVE-2017-5715): Не все так просто: тут потребуется обновление микрокода процессора для исправления предсказателя переходов, однако вполне возможно, что полностью исправить данную уязвимость получится только с выпуском новых процессоров.
  3. Meltdown - Rogue data cache load (CVE-2017-5754): Патч ОС для использования технологии Kernel page-table isolation (KPTI). Данная технология не позволяет станицам памяти ядра отображаться в таблице страницпользовательских процессов. Из-за данного исправления системные вызовы будут исполняться дольше из-за того, что им придется переключаться между разными таблицами страниц(таблица пользовательского процесса и таблица ядра).

Что будет дальше?

Поживем-увидим ¯\_(ツ)_/¯