Пример использования обнаруженного эксплойта Spectre от 2 января 2018 г. (CVE-2017-5753 и CVE-2017-5715)
Spectre нарушает изоляцию между различными приложениями. Это позволяет злоумышленнику обманом заставить безошибочные программы, соответствующие лучшим практикам, раскрыть свои секреты. Фактически, проверки безопасности согласно указанным передовым практикам фактически увеличивают поверхность атаки и могут сделать приложения более восприимчивыми к Spectre.
C, использует библиотеки:
Наносим текст «Волшебные слова — брезгливая костница». в памяти, а затем пытаемся прочитать его с помощью эксплойта. Если система уязвима, вы увидите тот же текст на выходе, считанный из памяти.
В этом коде, если скомпилированные инструкции victim_function() выполнялись в строгом программном порядке, функция будет читать только из array1[0..15] поскольку размер массива1 = 16. Однако при спекулятивном выполнении происходит чтение за пределами границ. возможны. Функция readMemoryByte() выполняет несколько обучающих вызовов victim_function() , чтобы предсказатель ветвления ожидал действительные значения для x, а затем вызывает x, выходящий за пределы допустимого диапазона. Условная ветвь дает неправильный прогноз, и последующее спекулятивное выполнение считывает секретный байт, используя выходной x. Затем спекулятивный код считывает из array2[array1[x] * 512] , пропуская значение array1[x] в состояние кэша. Для завершения атаки используется простой метод «flush+probe», чтобы определить, какая строка кэша в массиве array2 была загружена, и раскрывает содержимое памяти. Атака повторяется несколько раз, поэтому, даже если целевой байт изначально был некэширован, первая итерация перенесет его в кеш.
Неоптимизированный код читает примерно 10 КБ/с на i7 Surface Pro 3.
gcc -std=c99 Source.c -o spectre.out или make
Создайте новый пустой проект и добавьте Source.c, затем нажмите «Создать».
.spectre.out без параметров.
.spectre.out {address} {length} с параметрами: