Открыть сервис

Атака Flush+Reload

Атака Flush+Reload — это метод программного криптоанализа, реализующий атаку по сторонним каналам (side-channel attack), основанную на анализе времени доступа к кэш-памяти центрального процессора (CPU). Данная атака относится к классу атак на кэш-память (cache attacks) и позволяет злоумышленнику, работающему на той же физической машине (например, в облачной среде или на многоядерном процессоре), извлекать конфиденциальные данные, такие как криптографические ключи, из других процессов или виртуальных машин. Атака была впервые описана в 2014 году группой исследователей из Висбадена и Технического университета Граца (Ю. Ярмуш, К. Бем, Д. Генкин, М. Шварц, О. Шварц) и является эволюцией более ранних методов, таких как Prime+Probe.

История и происхождение

Метод Flush+Reload был представлен в 2014 году на конференции USENIX Security Symposium. Он стал развитием идей, заложенных в атаке Prime+Probe (2005 год), которая также использовала кэш-память для извлечения информации, но требовала более сложной настройки и была менее точной. Flush+Reload упростил процесс, используя инструкцию clflush (cache line flush) для принудительного сброса кэш-линий и последующего мониторинга времени их загрузки. В 2018 году атаки на основе Flush+Reload легли в основу более масштабных уязвимостей, таких как Meltdown и Spectre, которые поразили процессоры Intel, AMD и ARM.

Принцип работы

Атака Flush+Reload основана на том факте, что время доступа к данным в кэш-памяти (L1, L2, L3) значительно меньше, чем к данным в оперативной памяти (RAM). Разница во времени составляет от десятков до сотен наносекунд, что измеримо с высокой точностью с помощью высокоточных таймеров, доступных в пользовательском пространстве (например, инструкция rdtsc на процессорах x86).

Этапы атаки

  1. Flush (сброс): Злоумышленник с помощью инструкции clflush принудительно сбрасывает из кэша определённую кэш-линию, соответствующую интересующему его адресу памяти (например, адресу, где хранится часть криптографического ключа). Эта инструкция доступна в режиме пользователя на большинстве современных процессоров.
  2. Wait (ожидание): Атакующий ждёт некоторое время, пока целевой процесс (жертва) выполнит свои операции и, возможно, загрузит эту кэш-линию обратно в кэш при обращении к соответствующей памяти.
  3. Reload (перезагрузка): Злоумышленник снова пытается прочитать данные из того же адреса памяти и измеряет время доступа. Если время доступа мало (попадание в кэш), это означает, что жертва обратилась к этому адресу в течение периода ожидания. Если время велико (промах кэша), то обращения не было.

Повторяя этот цикл многократно, атакующий может построить временную диаграмму обращений жертвы к памяти, что позволяет восстановить последовательность инструкций или данные, например, биты ключа шифрования.

Требования к среде

Для успешной реализации атаки Flush+Reload необходимы следующие условия:

  • Общая физическая память: Атакующий и жертва должны иметь доступ к одной и той же физической странице памяти. Это возможно в сценариях с общей памятью (shared memory) между процессами, при использовании библиотек динамической компоновки (например, libcrypto) или при виртуализации, когда гипервизор не изолирует кэш-память между виртуальными машинами.
  • Высокоточный таймер: Необходим доступ к таймеру с разрешением в наносекунды. На процессорах x86 это обеспечивается инструкцией rdtsc (Read Time-Stamp Counter), которая часто доступна в пользовательском режиме.
  • Кэш-память последнего уровня (LLC): Атака эффективна против кэшей L3, которые являются общими для всех ядер процессора, что позволяет атаковать процессы, работающие на разных ядрах.

Классификация и варианты

Flush+Reload относится к категории атак на кэш-память, основанных на времени. Существуют несколько его модификаций:

  • Flush+Flush: Вариант, при котором атакующий использует только инструкцию clflush и измеряет время её выполнения, которое зависит от того, находится ли кэш-линия в кэше. Этот метод более скрытен, так как не требует чтения данных.
  • Evict+Reload: Атака, при которой сброс кэша заменяется вытеснением кэш-линии путём заполнения кэша другими данными. Используется, когда инструкция clflush недоступна (например, на некоторых процессорах ARM).
  • Prime+Probe: Предшественник Flush+Reload, где атакующий «заполняет» кэш своими данными, а затем проверяет, какие из них были вытеснены жертвой.

Применение и примеры

Извлечение криптографических ключей

Наиболее известное применение Flush+Reload — извлечение закрытых ключей RSA и AES из библиотек OpenSSL и GnuPG. В 2014 году исследователи продемонстрировали, что атака позволяет восстановить 96% битов ключа RSA-2048 за несколько минут, наблюдая за обращениями к таблицам подстановок (S-boxes) в алгоритме AES.

Атаки на облачные вычисления

В облачных средах, где несколько виртуальных машин (ВМ) работают на одном физическом сервере, Flush+Reload может быть использована для межвиртуального шпионажа. Например, в 2015 году была показана возможность извлечения ключей шифрования из ВМ, работающей на том же процессоре, что и ВМ злоумышленника, при условии использования общей памяти (например, через библиотеки, загруженные гипервизором).

Уязвимости Meltdown и Spectre

Flush+Reload стал основой для более сложных атак, таких как Meltdown (CVE-2017-5754) и Spectre (CVE-2017-5753, CVE-2017-5715), которые были раскрыты в 2018 году. Эти атаки использовали спекулятивное исполнение процессора для доступа к памяти, к которой у процесса нет прав, а затем с помощью Flush+Reload извлекали эту информацию через кэш.

Контрмеры и защита

Защита от атак Flush+Reload включает несколько уровней:

  • Программные меры:
  • Изоляция кэша: Использование инструкций, таких как clflush в защищённых режимах, или отключение общего кэша для критических процессов. В операционных системах (например, Linux) применяются патчи, которые предотвращают использование rdtsc в пользовательском режиме или ограничивают его точность.
  • Постоянное время выполнения: Криптографические алгоритмы модифицируются так, чтобы время выполнения не зависело от входных данных (например, использование таблиц подстановок с фиксированным временем доступа или замена табличных операций на арифметические).
  • Деактивация общей памяти: Ограничение использования shared memory между процессами разных уровней доверия.
  • Аппаратные меры:
  • Изоляция кэша: Процессоры Intel внедрили технологию Cache Allocation Technology (CAT), которая позволяет выделять определённые области кэша для конкретных процессов или ВМ.
  • Отключение спекулятивного исполнения: Микрокодовые обновления (microcode updates) от Intel и AMD, выпущенные после 2018 года, частично блокируют спекулятивные уязвимости, но могут снижать производительность.
  • Аппаратные барьеры: Внедрение инструкций, таких как lfence (load fence), для синхронизации доступа к памяти.

Критика и ограничения

Несмотря на эффективность, атака Flush+Reload имеет ряд ограничений:

  • Требование общей памяти: Без возможности разделять физическую память между процессами атака невозможна. В современных операционных системах с включённой изоляцией (например, KASLR — Kernel Address Space Layout Randomization) это усложняется.
  • Шум и точность: В многозадачных системах измерения времени могут быть зашумлены из-за прерываний, планировщика задач и других процессов. Для повышения точности требуется многократное повторение атак.
  • Обнаружение: Атака оставляет следы в виде частых вызовов clflush и rdtsc, что может быть обнаружено системами мониторинга (например, через анализ производительности или трассировку системных вызовов).

Интересные факты

  • Атака Flush+Reload была впервые продемонстрирована на процессорах Intel Core i7, но позже была адаптирована для процессоров AMD и ARM.
  • В 2017 году исследователи из Университета Аделаиды показали, что Flush+Reload может быть использована для извлечения данных из защищённых областей памяти (например, Intel SGX — Software Guard Extensions), что привело к разработке новых контрмер.
  • Метод является частью более широкого класса атак, известных как «атаки по времени на кэш» (cache-timing attacks), которые изучаются с середины 1990-х годов.

Источники

  • Y. Yarom, K. Bock, D. Genkin, M. Schwarz, O. Schwarz. "Flush+Reload: a High Resolution, Low Noise, L3 Cache Side-Channel Attack". USENIX Security Symposium, 2014.
  • D. Genkin, L. Pachmanov, E. Tromer, Y. Yarom. "Stealing Keys from PCs using a Radio: Cheap Electromagnetic Attacks on Windowed Exponentiation". 2015.
  • M. Lipp, M. Schwarz, D. Gruss, T. Prescher, W. Haas, A. Fogh, J. Horn, S. Mangard, P. Kocher, D. Genkin, Y. Yarom, M. Hamburg. "Meltdown: Reading Kernel Memory from User Space". USENIX Security Symposium, 2018.
  • P. Kocher, J. Horn, A. Fogh, D. Genkin, D. Gruss, W. Haas, M. Hamburg, M. Lipp, S. Mangard, T. Prescher, M. Schwarz, Y. Yarom. "Spectre Attacks: Exploiting Speculative Execution". 2018.
  • Intel Corporation. "Cache Allocation Technology". Intel 64 and IA-32 Architectures Software Developer's Manual, 2023.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →