Comments 105
PS: Пока у меня складывается впечатление, что все будут страдать ради решения проблемы всяких азуров и авээсов (причем, исключительно их проблемы).
Интересно, а данные в оперативной памяти всегда хранятся в одних и тех же адресах? Есть ли фрагментация? Может просто достаточно время от времени сдвигать все данные не случайное растоение, тогда и проблем не будет.
Попутно придется найти того, кто будет память «тусовать» и учесть, что все это будет занимать шины памяти перегонкой десятков гигабайт в секунду, выжирая электричество и выделяя дофига тепла…
В локальном варианте все намного хуже. Так плохо, что специалисты не знают о том, как защититься.
Когда читал мануалы про 486 процессор в голове был вопрос «спекулятивное исполнение — понятно. Результаты отбрасываются — понятно. Но как они отбрасываются? Не проходит же микрокод и не обнуляет кеши и результаты исполнений...»
Такое впечатление, что каких-то ребят поймали «на горячем», и что бы такой «баг проектирования» не похоронили в каких гостайнах — плеснули в вентилятор, все что можно.
Можно сколько угодно зубоскалить про ФСБ-ФАПСИ & Co с их компьютерами «на лампах», процессорами Байкалам — но какие-то параноики из этих контор все таки оказались правы. Не сильно будет удивительно, если они «были в доле» — знать и молчать, делая вид что не знают…
По факту такой «баг дизайна» означает, что весомая часть безопастности в ИТ — одна большая подстава в планетарном масштабе, в пользу ребят «из АНБ». Прецеденты таких масштабов были и уже не один раз — ослабление криптомеханизмов GSM, слабые генераторы случайных чисел,Windows Bitlocker & EFS и т.д.
Нормальная стратегия: если не можем победить крипто — давайте сделаем так, что бы тупо читать ключи из памяти, а эти лохи путь думают что «дыра в безопастности» прикрыта.
Есть замечательная поговорка — «что знают двое, знает и свинья». Невозможно объединить в заговоре молчания тысячи разработчиков и службистов,
Есть прецеденты, когда знают «много поросят» — Энигма во вторую мировую,
Результатом этого исследования стал повсеместный отказ от алгоритма COMP128 и его замена на более надежные модификации COMP128-2 и COMP128-3, технические детали которых держатся в тайне. Хм… вам это ничего не напоминает?
…
Всего прослушке подверглись около сотни мобильных телефонов, среди обладателей которых были также активисты левых организаций и выходцы из арабских стран. Специальный комитет греческого парламента, занимавший расследованием этого дела, отметил причастность к этому скандалу трех сотрудников Vodafone и Ericsson. Их полные имена не были названы.
В отчете парламентского комитета указывалось, что подслушивание было бы невозможным без знания технологий компании Ericsson и без вмешательства внутри сети Vodafone. Однако впоследствии комитет прекратил расследование, сочтя дело слишком технически сложным.
Ну и о том, что этот алгоритм может содержать бэкдор, исследователи говорили еще в 2007м году. Что не помешало NIST его сертифицировать. А кипиш начался после опубликованных Сноуденом документов, где явно говорилось о неком стандарте 2006 года.
Dual_EC_DRBG, между прочим, является довольно популярной штуковиной.
Реализован в Windows, начиная с Vista SP1, что делает его самым популярным в мире. Так же, реализация есть в OpenSSL и вообще он похоже пролоббирован в куче продуктов (McAfee, например, но те использовали его только для программ гос сектора). Так что, вычищать от него код придется еще долгое время.
Почему «много поросят» молчат? патриотизм, деньги, принуждение и т.д.
«Сговорились» — на каждую хитрую #@&* найдется свой болт с левой резьбой. Если ребята покупают в свой Госдеп компы с «дырой в безопастности» — глупо орать об этом на весь мир, если ты можешь через эту «дыру в безопастности» шарится по сети потенциального противника/соперника как по свой собственной…
Так и было до Сноудена, пока не было конфликта, никто не верил. Даже был фильм по мотивам в 1998 (Враг государства).
Я просто напомню кусочек статьи:
Пол Тёрнер, инженер и руководитель основного костяка разработчиков Google, присутствовавший на конференции, рассказал, что никто из членов Project Zero не предупредил об открытии своих коллег; они узнали об этом вместе со всеми.
По факту такой «баг дизайна» означает, что весомая часть безопастности в ИТ — одна большая подстава в планетарном масштабе, в пользу ребят «из АНБ».
Пока что обсуждаемые уязвимости существуют только на бумаге. На данный момент нету даже теоретической возможности их использования на практике, так что не стоит волноваться, с безопасностью все ок и никакой подставы не было.
Касперский сайт заблокировал.
В любом случае, речь не о возможности совершить атаку как таковую. Речь о том, что пока что нету возможности (на сколько я знаю, по крайней мере) использовать эту атаку чтобы реально украсть какие-то полезные данные.
Что равно примерно 500 килобайт в год. Однако если знать откуда тырить, можно взять доступ рута хоста или чего похлеще.
А разве можно указать откуда тырить? Насколько я понимаю, это неконтролируемый процесс. То есть вы получите свои 500кб данных в год, но даже если все это время память была статична, то вероятность того, что это будут какие-то полезные данные… ну крайне мала. Если же учесть, что данные в памяти все таки регулярно обновляются, то вы скорее всего получите куски непонять из чего и как собранные.
Разве не так?
Согласно этому, большинство Спектральных атак еще вообще не залатаны.
500байт данных только через один метод атак = Netspectre, которому не нужен доступ к запуску на пк.
Для других систем скорость в принципе CPU Speed / byte, что достаточно для быстрого взлома (читай моментального).
Пишет:
$ Your browser is VULNERABLE to Spectre
$ Please update your browser immediately
Последняя версия Хрома.
Или это из-за того, что процессор AMD? Хотя Spectre вроде и на AMD можно реализовать в отличии от Meltdown.
Там в файле https://xlab.tencent.com/special/spectre/js/check.js есть такой код:
if(window.SharedArrayBuffer)
{
output_cache_log(8);
check(8, [88,117,97,110,119,117]);
}
else
{
output_not_info_leak();
}
Любопытно, а процессоры с архитектурой отличной от Интел — MILV Эльбрус-8C, например,
и ARM, подвержены Meltdown и Spectre? И если подвержены то насколько патчи замедляют их? Интеловские процессоры патчи замедляют насколько я понял на ~ 5%, а AMD в среднем на 0.5%-1%.
Устраните спекулятивное выполнение – и это замедлит работу процессора в двадцать раз, сказал Хилл.Но ведь относительно свежие Intel Atom не подвержены этой атаке и при этом не работают в 20 раз медленнее аналогичных процессоров.
DRAM намного медленнее даже L3 кеша, не касаясь его скорости.
По сути надо избавляться от кешей вообще.
Данные в кеше — надо очищать каждый раз после каждой операции — значит доступ к памяти нужен постоянно. Тут еще надо будет защитить этот самый доступ от похожих атак. А то можно таймить доступ и выяснять информацию.
Данные в кеше — надо очищать каждый раз после каждой операции — значит доступ к памяти нужен постоянно.
Так речь не о том, чтобы защищать, а о том, чтобы в кеш не класть. Процессор спекулятивно выполняет операцию которая требует положить => читает память в специальный буфер размером в кеш-линию => к этому моменту инструкция, инициировавшая спекулятивное выполнение, уже выполнилась и можно посмотреть результат => если результат ок, то сбрасываем буфер в кеш
т.о. данные могут попасть в кеш в том и только том случае, если они и должны были туда попасть
Есть например запрещенные данные в кеше. По идее если мы посылаем запрос на чтение этих данных с определенной командой и у нас нет доступа — должен прийти отказ. Спекулятивное выполнение производит расчет сразу параллельно пока идет проверка отказ или нет. Доступа нет, отказ приходит и система отвечает, что нет и данные спекулятивные отбрасывает.
Однако проблема в том, что проверка кеша для этого необходима. От скорости ответа и зависит тот байт или не тот.
То есть атака не на запись, а на чтение. Таким образом получается не только кеш, но и всю память прочесть (т.к. процессор спекулятивно-таки получает данные из памяти, до проверки стоит ли или нет)…
Сам факт проверки или какого-либо замедления этого процесса сразу привидет к замедлению быстродействия всей системы.
Иного выхода быть и не может.
Такого типа атаки применялись и ранее, чаще всего они есть в криптографии (тайминг и сайдченел).
Все ускорение процессоров за последнее время (от Intel по-крайней мере) висит на спекулятивном выполнении. Убрать это и мы вернемся во времена Pentium 2-3.
Что до пересмотра спекулятивной логики, так это в том, что нет причин её изгонять. Дело не столько в том, что это дьявол, скрывающийся в деталях, сколько в том, что это скорее его адвокат, прикрывающий принципиальную тупость 95% населения: никто не есть фон Нейман в программировании, кроме пары нёрдов в свитерах с оленями, так что будет очень тяжело объяснить, что теперь надо программировать многопоточно, а потому 99% из вас будут расстреляны за ненадобностью, а остальные 1% клонированы, иначе нас ждёт финансовый коллапс.
То есть атака не на запись, а на чтение.
Если вы не можете спекулятивно положить данные в кеш (а при описанном выше подходе они будут лежать в буфере, из которого читать нельзя кроме как для сброса буфера в кеш, но не в кеше), то вы и не можете их оттуда прочитать.
Так что проблема не в том что процессор читает данные из кеша. Проблема именно в том, что он их туда спекулятивно кладет. Те данные, которые при "прямом" выполнении туда бы никогда не попали.
Все ускорение процессоров за последнее время (от Intel по-крайней мере) висит на спекулятивном выполнении. Убрать это и мы вернемся во времена Pentium 2-3.
Так и не надо убирать спекулятивное выполнение, надо убрать спекулятивное кеширование.
Естественно, какое-то замедление будет — но только в том случае, когда у вас вычисление условия для ветвления длиннее чтения из памяти.
А буффер в данном случае как защищен? Буфер жеж будет либо L1 либо L2
Буфер — тут это не кеш, а специальная подсистема, в которой хранится ровно один кеш лайн перед сбросом в кеш в случае спекулятивного исполнения.
Если происходит чтение из памяти, не находящейся в кеше, вне спекулятивного исполнения — кешлайн читается в кеш (то есть ничего не меняется), если во время спекулятивного исполнения — кешлайн читается в буфер и сбрасывается из буфера в кеш после того, как операция, из-за которой он туда прилетел, стала неспекулятивной.
Читать из буфера нельзя, в принципе.
Авиры смогут как-то бороться с пооблемой?
Антивири к этому не имеют отношения. Фактически это прямой доступ к ring0 из browser javascript. Решается латанием дыр (по сути запретом выполнения определенных вещей, например в firefox уменьшили разрешение gettime() колов) в компиляторах и интерпретаторах, оси и др.
Процесс-владелец данных <-> Процессор.
Например: вы еще не пришли домой и не решили, что хотите на ужин, а подруга уже и пиво в холодильник поставила, и борщ сварила, и оладок с вареньем напекла, и горничной нарядилась — вам осталось только выбрать «чего изволите» :)
и в следующий раз выгнав девушку, сам переоделся горничной, сварил борщ, пожарил оладьи и на видное место поставил пиво, что бы когда вы пришли домой, обрадовавшись пивку не сразу сообразили, что горничная-то не та…
короче по поведению вашей девушки, кто-то может подобрать ключ к вам -)
Ну а дальше, узнав что вы сегодня будете борщ, девушка выбрасывает оладушки в мусор. И там их находит (и ворует) злобный хакер.
if(x) {
get_file(a, b, c);
big_func(a, b, c); // Processing one hour
else {
get_file(e, f, g);
another_big_func(e, f, g); // Processing one hour
}
// x, a, b, c, e, f, g -- are known in runtime
Разъясние плиз на указанном примере принцип. Как правило условия нужны, ежели решение принимаеся во время выполнения, а знач и функции мы заранее не вычислим, ибо нужная инфа ещё не загружена.
А так процессор может спекулятивно предположить результат if-а и заняться подготовкой на конвейере какой-либо ветви впрок. Поэтому к моменту разрешения условия всё уже готово без простоя.
И ещё замечу, что дело не сложности или простоте условия, а в том, что его значение не может быть вычислено ранее определённого момента.
И ещё, не является ли неравномерная нагрузка процессора — проблемой «линейных» языков программирования? И как её решить без спекуляции?
Решение ну явно некрасивое ;-)
Ибо чтобы реально выполнить функции из примера нам нужна инфа, получаемая лишь после проверки условия! А раз нету реальной инфы — знач нету и угрозы?
А на это есть алгоритмы пресказания ветвления — один из самых охраняемых «секретов фирмы». В последних процессорах пытаются приделать для этого нейронные сети, как раз потому что разное ПО с разным поведением сильно влияет на «утилизацию вычислительных ресурсов» и штрафы за ошибки предсказания.
Дабы уменьшить штрафы — и загружают все что может пригодится «на всякий случай»
float a = b * c;
if (a > d) // допустим, это холодная ветка
return 0;
float x = y * z;
// Считаем дальше...
В общем случае нам понадобится дождаться вычисления результата a (4 такта), посчитать условие (1-2 такта), и если мы не уходим в холодную ветку можно просто считать дальше, но с проверкой 7 тактов вместо 1.
А если выполнять спекулятивно — одновременно считается x и перепроверяется, что холодную ветку выполнять на самом деле не надо. И там либо всё ок и к моменту перепроверки уже несколько тактов насчитано (а сама проверка словно ничего и не стоила), либо насчитано несколько тактов вхолостую и надо прыгать в холодную ветку. Уязвимости как раз и используют результат этих холостых вычислений
п.с. на истину в последней инстанции не претендую, если где не прав — поправляйте
В общем на низком уровне — умножение и прочее — всё хорошо, а на высоком уровне? Ежели у вас b, с, y и z — матрицы 1000 x 1000, или вызовы функции, выполняющейся часы?
Хм, а раньше early exit как раз и был призван избавить мир лишних вычислений! А щаз, получается, все компилеры наплевали на порядок инструкций.
Но и если бы вся инфа была загружена заранее — выполнение функции (по условию) — час, выполняя лишнюю функцию, проц бы выполнил безумно много лишней работы ;-)
Так процессору все равно заняться нечем — данных нет, кода нет. блоки вычисления и конвейры стоят пустые. Почему бы их не занять чем-то, что в будущем может окупиться? Так сказать «инвестиции свободных ресурсов в возможное светлое будущее»
L2 в большинстве случаев, а L3 вообще всегда делятся с другими ядрами процессора и изоляции данных обеспечить не могут.
Правда кэш тут не причем. Просто Meltdown уязвимости вообще в процессорах AMD нет за счет отличающейся архитектуры. А Spectre сложнее реализовать.
Структура кэш же важна при делении процессора «с соседями» — если к началу ветки вернуться, обсуждали работу на серверах и облачных вычислениях. Когда один физический процессор делится между несколькими разными клиентам разными системами виртуализации и один из клиентов может с помощью этих уязвимостей пытаться «выуживать» информацию из работающего софта у «соседей».
Достаточно простой, очевидный и безусловно надежный способ уже описан в патентной заявке.
Пока сложно сказать у кого будет патентный приоритет, но разработчики Эльбруса в курсе.
Поэтому надеюсь что приоритет будет за ними.
Еще можно хостить не нативные приложения, а байткод, котовый верифицировать на экслуотацию известных уязвимостей.
Еще можно хостить не нативные приложения, а байткод, котовый верифицировать на экслуотацию известных уязвимостей.
Это скрестить сигнатурный анализатор с JIT-компилятором? Так МС вас опередила — на уровне компилятора с 2003 года нельзя дергать системные функции без критериев безопастности (явного размера данных), в .Net встроены декларативные механизмы безопастности, в для нативных приложений используются манифесты. Это решило часть проблем. Что делать с остальным — пока не очень понятно.
Да, производительность немного упадёт, но не нужно будет изобретать «процессор совершенно нового типа».
Или у меня искажённые представления, и программы постоянно лезут в недоступные области памяти, «разгоняя» друг друга за счёт кэширования?
Я слабо представляю, как работают современные процессоры, но неужели нельзя вместо «не читать лишние данные» и «очищать кэш после каждой операции» пойти немного другим путём — «очищать в кэше только те данные, которые не должны были туда попасть»?
Нюанс в том, как именно организована память и ее адресация. Физическая адресация. Кеш вычитывает данные не побайтово, а целыми кусками/страницами.
Такая логика имеет смысл по нескольким причинам причинам:
- исполнимый код расположен одним непрерывным куском в памяти,
- обрабатываемые данные с большой степенью вероятности расположены последовательно
- сменить физическую адресацию памяти занятие не дешевое само по себе (на планках памяти DDR4 CAS Latencies 14- 20 t, DDR3 CL9-CL11 t )
Если тонким слоем «размазать» данные по памяти — производительность сильно упадет.
«очищать в кэше только те данные, которые не должны были туда попасть»
По дизайну именно так и задумано «не должно попасть» — все нарезано на странички, каждая со своими пометками, все помещено в какой-то контекст, свои таблицы трансляции и т.д.
А по факту — весьма странный «баг дизайна»
Для устранения Spectre и Meltdown, возможно, придётся создать процессор совершенно нового типа