Распознавание предвыборки в атаке очистки и перезагрузки

Вопрос или проблема

Мы пытаемся реализовать атаку flush and reload для проекта в университете.

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

Сторона атакующего абстрактно выглядит так (это псевдокод, реальная программа написана на C):

Пока жертва работает: reload_and_flush(adrs)

Мы понимаем, что эта реализация проблематична по следующей причине: получение 3 попаданий в кэш кажется больше вопросом удачи, чем тем, что между каждым циклом цикла while будет происходить переключение контекста на жертву, и жертва загрузит тот адрес, который мы ищем. Мы пробовали добавить немного ожидания между сбросом и перезагрузкой, но это дало нам результат, что каждый раз происходит попадание в кэш, вероятно, из-за предзагрузки.

Кроме того, мы не уверены, почему, даже без предзагрузки, мы ожидаем получить 3 последовательных попадания в кэш. Если мы подслушиваем адрес функции, жертва загрузит его, как только войдет в функцию, и больше нет. Так почему мы ожидаем, что она загрузит адрес больше одного раза?

Мы выбрали статью, демонстрирующую, как использовать flush and reload для атаки на некоторые уязвимые реализации TLS или DTLS сервера. В частности, те, кто использует фиктивное ожидание для борьбы с атакой Lucky13. Мы пытаемся выяснить, используют ли они фиктивную функцию ожидания, тем самым подразумевая, что аргумент, который мы предоставили для расшифровки, имел допустимое заполнение, а затем используя орла Lucky13, чтобы расшифровать сообщение.


Статья (хотя я не думаю, что это необходимо для ответа на вопрос, я добавляю ее для полноты)

https://static.aminer.org/pdf/20170130/pdfs/ccs/hyjisbk0qsvct1wnf5gyhe4fzp28vecr.pdf

Ответ или решение

Распознавание предварительной выборки в атаке Flush and Reload

Атака Flush and Reload представляет собой новый способ анализа кэша, который может привести к извлечению секретной информации, например, ключей шифрования. Ваша проблема с предварительной выборкой данных в кэш — это распространённая трудность, с которой сталкиваются исследователи и практики при реализации данной атаки. Ниже будут приведены ключевые аспекты, коорденирующие успешное выполнение атаки и успешное выявление методов борьбы с предварительной выборкой.

Понимание Premptive Prefetching

Первое, что необходимо отметить, — это функция предварительной выборки в современных процессорах, которая автоматически загружает данные в кэш, основываясь на предполагаемых будущих обращениях к данным. Это поведение осложняет реализацию атак, зависящих от Flush and Reload, поскольку адрес, который вы очистили (flush), может быть снова загружен в кэш до того, как вы выполните операцию сбора данных (reload).

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

Стратегия с тремя последовательными касаниями кэша

Стратегия с тремя последовательными касаниями кэша относится к необходимости фиксировать наборы данных, на которых вы будете работать. Фиксируя три кэш-хита подряд, вы можете уменьшить вероятность ложных срабатываний, вызванных предварительной выборкой. Однако как вы правильно заметили, такой подход может зависеть от случайного переключения контекста, в результате чего не всегда можно гарантировать, что программа жертвы будет активна именно в нужный момент.

Неправильная реализация на стороне атакующего

Ключевой проблемой в вашей текущей реализации является способ, которым вы осуществляете операцию reload_and_flush(adrs). Чтобы обеспечить результативность, учитывайте:

  1. Контекст переключений: Убедитесь, что ваш атакующий код правильно отслеживает и управляет состояниями переключений. В противном случае, возможно, вам потребуется рассмотреть более точные способы интеграции нападений на основе временной синхронизации. Эти синхронизации могут быть выстраиваемыми за счет использования сигналов или флагов.

  2. Избегайте задержек: Введение задержек может помочь, но они также могут привести к ложным срабатываниям. Вместо этого, подумайте о реализации своего механизма синхронизации, который активируется при определенных условиях, таких как завершение работы уязвимой функции.

  3. Статистическая проверка: Используйте более сложные статистические методы для анализа данных, получаемых из кэша. Убедитесь, что у вас есть достаточное количество повторений для подтверждения результатов.

Зачем три кэш-хита?

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

Заключение

При реализации Flush and Reload атак критически важным является внимание к особенностям кэширования и управления процессами на уровне аппаратного обеспечения. Анализ производительности и стилей доступа к данным позволит вам избежать ловушек предварительной выборки. Направляя усилия на корректное управление контекстом и синхронизацией вашего кода, вы сможете повысить вероятность успешного выполнения вашей атаки.

Оцените материал
Добавить комментарий

Капча загружается...