Пример использования обнаруженного эксплойта 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}
с параметрами: