Суть Meltdown
Jan. 5th, 2018 10:23 amГениально просто.
1. Из-за спекулятивного выполнения инструкций page fault от попытки чтения запрещённого ядерного пространства может накрыть не сразу в момент чтения (первая инструкция), а позднее. Достаточно часто - после того, как будет выполнена третья инструкция с чтением в rbx страницы массива с индексом, соответсвующим значению байта данных al, прочитанного из ядра.
2. Если мы побеспокоимся, чтобы до выполнения этого кода все страницы нашего юзер-мод массива были бы не в кэше, то после выполнения кода одна страница, соответствующая прочитанному из ядра байту, окажется в кеше. Замерив скорость доступа ко всем страницам массива мы сможем узнать, что это была за страница.
...
PROFIT!!!
Спектр работает на тех же принципах определения значения по замеру времени доступа к адресуемым этм значением данным.
; rcx = a protected kernel memory address
; rbx = user space массив размером 256*PageSize(==4096)
mov al, byte [rcx] ; read from forbidden kernel address
shl rax, 0xc ; multiply the result from the read operation with 4096 (==PageSize)
mov rbx, qword [rbx + rax] ; touch the user space array at the offset that we just calculated
1. Из-за спекулятивного выполнения инструкций page fault от попытки чтения запрещённого ядерного пространства может накрыть не сразу в момент чтения (первая инструкция), а позднее. Достаточно часто - после того, как будет выполнена третья инструкция с чтением в rbx страницы массива с индексом, соответсвующим значению байта данных al, прочитанного из ядра.
2. Если мы побеспокоимся, чтобы до выполнения этого кода все страницы нашего юзер-мод массива были бы не в кэше, то после выполнения кода одна страница, соответствующая прочитанному из ядра байту, окажется в кеше. Замерив скорость доступа ко всем страницам массива мы сможем узнать, что это была за страница.
...
PROFIT!!!
Спектр работает на тех же принципах определения значения по замеру времени доступа к адресуемым этм значением данным.