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

Атака по времени

Атака по времени — это класс методов нарушения безопасности компьютерных систем, основанный на анализе временны́х характеристик выполнения криптографических или иных вычислительных операций. Злоумышленник измеряет и анализирует время, затрачиваемое системой на обработку определённых данных, чтобы извлечь секретную информацию (например, криптографические ключи, пароли, PIN-коды) или параметры, которые не должны быть раскрыты. Атаки по времени относятся к категории побочных каналов утечки информации (side-channel attacks), где используется не логика алгоритма, а физические проявления его работы.

Принцип действия

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

  • Условных переходов: Разные ветви кода могут выполняться за разное время. Например, операция сравнения двух чисел может завершиться раньше, если они равны, или позже, если требуется дополнительная обработка неравенства.
  • Оптимизаций компилятора: Компиляторы могут генерировать код, где время выполнения зависит от входных данных (например, использование таблиц подстановок вместо арифметических операций).
  • Кэширования: Время доступа к данным из кэша процессора значительно меньше, чем из оперативной памяти. Если секретный ключ влияет на то, какие данные попадают в кэш, злоумышленник может определить это по времени доступа.
  • Платформенных особенностей: Различия в микроархитектуре процессоров (например, конвейеризация, предсказание переходов) могут создавать измеримые временны́е вариации.

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

История

Концепция атаки по времени была впервые формально описана в открытой литературе в 1996 году Полом Кохером (Paul Kocher) в его работе «Timing Attacks on Implementations of Diffie-Hellman, RSA, DSS, and Other Systems». Кохер продемонстрировал, что, измеряя время, затрачиваемое на операцию модульного возведения в степень (ключевую для RSA и Diffie-Hellman), можно восстановить секретный ключ. Его работа показала, что даже незначительные временны́е вариации (порядка микросекунд) могут быть использованы для полного компрометирования системы.

До этого считалось, что криптографические алгоритмы, такие как RSA, являются математически стойкими. Работа Кохера открыла новое направление в криптоанализе — атаки по побочным каналам. В последующие годы были разработаны более сложные варианты атак по времени, включая атаки на кэш (например, Prime+Probe, Flush+Reload), атаки на предсказание переходов (Branch Prediction Analysis) и атаки на время выполнения в облачных средах.

Классификация атак по времени

Атаки по времени можно классифицировать по нескольким признакам:

По типу измеряемого параметра

  • Прямые атаки: Измеряется общее время выполнения операции (например, всего процесса аутентификации).
  • Атаки на кэш: Измеряется время доступа к памяти для определения состояния кэша (попадание или промах). Примеры: Prime+Probe, Flush+Reload, Evict+Time.
  • Атаки на конвейер: Измеряется время, связанное с предсказанием переходов и выполнением инструкций в конвейере процессора.

По способу получения измерений

  • Удалённые атаки: Злоумышленник измеряет время ответа по сети. Точность снижается из-за сетевых задержек, но при достаточном количестве измерений (статистическое усреднение) возможна.
  • Локальные атаки: Злоумышленник имеет физический доступ к системе (или работает на той же машине) и может использовать высокоточные таймеры (например, инструкцию RDTSC в процессорах x86).

По цели атаки

  • Атаки на криптографические ключи: Восстановление секретного ключа (RSA, DSA, ECDSA, AES).
  • Атаки на пароли и PIN-коды: Определение правильной последовательности символов путём анализа времени сравнения строк.
  • Атаки на протоколы: Определение параметров протокола (например, длины сообщения, номера сессии).

Примеры реализации

Атака на сравнение строк (паролей)

Классический пример — реализация сравнения строк в языке C:

``c int strcmp(const char a, const char b) { while (a && a == b) { a++; b++; } return a - *b; } ``

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

Атака на RSA (алгоритм Кохера)

В алгоритме RSA операция модульного возведения в степень (m^d mod n) часто реализуется через «квадрат и умножь» (square-and-multiply). Время выполнения этой операции зависит от значения секретного ключа d: для каждого бита ключа, равного 1, выполняется дополнительная операция умножения. Измеряя общее время возведения в степень для разных входных сообщений m, злоумышленник может статистически определить, какие биты ключа равны 1.

Атака на кэш (Flush+Reload)

Эта атака используется для определения, какие данные из памяти были загружены в кэш процессора. Злоумышленник:

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

Методы защиты

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

  • Постоянное время выполнения (Constant-time): Код пишется таким образом, чтобы время его выполнения не зависело от секретных данных. Это достигается:
  • Использованием фиксированного количества операций (например, всегда выполнять полное сравнение строк, независимо от результата).
  • Заменой условных переходов на побитовые операции (например, result = (a ^ b) & mask вместо if (a == b) ...).
  • Использованием специализированных библиотек (например, libsodium, OpenSSL с опцией -DTIMING_RESISTANT).
  • Слепое выполнение (Blinding): Секретные данные смешиваются со случайными значениями перед выполнением операции. Например, в RSA можно умножить сообщение на случайное число, выполнить возведение в степень, а затем разделить результат. Время выполнения становится случайным и не коррелирует с ключом.
  • Изоляция процессов: Использование виртуализации, контейнеризации и аппаратных изоляций (например, Intel SGX, AMD SEV) для предотвращения локальных атак на кэш.
  • Подавление таймеров: Ограничение точности доступных злоумышленнику таймеров (например, отключение инструкции RDTSC или добавление случайного шума в измерения времени).
  • Аппаратная поддержка: Разработка процессоров с аппаратной поддержкой постоянного времени для критических операций (например, инструкции AES-NI в процессорах Intel).

Значение в информационной безопасности

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

Источники

  1. Kocher, P. (1996). Timing Attacks on Implementations of Diffie-Hellman, RSA, DSS, and Other Systems. Advances in Cryptology — CRYPTO '96.
  2. Bernstein, D. J. (2005). Cache-timing attacks on AES. Technical Report.
  3. Osvik, D. A., Shamir, A., & Tromer, E. (2006). Cache Attacks and Countermeasures: the Case of AES. CT-RSA 2006.
  4. Yarom, Y., & Falkner, K. (2014). FLUSH+RELOAD: a high resolution, low noise, L3 cache side-channel attack. USENIX Security Symposium.
  5. Almeida, J. B., Barbosa, M., Barthe, G., & Dupressoir, F. (2016). Verifiable side-channel security of cryptographic implementations: constant-time. Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security.

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

На главную BFOmetr →