Спекулятивное исполнение

Aug 08, 2023 14:37


Вот как вы думаете, современные процессоры, встретив в коде условный переход типа if () {} else {}, какую ветвь кода выполняют?

Правильный ответ: обе.

Почему? Потому что оперативная память, раздери её Вулкан, до сих пор является самой тормозной частью компьютера. Компьютер может выполнять инструкции гораздо быстрее, чем подтаскивать данные из ( Read more... )

жулики, компьютерное, интересное, техника

Leave a comment

Comments 12

dibr August 8 2023, 20:39:21 UTC
Как я понял (но это не точно), АМД для улучшения предсказания ветвления хранит какую-то статистику по ранее выполненным командам и их результатам, а этот эксплойт каким-то образом получил доступ к области с этой статистикой, и прописал туда что-то вроде: "XOR - это тоже команда, требующая спекулятивного выполнения, и длина её "окна неопределенности", на протяжении которого мы продолжаем спекулятивные вычисления, максимальна". Одна из проблем "спекулятивных" атак в том, что спекулятивно исполняемая последовательность команд должна успеть "оставить следы" в наблюдаемом мире, что не всегда просто - процессор обычно быстро соображает что работал зря, и исполнение прерывает. Более длинное окно позволяет использовать более простые и эффективные методы "оставления следов". Кстати, если я понял правильно, эту конкретную уязвимость могут и закрыть: достаточно закрыть ту форточку, через которую эксплойт залез во внутренние структуры процессора, и эффективность спекулятивных атак вернётся к обычному уровню (они есть, но на практике слишком ( ... )

Reply

nlothik August 8 2023, 21:36:20 UTC
> А точно обе, кстати?

Меня учили в 2010 году, что обе. Поменялось это, насколько я понимаю, с появлением архитектур IA64 и AMD64 и когда процессоры стали отращивать себе вооооот-такенные конвееры. И prediction поменялось на predication, не знаю, как по-русски. Результаты одной ветви разрешают менять системное состояние, а другую посылают нафиг.


... )

Reply

dibr August 8 2023, 22:37:15 UTC
Забавно :-) Всё это на одном ядре, то есть действительно что-то типа гипертрединга - пока в ядре есть свободные исполнительные устройства, пусть исполняют?

Непонятно только, при чём тут SIMD: во первых, в разных ветках скорее всего будут разные инструкции (с чего бы им быть одинаковыми), а это уже не single, а во вторых, SIMD же вроде подмножество (расширение набора) инструкций, вполне вероятно что исполняться будут инструкции не из этого подмножества.

Reply

nlothik August 9 2023, 02:05:01 UTC
Ну если не повезёт, тогда да, инструкции будут разными.

Но если код типа

if (трусы == красные)
{
красныеТрусы++;
}
else
{
прочиеТрусы++;
}

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

> Всё это на одном ядре, то есть действительно что-то типа гипертрединга

Может быть оно типа конвеер заполняет в шахматном порядке :) Точно не знаю, надо уже инженеров Интела спрашивать, для меня это уже слишком сильное шаманство.

Reply


cryinstone August 9 2023, 01:54:31 UTC

В мейнстриме ничего не изменится, да.

При этом вполне вероятно, что появится (или уже есть) категория процессоров без спекулятивного исполнения - там, где безопасность важнее скорости.

Reply

nlothik August 9 2023, 02:06:55 UTC
В реальности решения подобных проблем нужны только на системах, которые регулярно запускают непроверенный код.

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

Reply

cryinstone August 9 2023, 02:10:44 UTC
Эээ... подозреваю, что если у вас есть компьютер или мобильный телефон - вы понятия не имеете, что там на них запускается :)

Reply

dibr August 9 2023, 13:25:57 UTC

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

С компьютерами всё и проще, и сложней: с одной стороны, теоретически я сам выбираю какую ОС ставить и какой софт запускать, с другой - даже если я использую только то что доступно в исходниках, и максимально собираю всё сам, я один фиг не смогу просмотреть все эти исходники в поисках уязвимостей, могу только надеяться, что это сделали до меня, а что там фоном по умолчанию запускается в линуксе, не говоря уж про винду - знают только те, кто этим реально интересуется. Содержимое BIOS - вообще отдельная тема...

Reply


Leave a comment

Up