LINUX.ORG.RU

Meltdown и Spectre — названия двух атак на процессоры Intel/AMD/ARM64/Power

 , , , ,


10

9

Разработчики из Google Project Zero опубликовали детали уязвимостей, которые затрагивают не только процессоры Intel и ARM64, но и AMD тоже (есть сообщения, что только при включении BPF JIT в ядре, что по умолчанию выключено). Названия им дали: Meltdown и Spectre (расплавление ядерного реактора и призрак).

Meltdown позволяет приложению читать любую память компьютера, включая память ядра и других пользователей. Этой атаке подвержены процессоры Intel. Точных сведений об уязвимых процессорах нет, но скорее всего минимум начиная с Core Duo.

Spectre создаёт брешь в изоляции различных приложений и позволяет атакующему обманным способом получить данные чужого приложения. Этой атаке подвержены процессоры Intel, AMD, ARM64, Power8 и 9. По неподтвержденным данным узявимы практически все процессоры, умеющие спекулятивное исполнение кода. Для Intel это процессоры, начиная с Pentium Pro (1995 год), кроме Itanium и Atom. Есть сообщения о том, что уязвимость проверена на Pentium-M 1.5 ГГц (2004 год).

Эксплоит, эксплуатирующий Meltdown позволяет читать память ядра со скоростью 2000 байт в секунду на процессоре Intel Xeon архитектуры Haswell.

Уязвимостям назначены следующие CVE: CVE-2017-5753, CVE-2017-5715 и CVE-2017-5754.

Напомню, что пользователи ежедневно запускают чужой код на своих компьютерах, посещая веб сайты с JavaScript (>99%), поэтому применение патча (здесь и здесь) обязательно, если вы дорожите своими данными. Есть PoC (п.4.3) , демонстрирующий атаку с этой уязвимостью через JavaScript.

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

Технические подробности про spectre (есть пример кода в конце файла)
Код из spectre.pdf выложенный отдельно.
Технические подробности про meltdown
Еще про meltdown
Видео, демонстрирующее утечку памяти meltdown
Технические детали для ARM-процессоров
Отчёт от Red Hat, упоминающий процессоры IBM Power как уязвимые.

UPD: Хорошая статья на русском языке про meltdown
UPD2: Продолжение про два вида Spectre

>>> Подробности

★★★★★

Проверено: anonymous_incognito ()
Последнее исправление: hobbit (всего исправлений: 24)
Ответ на: комментарий от wieker
time2 = __rdtscp( & junk) - time1; /* READ TIMER & COMPUTE ELAPSED TIME */
      if (time2 <= CACHE_HIT_THRESHOLD && mix_i != array1[tries % array1_size])
        results[mix_i]++; /* cache hit - add +1 to score for this value */
wieker ★★
()
Ответ на: комментарий от quester

Где столько идиотов находят?

Уязвимы процессоры Intel у 99.9% пользователей - если все их заменить, Intel обанкротится.

// b.

anonymous
()
Ответ на: комментарий от wieker

то что в кэш заносится я понял. А каким образом они значение строки кэша вычитывают - пока нет.

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

Как они зацепляют эту строку кэша?

dzidzitop ★★
()
Ответ на: комментарий от Ivan_qrt

Брехня это. Для spectre bpf_jit_enable не нужен:

bpf jit - это «гаджет» (так в статье), который позволяет утащить произвольные данные. твой же бинарник эксплойтит свой собственный гаджет:

void victim_function(size_t x) {
  if (x < array1_size) {
    temp &= array2[array1[x] * 512];
  }
}

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

wieker ★★
()
Ответ на: комментарий от quester

Чудило тупоголовое. Неужели ты думаешь, что Intel зарабатывает и ничего не вкладывает? Или там сотня васянов на коленке процессы клепает? Может, ты в школе в 5 классе учишься?

Слышал про такие вещи, как R&D? Амортизация? Кадры? З/П? Основные и неосновные фонды? IPO? Выплата дивидендов? И ещё 100500 статей расходов.

anonymous
()
Ответ на: комментарий от dzidzitop

