
Пример использования раскрытого эксплойта "Spectre" (CVE-2017-5753 и CVE-2017-5715)
Пример использования раскрытого эксплойта «Spectre» от 2 января 2018 года (CVE-2017-5753 и CVE-2017-5715)
Spectre нарушает изоляцию между различными приложениями. Он позволяет атакующему обманом заставить безошибочные программы, следующие лучшим практикам, раскрыть свои секреты. Более того, проверки безопасности из упомянутых лучших практик фактически увеличивают поверхность атаки и могут сделать приложения более восприимчивыми к Spectre.
C, используемые библиотеки:
Мы помещаем текст «The Magic Words are Squeamish Ossifrage.» в память, а затем пытаемся прочитать его с помощью эксплойта. Если система уязвима, вы увидите в выводе тот же текст, прочитанный из памяти.
В этом коде, если бы скомпилированные инструкции в victim_function() выполнялись строго в программном порядке, функция читала бы только из array1[0..15], поскольку размер array1 = 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 и нажмите «Сборка» (Build).
.\spectre.out без параметров.
.\spectre.out {address} {length} с параметрами: