Ну как бы в 2 словах не объяснишь, но постараюсь.
Процессор или одно из ядер использует технику оптимизации выполнения, заключающуюся в том, что инструкции могут выполняться не по порядку, в режиме конвейера, параллельно. Данное условие выполняется, если только данные, которыми оперируют инструкции независимы друг от друга.
Например, пока одни инструкции работают с вычислением регистра rax
, другие трудятся над вычислением rbx
, при уловии, что вычисления последнего не зависят от регистра rax
, как-то так.
Атаки по спекулятивному выполнению позволяют запускать на исполнение инструкции, которые будут оперировать данным из пространства ядра, например. Как это происходит -- отдельный вопрос. Понятное дело, что у пользователя нет прав на чтение данных из пространства ядра, как только процессор об этом узнаёт, выполнение прекращается, регистры остаются неизменными. Но все данные, с которыми когда-либо работал процессор, оседают в кэше. С помощью атаки на кэш (это тоже отдельный вопрос) мы можем выяснить, с какими данными работал процессор, вплоть до байтика. Таким образом, мы можем читать память из ядерного пространства.