Утечки через side-channel в браузерной среде

Криптографические примитивы, предоставляемые Web Crypto API, рассчитаны на защиту данных от прямого криптоанализа, но не устраняют угрозы, связанные с утечками информации через побочные каналы исполнения. В браузерной среде такие утечки приобретают особую значимость из-за многослойной архитектуры JavaScript-движков, разделяемых ресурсов и высокоточного измерения времени.

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


Высокоточные таймеры и временные атаки

Одним из ключевых источников утечек в браузере является измерение времени выполнения операций. Различия в миллисекундах или даже наносекундах могут отражать структуру обрабатываемых данных.

В JavaScript доступны интерфейсы измерения времени, такие как performance.now(), которые обеспечивают высокую точность. Исторически эта точность была настолько высокой, что позволяла реализовывать атаки класса timing attack даже в условиях песочницы браузера.

Механизм утечки через время выполнения

Криптографические операции, зависящие от входных данных (например, обработка различных битов ключа), могут выполняться с различной скоростью. Например:

  • ветвления в алгоритмах
  • условные умножения или сложения
  • работа с памятью в зависимости от значения байтов

Если время выполнения коррелирует с секретом, наблюдатель может статистически восстановить его через многократные измерения.


Влияние JIT-компиляции и оптимизаций движка

JavaScript-движки (V8, SpiderMonkey, JavaScriptCore) активно применяют JIT-компиляцию, что добавляет дополнительный слой непредсказуемости.

Оптимизации могут:

  • инлайнить криптографические функции
  • изменять порядок инструкций
  • применять branch prediction
  • устранять “мнимые” ветвления

Это приводит к тому, что даже попытки написать «константное время» на уровне JS-кода могут быть нарушены оптимизатором.

Особенно опасны ситуации деоптимизации (deopt), когда функция внезапно переключается между режимами выполнения, создавая заметные скачки времени.


Spectre-подобные атаки и влияние архитектуры CPU

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

В контексте Web Crypto API это означает, что даже изолированный процесс может косвенно утекать информацию через:

  • кэш L1/L2 процессора
  • branch prediction state
  • shared execution resources

Хотя браузеры применяют меры изоляции сайтов и процессов, полностью устранить микропроцессорные побочные каналы невозможно.


SharedArrayBuffer и снижение энтропии таймеров

Ранее доступ к SharedArrayBuffer усиливал точность атак через тайминги, позволяя создавать высокочастотные таймеры внутри JavaScript.

После обнаружения угроз браузеры ввели ограничения, включая:

  • cross-origin isolation (COOP/COEP)
  • снижение точности таймеров
  • рандомизацию измерений времени

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


Кэш-атаки в браузерной среде

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

  • измерение времени доступа к данным
  • конкуренцию за линии кэша
  • косвенные эффекты через JavaScript массивы

Даже без прямого доступа к памяти, различие между cache hit и cache miss может служить источником информации о криптографических операциях.


Проблемы Web Crypto API с точки зрения побочных каналов

Web Crypto API (crypto.subtle) проектировался как безопасная абстракция над нативными криптографическими реализациями. Однако его безопасность зависит от:

  • реализации внутри браузера
  • использования аппаратных ускорений
  • поведения операционной системы

Основные риски:

1. Неполная гарантия constant-time исполнения Хотя нативные реализации стремятся к constant-time, взаимодействие с JS-обёрткой может вносить шум и вариации.

2. Использование аппаратных ускорителей AES-NI и аналогичные инструкции ускоряют операции, но могут иметь различимые временные характеристики при разных входных данных.

3. Асинхронность API Асинхронные вызовы скрывают часть таймингов, но создают новые побочные каналы через планировщик задач.


RSA и ECDSA: утечки через реализацию

Ассиметричные алгоритмы особенно чувствительны к побочным каналам.

RSA

В RSA операции возведения в степень могут зависеть от:

  • структуры экспоненты
  • метода square-and-multiply
  • оптимизаций CRT (Chinese Remainder Theorem)

Если реализация не строго constant-time, возможно восстановление ключа через анализ времени.

ECDSA

ECDSA критически зависит от одноразового значения nonce (k). Любая утечка информации о nonce через:

  • время генерации
  • кэш-поведение
  • повторное использование RNG

может привести к восстановлению приватного ключа.


RNG и влияние состояния системы

crypto.getRandomValues() считается криптографически стойким, однако в браузере его поведение зависит от:

  • операционной системы
  • аппаратного генератора случайных чисел
  • состояния процесса

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


Изоляция контекстов и ограничения песочницы

Браузерная песочница снижает риски, но не устраняет их полностью.

Используются механизмы:

  • процессная изоляция сайтов
  • site isolation (каждый origin в отдельном процессе)
  • ограничение высокоточных таймеров
  • throttling фоновых вкладок

Однако даже при этом остаются каналы:

  • общие аппаратные ресурсы
  • предсказуемость планировщика
  • косвенные взаимодействия через API производительности

Контрмеры и практики безопасной реализации

Основной принцип защиты от side-channel утечек в Web Crypto API заключается не в устранении каналов (что невозможно на уровне браузера), а в снижении их информативности.

Ключевые подходы:

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

Алгоритмы должны избегать:

  • ветвлений по секретным данным
  • ранних выходов (early exit)
  • зависимых от данных обращений к памяти

Минимизация зависимости от JavaScript-логики

Криптографические операции должны выполняться внутри нативных реализаций, а не в JS.

Устранение высокоточных таймеров

Снижение точности performance.now() уменьшает эффективность атак, основанных на микроразличиях времени.

Изоляция происхождений

COOP/COEP предотвращают утечки через shared memory и повышают предсказуемость окружения.


Ограниченность модели безопасности браузера

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

Факторы, нарушающие модель:

  • микроархитектурные атаки CPU
  • оптимизации JIT-компилятора
  • конкуренция ресурсов между вкладками
  • поведенческие особенности планировщика ОС

Значение побочных каналов в реальных угрозах

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

  • деанонимизации пользователей
  • корреляции криптографических операций
  • утечек шаблонов использования API
  • анализа поведения приложений

Криптографическая стойкость Web Crypto API остаётся высокой при корректном использовании, однако безопасность системы в целом определяется слабейшим звеном — окружением исполнения.