Сроки атаки - Timing attack

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

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

Атаки по времени часто упускаются из виду на этапе проектирования, потому что они настолько зависят от реализации и могут быть непреднамеренно введены с помощью оптимизация компилятора. Чтобы избежать атак по времени, необходимо разработать функции с постоянным временем и тщательно протестировать окончательный исполняемый код.[1]

Избегание

Многие криптографические алгоритмы могут быть реализованы (или замаскированы прокси) таким образом, чтобы уменьшить или исключить информацию о времени, зависящую от данных, алгоритм постоянного времени. Рассмотрим реализацию, в которой каждый вызов подпрограммы всегда возвращается ровно через x секунд, где x - максимальное время, которое когда-либо требовалось для выполнения этой подпрограммы для каждого возможного авторизованного ввода. В такой реализации время алгоритма не дает утечки информации о данных, предоставленных этому вызову. Обратной стороной этого подхода является то, что время, используемое для всех выполнений, становится временем наихудшего выполнения функции.

Зависимость времени от данных может быть связана с одним из следующих факторов:[1]

  • Доступ к нелокальной памяти, поскольку ЦП может кэшировать данные. Программное обеспечение, запущенное на ЦП с кешем данных, будет демонстрировать зависящие от данных временные изменения в результате того, что память просматривает кэш.
  • Условные прыжки. Современные процессоры пытаются спекулятивно выполнить прошлые прыжки по угадыванию. Неправильное предположение (не редкость для по существу случайных секретных данных) влечет за собой измеримую большую задержку, поскольку ЦП пытается вернуться назад. Это требует написания безотраслевой код.
  • Некоторые «сложные» математические операции в зависимости от аппаратного обеспечения ЦП:
    • Целочисленное деление - это почти всегда непостоянное время. ЦП использует цикл микрокода, который использует другой путь кода, когда либо делитель, либо делимое малы.
    • Процессоры без баррель шифтер выполняет смены и вращения в цикле, по одной позиции за раз. В результате сумма сдвига не должна быть секретной.
    • В старых процессорах умножение выполняется аналогично делению.

Примеры

Время выполнения для алгоритм квадратного и умножения используется в модульное возведение в степень линейно зависит от количества битов «1» в ключе. Хотя одного лишь количества битов «1» недостаточно для того, чтобы упростить поиск ключа, можно использовать повторные выполнения с одним и тем же ключом и разными входами для выполнения статистического корреляционного анализа информации о времени для полного восстановления ключа, даже если пассивный злоумышленник. Наблюдаемые временные измерения часто включают шум (из таких источников, как задержка в сети или различия в доступе к диску и доступ к доступу, а также исправление ошибки методы, используемые для восстановления после ошибок передачи). Тем не менее, временные атаки практичны против ряда алгоритмов шифрования, включая ЮАР, Эль-Гамаль, а Алгоритм цифровой подписи.

В 2003 г. Boneh и Брамли продемонстрировали практическую сетевую синхронизацию атаки на SSL -подключенные веб-серверы, основанные на другой уязвимости, связанной с использованием RSA с Китайская теорема об остатках оптимизации. Фактическое сетевое расстояние в их экспериментах было небольшим, но атака успешно восстановила закрытый ключ сервера за считанные часы. Эта демонстрация привела к повсеместному развертыванию и использованию ослепляющий методы в реализациях SSL. В этом контексте ослепление предназначено для устранения корреляции между ключом и временем шифрования.[2]

