javascript

Технические подробности. Уязвимость Meltdown — CVE-2017-5754

  • суббота, 6 января 2018 г. в 03:11:24
https://habrahabr.ru/post/346074/
  • Информационная безопасность
  • JavaScript
  • Assembler


От автора


Важно! Уязвимость на самом деле это 3 уязвимости — Meltdown, Spectre 1, Spectre 2
Здравствуй хабр! Сегодня у нас перевод заметки про уязвимость Meltdown (CVE-2017-5754). Переведена только первая страница и основная часть заметки для понимания данной уязвимости.


Meltdown


Общее


Безопасность современной компьютерной системы (прим. автора. Смартфоны, компьютеры, практически любые носимые устройства с возможностью запуска кода не от производителя) основывается на изоляции адресного пространства, для примера память ядра помечена недоступной и защищена от доступа со стороны пользователя. В этой заметке мы представляем вам Meltdown. Meltdown эксплуатирует побочный эффект исполнения-вне-очереди (out-of-order execution) в современных процессорах, чтобы прочитать данные из ядра, в том числе личную информацию и пароли. Исполнение-вне-очереди сильно влияет на производительность и включено в большинство современных процессоров. Атака не зависима от операционной системы и не эксплуатирует программные уязвимости. Meltdown ломает всю безопасность системы основанную на изоляции адресного пространства в том числе паравиртуализованного.
Meltdown позволяет читать часть памяти других процессов и виртуальных машин. Мы покажем, что система KAISER имеет важный побочный эффект в виде в блокировке Meltdown (но является костылем). Мы настаиваем на включении KAISER незамедлительно для исключения утечки информации.


Введение


Безопасность современной компьютерной системы основываясь на изоляции адресного пространства. Операционные системы гарантируют изоляцию отдельных процессов. В современных процессорах разделение состояния между процессами ядра (kernel process) и процессами пользователя (user process) обеспечивается благодаря биту гипервизора. Вся концепция заключаться в том, что этот бит сброшен в пользовательском процессе и установлен в процессе ядра. Смена процессов происходит по прерыванию (interrupt) и системным вызовам (system call / syscall). В настоящий момент адресации памяти не меняться во время системных вызовов и прерываний. Meltdown работает на процессорах Intel 2010-х годов, а также потенциально может затрагивать процессоры других производителей (прим. автора: AMD, VIA). Meltdown эксплуатирует побочный эффект исполнения-вне-очереди (out-of-order execution) в современных процессорах, чтобы прочитать данные из ядра, в том числе личной информации и паролей.


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


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


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


Контрмера KAISER предотвращает атаки нацеленные на KASLR и случайно защищает от атаки Meltdown.


Абстрактный пример


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

Второя строка никогда не будет исполнена.
Чем бы не была вызвана ошибка, она переводит состояние исполнения-вне очереди в контексте ошибки — чаще всего ядра.


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


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


Таким образом мы можем передать данных из состояния исполнения вне очереди, которой исполняет инструкции в привилегированном режиме, в пользовательский процесс атакующего.
Далее основываясь на том, что доступ к данным уже находящемуся в кэше меньше, чем время за которое процессор откатит действие исполненное вне очереди, атакующий читает значение части памяти ядра находящегося в кэше процессора. Иногда попытка чтения заканчиваеться провалом т.к. процессор успевает сбросить конвейер исполнения-вне-очереди перед тем, как тот прочитает данные (0.003%) и позволяет читать данные на скорости 503KB/s на i7 6700K.


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


Подверженность уязвимости


Linux


Мы удачно воспользовались данной уязвимостью в версиях ядра от 2.6.32 до 4.13.0.
Патч KAISER исключает данную уязвимость.


Windows


Мы удачно воспроизвели данную уязвимость в Windows 10 (прим. перев. версия не указана)


Контейнеры


Атаку можно воспроизвести в контейнерах таких как OpenVZ, Docker, LXC.


Ограничения в AMD и ARM.


Нам не удалось воспроизвести данную уязвимость на ARM и AMD, но возможно наша реализация слишком медленная.
НО! Нам удалось воспроизвести уязвимость связанную с исполнением вне очереди на обоих процессорах
Важно! Патчи для операционных систем предотвращают Meltdown, но не Spectre
Важно! Данная уязвимость может присутствовать в других процессорах!
Извините за короткую заметку! Я так больше не буду :).