Апокриф 13

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

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

Криптография анализирует алгоритмы в модели, где противник видит только входы и выходы. Реальный процессор добавляет к этому время, потребление энергии, электромагнитное излучение и состояние кэша. Сторонний канал — это любая такая утечка, и история показывает, что её достаточно, чтобы извлечь ключ, не ломая ни один шифр.

Тема идёт от простого к сложному. Сначала время: сравнение тегов с ранним выходом и атака Кохера на модульное возведение в степень. Потом кэш: Flush+Reload и Prime+Probe, на которых ломали AES и восстанавливали ключи RSA. Затем энергопотребление: DPA и корреляционный анализ. Завершается защитой: константное время, маскирование, ослепление и то, почему эти меры обязательны даже в «чистом» коде.

Время как канал

Ранний выход

Функция сравнения тегов часто пишется так: пройти по байтам и вернуть False на первом несовпадении. Это быстро и естественно — и утекает: время работы зависит от того, сколько байт совпало. Противник подбирает байт за байтом, измеряя время ответа; для 16-байтного тега это в сотни раз меньше работы, чем полный перебор 1.

Защита — сравнение без раннего выхода: пройти все байты, накопить различие в переменной и проверить его в конце. Длина тоже должна обрабатываться отдельно, чтобы не создавать второй канал.

Атака на возведение в степень

Кохер показал, что реализация m^d mod n с ветвлением по битам d утекает: умножение выполняется только для единичных бит, и время зависит от ключа. Атака восстанавливает d по замерам. Защита — алгоритм с постоянным числом операций (Монтгомери, «always multiply») и ослепление: m' = m·r^e, результат делится на r, и время перестаёт коррелировать с m 1.

Схема на рисунке 1.

Атака по времени
Рисунок 1. Ранний выход: время ответа зависит от числа совпавших байт, и секрет собирается побайтово

Удалённые атаки

Брумли и Боне показали, что атака по времени работает по сети, несмотря на шум: статистика по many запросам выделяет сигнал 3. Это изменило отношение к «локальным» утечкам: если сервер считает что-то секретное, время ответа — публичный канал. Lucky13 показал, что такой канал находится и в MAC-обработке TLS 8.

Кэш как канал

Flush+Reload и Prime+Probe

Кэш общий между процессами и ядрами. Flush+Reload использует разделяемую память: противник сбрасывает строку кэша, ждёт, пока жертва обратится к ней, и по времени доступа узнаёт, было ли обращение. Prime+Probe не требует разделяемой памяти: противник заполняет кэш своими строками и смотрит, какие вытеснены 4.

На этом ломали AES: таблицы подстановок индексируются байтами ключа, и обращение к конкретной строке кэша выдаёт байт. Первые работы — Бернстайн и независимо Гуллаш с соавторами 56.

Spectre и Meltdown

Спекулятивное исполнение добавляет новый класс: процессор выполняет инструкции, которые не должны были выполниться, и оставляет следы в кэше. Spectre и Meltdown показали, что границы процессов и ядра не спасают от утечки через микроархитектурное состояние 7. Для криптографии это означает: константное время на уровне языка недостаточно, если компилятор или процессор вносит ветвления.

Схема на рисунке 2.

Кэш-канал
Рисунок 2. Обращение к таблице по секретному индексу оставляет след в кэше; противник измеряет время доступа

Энергопотребление и DPA

Идея

Каждая операция потребляет энергию, и потребление зависит от данных: вес Хэмминга, переключения битов. Дифференциальный анализ энергопотребления (DPA) собирает много трасс и коррелирует их с гипотезами о ключе. Для AES достаточно гипотезы о выходе S-бокса: SBOX(p ⊕ k); верный байт даёт максимальную корреляцию 2.

Почему это работает

Шум велик, но он случаен, а сигнал систематичен. При тысячах трасс корреляция верной гипотезы статистически значимо превышает корреляцию неверных. Атака не требует знания реализации: достаточно модели потребления.

Защита

Маскирование: значение x заменяется на x ⊕ m, и все операции ведутся над долями; потребление перестаёт коррелировать с x. Скрытие: случайные задержки и дополнительная работа, чтобы выровнять трассы. Комбинирование даёт практическую стойкость, но не абсолютную: атаки высшего порядка и профилирование продолжают работать.

Как писать константный код

Правила

Не ветвиться по секрету. Не индексировать массивы секретом. Не использовать секрет в условиях выхода из цикла. Не полагаться на то, что компилятор «сам оптимизирует». Сравнивать теги целиком и накапливать различие. Использовать библиотечные функции, спроектированные для этого (например, hmac.compare_digest), а не самописные.

Проверка

Автотесты не ловят утечки по времени. Помогают анализ на уровне машинного кода, инструменты вроде dudect (статистическая проверка константности), ревью и осторожность с оптимизациями. В Python и Java константность принципиально ограничена: виртуальная машина и сборщик мусора вносят шум, поэтому критические операции выносят в нативные библиотеки.

Итоги темы

  • Время, кэш и энергия — реальные каналы утечки, а не теория.
  • Ранний выход в сравнении тегов выдаёт секрет побайтово.
  • Ветвление по битам ключа ломается атакой Кохера; ослепление помогает.
  • Flush+Reload и Prime+Probe извлекают индексы таблиц; Spectre расширил класс.
  • DPA восстанавливает ключ по корреляции трасс.
  • Защита: константный код, маскирование, ослепление, библиотечные примитивы.

Литература

  1. Kocher P. Timing Attacks on Implementations of Diffie-Hellman, RSA, DSS, and Other Systems. CRYPTO 1996. — исходная работа по атакам на время.
  2. Kocher P., Jaffe J., Jun B. Differential Power Analysis. CRYPTO 1999. — DPA и корреляционный анализ.
  3. Brumley D., Boneh D. Remote Timing Attacks are Practical. USENIX Security 2003. — атака по сети на RSA в OpenSSL.
  4. Yarom Y., Falkner K. Flush+Reload: A High Resolution, Low Noise, L3 Cache Side-Channel Attack. USENIX Security 2014. — методика кэш-атаки.
  5. Bernstein D. Cache-Timing Attacks on AES. 2005. — таблицы AES как источник утечки.
  6. Gullasch D., Bangerter E., Krenn S. Cache Games — Bringing Access-Based Cache Attacks on AES to Practice. IEEE S&P 2011. — практическая реализация.
  7. Kocher P. et al. Spectre Attacks: Exploiting Speculative Execution. IEEE S&P 2019. — спекулятивное исполнение как канал.
  8. AlFardan N., Paterson K. Lucky Thirteen: Breaking the TLS and DTLS Record Protocols. IEEE S&P 2013. — тайминговая атака на MAC в реальном протоколе.