Некоторые версии Unix использовать относительно дорогую реализацию склеп библиотечная функция для хеширования 8-значного пароля в 11-символьную строку. На более старом оборудовании это вычисление занимало преднамеренно и ощутимо долгое время: в некоторых случаях до двух или трех секунд.[нужна цитата ] В авторизоваться Программа в ранних версиях Unix выполняла функцию crypt только тогда, когда имя пользователя распознавалось системой. Эта утечка информации о сроках действия имени для входа, даже если пароль был неверным. Злоумышленник может воспользоваться такими утечками, предварительно применив грубая сила чтобы создать список известных имен для входа в систему, затем попытайтесь получить доступ, объединив только эти имена с большим набором паролей, которые, как известно, часто используются. Без какой-либо информации о допустимости имен для входа время, необходимое для выполнения такого подхода, увеличилось бы на порядки, что фактически сделало бы его бесполезным. Более поздние версии Unix исправили эту утечку, всегда выполняя функцию crypt, независимо от действительности имени входа.[нужна цитата ]

Два в остальном надежно изолированных процесса, работающих в одной системе, либо кэш-память или же виртуальная память может общаться, умышленно вызывая ошибки страницы и / или промахи в кеше в одном процессе, а затем отслеживание результирующих изменений времени доступа в другом. Аналогичным образом, если приложение является доверенным, но на его пейджинг / кэширование влияет логика ветвления, второе приложение может определить значения данных по сравнению с условием ветвления, отслеживая изменения времени доступа; в крайних случаях это может позволить восстановить биты криптографического ключа.[3][4]

2017 год Meltdown и Призрак атаки, которые вынудили производителей процессоров (включая Intel, AMD, ARM и IBM) изменить дизайн своих процессоров, обе полагаются на атаки по времени.[нужна цитата ] По состоянию на начало 2018 года Spectre затрагивает почти все компьютерные системы в мире, что делает его самым мощным примером временной атаки в истории.[5][6][7]

Алгоритм

Следующее C код демонстрирует типичное небезопасное сравнение строк, которое останавливает тестирование, как только символ не совпадает. Например, при сравнении «ABCDE» с «ABxDE» он вернется после 3 итераций цикла:

bool insecureStringCompare(const пустота *а, const пустота *б, size_t длина) {  const char *ок = а, *cb = б;  за (size_t я = 0; я < длина; я++)    если (ок[я] != cb[я])      возвращаться ложный;  возвращаться истинный;}

Для сравнения: следующая версия работает с постоянным временем, проверяя все символы и используя побитовая операция для накопления результата:

bool constantTimeStringCompare(const пустота *а, const пустота *б, size_t длина) {  const char *ок = а, *cb = б;  bool результат = истинный;  за (size_t я = 0; я < длина; я++)    результат &= ок[я] != cb[я];  возвращаться результат;}

Примечания

Атаки по времени легче организовать, если злоумышленник знает внутреннюю структуру аппаратной реализации и, тем более, используемую криптографическую систему. Поскольку криптографическая безопасность никогда не должна зависеть от неизвестности того или другого (см. безопасность через безвестность, в частности Максим Шеннон и Принцип Керкхоффса ), сопротивления тайминговым атакам тоже не должно быть. По крайней мере, образец можно купить и перепроектировать. Атаки по времени и другие атаки по побочным каналам также могут быть полезны для идентификации или, возможно, обратного проектирования криптографического алгоритма, используемого каким-либо устройством.

Рекомендации

  1. ^ а б c «Постоянная криптовалюта». BearSSL. Получено 10 января 2017.
  2. ^ Дэвид Брамли и Дэн Боне. Дистанционные временные атаки практичны. Симпозиум по безопасности USENIX, август 2003 г.
  3. ^ См. Персиваль, Колин, Кеш отсутствует для развлечения и прибыли, 2005.
  4. ^ Бернштейн, Дэниел Дж., Атаки по времени кеширования на AES, 2005.
  5. ^ «Часто задаваемые вопросы по системам Spectre». Meltdown и Spectre.
  6. ^ «Недостатки безопасности подвергают опасности практически все телефоны и компьютеры». Рейтер. 4 января 2018.
  7. ^ «Возможное влияние на процессоры семейства POWER». Блог IBM PSIRT. 14 мая 2019.

дальнейшее чтение