Или даже флаг процессора «не вытеснять кэш при спекуляции».

эффективность кеширования с учётом процента спекулятивно выполняемого кода без отката упадёт на дно.

Это в сочетании с теневым кэшем. По ссылке на hackernews предлагали.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Кукареканье в 2004 году про итаниумы, а сейчас - про эльбрусы, уже утомляет. Архитектуры на vliw, которые за пределами академических статей жить не могут. А все граждане РФ охают-ахают в порыве клюквенного патриотизма.

dzidzitop ★★
()
Ответ на: комментарий от wieker

да. в упор не догоняю что в данный момент содержит addr.

dzidzitop ★★
()
Ответ на: комментарий от dzidzitop

то что в кэш заносится я понял. А каким образом они значение строки кэша вычитывают - пока нет.

так в этом и суть блин.

они _адрес_ вычитывают

wieker ★★
()
Ответ на: комментарий от wieker

temp &= array2[array1[x] *

это преобразует секретные данные в _адрес_ в кеше

wieker ★★
()
Ответ на: комментарий от tailgunner

Прямой перевод с оф сайта: «This attack allows a program to access the memory, and thus also the secrets, of other programs and the operating system.»

Не проверяли автора новости на opennet? Никаких совпадений не было? Может он не совсем кретин в переводе, не?

anonymous
()
Ответ на: комментарий от wieker

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

или эта хрень работает только в рамках одного процесса?

dzidzitop ★★
()
Последнее исправление: dzidzitop (всего исправлений: 1)
Ответ на: комментарий от zaz

Ты ровно всё неправильно понял, поэтому системы на предмет meltdown уже пропатчены, а spectre будут постепенно латать (к сожалению, полностью никак).

// b.

anonymous
()
Ответ на: комментарий от dzidzitop

Строка из кеша нигде не используется в кратце идея очень проста:

1. Создаем большой массив (char *a1) размером 256 страниц память (1MB) и выкидываем его из кеша CPU
2. Берем адресс по которому хотим получить данные (unsigned char *xadr) (например там лежит число 5)
3. Выполняем код типа:
   a1[ *xadr ] ++
3.1 В результате начало 5й страници попадает в кеш процесора
4. Проверяем какая из 256 наших страниц (наш массив a1) попала в кеш. По полученым данным можно предположить что находилось по адресу xadr.

zaz ★★★★
()
Ответ на: комментарий от anonymous

Не проверяли автора новости на opennet?

Нет. Он привел номер CVE, я процитировал этот CVE. Проблемы?

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Попробуйте прочитать несколько толстых книг классиков

льва николаевича и алексея николаевича?

dzidzitop ★★
()
Ответ на: комментарий от wieker

1. ищем в ведре гаджет вида array2[array1[x]

где array2 - замаплен нами.

array1 - секрет другого процесса

x - передаем мы. и x проверяется таким образом, что спекуляция всё равно выполнит array2[array1[x]

по возвращению из сисколла смотрим кеш таймингом

профит!!!!!

wieker ★★
()
Ответ на: комментарий от dzidzitop

Повторю удаленный вопрос: скакал сегодня?

ashot ★★★★
()
Ответ на: комментарий от wieker

array1 - секрет другого процесса

точнее array1 + x - секрет другого процесса

wieker ★★
()
Ответ на: комментарий от tailgunner

Ну как же... почему вы, Red Hat, не перенесли работу с PCID на наше любимое окаменевшее ядро? ЗА ЧТО МЫ ВАМ ДЕНЬГИ ПЛАТИМ?!!!11

Это фича, а не баг. В z-стрим и прочая каменное не понесут.

mv ★★★★★
()
Ответ на: комментарий от zaz

ок. а если char *xadr - это вообще другой процесс? Или атака работает только если память замаплена на адресное пространство процесса?

dzidzitop ★★
()
Последнее исправление: dzidzitop (всего исправлений: 1)
Ответ на: комментарий от dk-

Почему так трясутся над номерами? Ну сделали бы их безопасно публичными. Как инн наш.

Потому что на инн банковский счёт не откроешь и т.д.

mv ★★★★★
()
Ответ на: комментарий от mv

А на один номер без документов?

Ну и я как раз про то, что слишком много не него завязано для его «секретности».

dk-
()
Ответ на: комментарий от Deleted

И как теперь с этим быть?

Никак. Просто теперь твой комп в два раза медленнее. Это не катастрофаю

dikiy ★★☆☆☆
()
Ответ на: комментарий от dzidzitop

А теперь самое интересное, код пункта 3 выполнять не обязательно! В примере котороый опублековон он никогда не выполняется, но значение все равно считывается и НАША страница кешируется. Виной всему оптимизации конвеера который «подогревает» код до его реального выполнения.

И вот какраз meltdown и эскалирует этот подогрев, например если перед кодом «a1[ *xadr ] ++» впихнуть деление на 0 или какойто сегфолт то процесс переключится в кернел спейс до выполнения «a1[ *xadr ] ++» и эта строчка выполнена не будет, но конвеер ее обработает - причем обработает внутри кернел спейса и наша страницп номер 5 все равно попадет в кеш (хотя реально данные никакие не изменянятся, так как комита памяти не будет).

zaz ★★★★
()
Ответ на: комментарий от Deleted

Да, но за что я платил?

За то, что твой комп будет на X% быстрее, чем Y% других компов. Этот баг не рушит это соотношение, так что все в порядке, можешь расслабиться.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dzidzitop

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

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

А все граждане РФ охают-ахают в порыве клюквенного патриотизма.

Луше быть клюквенным патриотом, чем «эффективным менеджером», который решил в 90-х что «мы все купим, если надо, зачем свое посконное развивать отсталое». Как оказалось и не все купим и вопросы о контроле остаются.

praseodim ★★★★★
()
Ответ на: комментарий от wieker

т.е.

1) syscall для того, чтобы пойти в сферу физических адресов, а не виртуальных?
2) известен физический адрес array1?

на данный момент я вижу следущее

процесс А имеет по виртуальному адресу 100 (&array1[0]) секрет. Физический адрес неизвестен процессу Б.
процесс Б хочет прочитать из процесса А по адресу 100. Для этого должен знать физический адрес расположения секрета чтобы вызвать через ядро array2[array1[x]]. Знать виртуальный адрес array1 недостаточно. Или я не догоняю что-то очевидное?

dzidzitop ★★
()
Последнее исправление: dzidzitop (всего исправлений: 1)
Ответ на: комментарий от dzidzitop

Знать виртуальный адрес array1 недостаточно. Или я не догоняю что-то очевидное?

на это я уже не знаю ответа точно. в любом случае память уже почти твоя, что должно сделать доступным и всё остальное.

wieker ★★
()
Ответ на: комментарий от dikiy

Да, но за что я платил?

За то, что твой комп будет на X% быстрее, чем Y% других компов

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

tailgunner ★★★★★
()

Intel i3-7100

 $ dd if=/dev/zero of=/tmp/testfile bs=512 count=5000000 
kernel 4.14.10
2560000000 байт (2,6 GB, 2,4 GiB) скопирован, 2,08091 s, 1,2 GB/s
kernel 4.14.11
2560000000 байт (2,6 GB, 2,4 GiB) скопирован, 3,56896 s, 717 MB/s
У кого AMD - выложите результат с ядром 4.14.11 плиз.
tmp в tmpfs !

superuser ★★★★☆
()
Последнее исправление: superuser (всего исправлений: 1)
Ответ на: комментарий от dzidzitop

как вариант - дампить всё, а там разобраться.

и я немного накосячил. array1 + x - «адрес секрета». ну или просто значения которое читается.

wieker ★★
()
Ответ на: комментарий от wieker

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

dzidzitop ★★
()
Ответ на: комментарий от dk-

Когда начнут фиксить - да, производительность упадет. А пока - могут тупо взломать.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Нет. Теоретически возможен взлом из JS.

из js можно только браузер прочитать или и в сисколлы зарядиться можно?

кмк невозможно будет до лоулевела добить, то есть не так страшно

wieker ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.