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

Original author: Google Project Zero
  • Translation

От автора


Важно! Уязвимость на самом деле это 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
Важно! Данная уязвимость может присутствовать в других процессорах!
Извините за короткую заметку! Я так больше не буду :).

Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 11

    0
    Уже какие не какие технические подробности. Стоит сказать, что как я понял описана Meltdown. Спектры используют другую особенность, а именно предсказание ветвлений.
      +1

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

        0
        Вам спасибо в любом случае. я просто чтобы было ясней, а то выкатили сразу 3 уязвимости, что черт ногу сломит
      +10
      Стоит, все-таки, перечитывать и править машинный перевод перед публикацией.
      Безопасность современной компьютерной системы основываясь на изоляции адресного пространства.

      Вся концепция заключаться в том...

      В настоящий момент адресации памяти не меняться во время...

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

      … процессор производит вычисления на основе значения этого регистра, например загрузить данные...

      Процессор гарантируют корректное исполнение кода

      … атакующий может прочитать все данные адресное пространство ядра...

      И это только введение.
        +9
        +, перевод ужасен.
        0
        переводите дальше )
          +8
          переводите дольше )
          –1
          не зависима — пишется слитно

          Чем бы неи была вызвана ошибка — пишется через НИ

          И далее полно ошибок. Читать невозможно

            0
            Я вот тут подумал, а ведь, по сути, многие другие виды algorithm complexity attacks (или, в нужном контексте, скорее, timing attacks) могут быть использованы для несанкционированного получения данных по принципу meltdown/spectre.

            Я знаю, что в Perl с незапамятных, а в Python с недавних хэш-мапы рандомизируются. А как с этим в С/C++ мире?
              0
              можете уточнить, что именно в хэшмапах рандомизируется и как?
              0
              Интересно, а для эксплуатирования Meltdown на старых INTEL CPU программный код будет отличаться? Т.е. надо ли для каждого отдельного проца писать свой код или он будет одинаковый для всех INTEL CPU?

              Only users with full accounts can post comments. Log in, please.