
Пример использования раскрытого эксплойта "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() выполняет несколько обучающих вызовов , чтобы предсказатель ветвлений ожидал допустимые значения для x, после чего вызывает функцию с x вне границ. Условный переход предсказывается неверно, и последующее спекулятивное выполнение считывает секретный байт, используя x вне границ. Затем спекулятивный код читает из , утекая значение в состояние кэша. Для завершения атаки применяется простая техника flush+probe, позволяющая определить, какая строка кэша в была загружена, что раскрывает содержимое памяти. Атака повторяется несколько раз, поэтому даже если целевой байт изначально не был в кэше, первая итерация поместит его в кэш.
victim_function()array2[array1[x] * 512]array1[x]array2Неоптимизированный код считывает примерно 10 КБ/сек на i7 Surface Pro 3.