Вспомни что если speculative exectuion случился и произошел exception - то он не вернется если if не выполнится по факту
В упрощенном виде - можно замерять время выполнения попытки доступа к кэшу
и по этому делать выводы есть ли данные из какого-то адреса в кэше
сами данные прочитать впрочем пока еще нельзя
(лучше за подробностями почитать презентацию или одну из многочисленных статей)
Spectre
Есть концепт Gadget - это кусок кода который уже существует в программе, но который не должен выполняться. А мы влияем на состояние системы чтобы он таки выполнился.
Есть концепт Gadget - это кусок кода который уже существует в программе, но который не должен выполняться. А мы влияем на состояние системы чтобы он таки выполнился.
Пример:
if (untrusted_offset < limit ) {
trusted_value = trusted_data[untrusted_offset];
tmp = other_data[(trusted_value)&mask];
...
}процессор может продолжить выполнение кода даже если не шибко нужно
фактически mitigation - добавление инструкции "не делай speculative execution"
spectre v2 - про предсказание ветвлений
например представим что есть 2 процесаа - первый в юзерспейсе, второй в ядре
мы отравляем наш branch prediction чтобы он думал что он пойдет в true, а он идет в false по факту
и дальше подберем все так чтобы выполнился кусок кода ядра который не должен выполняться
исправить можно двумя способами - return trampolines (retpolines) или изменением микрокода
фактически что такое retpolines - это модификация стека чтобы сделать return где не должно быть return
и в том числе добавление бесполезного мусора
потому что ну выполнится мусор - ну и фиг с ним
По факту сейчас много исследований о похожих особенностях