Криптографические примитивы, предоставляемые Web Crypto API, рассчитаны на защиту данных от прямого криптоанализа, но не устраняют угрозы, связанные с утечками информации через побочные каналы исполнения. В браузерной среде такие утечки приобретают особую значимость из-за многослойной архитектуры JavaScript-движков, разделяемых ресурсов и высокоточного измерения времени.
Побочный канал возникает всякий раз, когда злоумышленник способен косвенно наблюдать свойства вычисления: время выполнения, особенности кэширования, поведение памяти, конкуренцию потоков или вариации системных вызовов. Даже если криптографический алгоритм математически корректен, реализация или окружение могут раскрывать чувствительную информацию.
Одним из ключевых источников утечек в браузере является измерение времени выполнения операций. Различия в миллисекундах или даже наносекундах могут отражать структуру обрабатываемых данных.
В JavaScript доступны интерфейсы измерения времени, такие как
performance.now(), которые обеспечивают высокую точность.
Исторически эта точность была настолько высокой, что позволяла
реализовывать атаки класса timing attack даже в условиях песочницы
браузера.
Криптографические операции, зависящие от входных данных (например, обработка различных битов ключа), могут выполняться с различной скоростью. Например:
Если время выполнения коррелирует с секретом, наблюдатель может статистически восстановить его через многократные измерения.
JavaScript-движки (V8, SpiderMonkey, JavaScriptCore) активно применяют JIT-компиляцию, что добавляет дополнительный слой непредсказуемости.
Оптимизации могут:
Это приводит к тому, что даже попытки написать «константное время» на уровне JS-кода могут быть нарушены оптимизатором.
Особенно опасны ситуации деоптимизации (deopt), когда функция внезапно переключается между режимами выполнения, создавая заметные скачки времени.
Современные браузеры вынуждены учитывать уязвимости спекулятивного исполнения, такие как Spectre. Эти атаки позволяют извлекать данные из памяти через кэш-эффекты.
В контексте Web Crypto API это означает, что даже изолированный процесс может косвенно утекать информацию через:
Хотя браузеры применяют меры изоляции сайтов и процессов, полностью устранить микропроцессорные побочные каналы невозможно.
Ранее доступ к SharedArrayBuffer усиливал точность атак
через тайминги, позволяя создавать высокочастотные таймеры внутри
JavaScript.
После обнаружения угроз браузеры ввели ограничения, включая:
Однако даже деградация точности не устраняет полностью возможность восстановления информации через статистические методы при большом числе наблюдений.
Кэш процессора остаётся одним из наиболее информативных побочных каналов. В браузере он может быть использован через:
Даже без прямого доступа к памяти, различие между cache hit и cache miss может служить источником информации о криптографических операциях.
Web Crypto API (crypto.subtle) проектировался как
безопасная абстракция над нативными криптографическими реализациями.
Однако его безопасность зависит от:
1. Неполная гарантия constant-time исполнения Хотя нативные реализации стремятся к constant-time, взаимодействие с JS-обёрткой может вносить шум и вариации.
2. Использование аппаратных ускорителей AES-NI и аналогичные инструкции ускоряют операции, но могут иметь различимые временные характеристики при разных входных данных.
3. Асинхронность API Асинхронные вызовы скрывают часть таймингов, но создают новые побочные каналы через планировщик задач.
Ассиметричные алгоритмы особенно чувствительны к побочным каналам.
В RSA операции возведения в степень могут зависеть от:
Если реализация не строго constant-time, возможно восстановление ключа через анализ времени.
ECDSA критически зависит от одноразового значения nonce (k). Любая утечка информации о nonce через:
может привести к восстановлению приватного ключа.
crypto.getRandomValues() считается криптографически
стойким, однако в браузере его поведение зависит от:
Побочные каналы здесь проявляются не напрямую через значение, а через корреляцию времени генерации и состояния системы.
Браузерная песочница снижает риски, но не устраняет их полностью.
Используются механизмы:
Однако даже при этом остаются каналы:
Основной принцип защиты от side-channel утечек в Web Crypto API заключается не в устранении каналов (что невозможно на уровне браузера), а в снижении их информативности.
Ключевые подходы:
Алгоритмы должны избегать:
Криптографические операции должны выполняться внутри нативных реализаций, а не в JS.
Снижение точности performance.now() уменьшает
эффективность атак, основанных на микроразличиях времени.
COOP/COEP предотвращают утечки через shared memory и повышают предсказуемость окружения.
Браузерная криптография опирается на предположение, что атакующий ограничен JavaScript-контекстом. Однако современные побочные каналы выходят за пределы этого предположения.
Факторы, нарушающие модель:
В практических сценариях побочные каналы в браузере чаще используются не для прямого извлечения ключей, а для:
Криптографическая стойкость Web Crypto API остаётся высокой при корректном использовании, однако безопасность системы в целом определяется слабейшим звеном — окружением исполнения.