Уязвимости, связанные с недостатком энтропии

В основе криптографической стойкости большинства операций в Stanford Javascript Crypto Library (SJCL) лежит генератор псевдослучайных чисел, построенный вокруг Fortuna-архитектуры. Его безопасность критически зависит от качества начальной и поступающей в процессе работы энтропии. Любое ослабление этого компонента автоматически превращает сильные алгоритмы шифрования в уязвимую систему.

SJCL не полагается на аппаратные источники случайности напрямую. Вместо этого библиотека собирает энтропию из поведения среды исполнения Jav * aScript: движения мыши, нажатия клавиш, изменения времени событий, параметры системы и другие косвенные сигналы. Эти данные агрегируются в пул энтропии и используются для инициализации PRNG.


Недостаточная начальная энтропия

Наиболее критический класс уязвимостей связан с моментом старта приложения, когда пул энтропии ещё не накопил достаточного объёма данных.

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

  • автоматический запуск в фоне (service workers, headless браузеры);
  • мгновенное создание ключей при загрузке страницы;
  • отсутствие пользовательского взаимодействия до криптографических операций;
  • серверный рендеринг JavaScript-кода, где отсутствуют реальные события окружения.

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


Проблема холодного старта в браузере

Браузерная среда является особенно уязвимой для проблемы холодного старта энтропии. SJCL зависит от событий DOM, но современные веб-приложения могут:

  • выполнять криптографические операции до появления пользовательского ввода;
  • работать внутри скрытых iframe без событий мыши;
  • запускаться автоматически при восстановлении сессии;
  • использовать SPA-фреймворки, где инициализация происходит до интерактивности.

В таких условиях пул энтропии пополняется медленно или вообще остаётся пустым на момент генерации ключей.


Переиспользование состояния PRNG

Ещё один опасный сценарий связан с повторным использованием состояния генератора.

Если приложение:

  • сохраняет seed в localStorage;
  • восстанавливает состояние PRNG при перезагрузке;
  • или использует фиксированную инициализацию для ускорения старта,

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

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


Слабая энтропия в автоматизированных средах

Особенно уязвимыми являются среды без интерактивности:

  • серверные JavaScript-движки (Node.js при неправильной конфигурации SJCL);
  • тестовые среды и CI/CD пайплайны;
  • браузеры в режиме автоматизации (Selenium, Puppeteer);
  • kiosk-режимы и встроенные WebView.

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

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


Утечки энтропии через предсказуемые события

Некоторые реализации приложений ошибочно используют события, которые считаются «случайными», но на практике легко предсказуемы:

  • timestamp загрузки страницы;
  • размер окна браузера;
  • язык системы;
  • список установленных шрифтов;
  • сетевые задержки.

Если такие данные составляют значительную часть entropy pool, атакующий может реконструировать исходное состояние генератора.

Особенно опасно использование времени как основного источника энтропии. Даже при высокой точности таймстампа пространство поиска остаётся ограниченным и перебираемым.


Проблемы с накоплением энтропии в SJCL

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

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

В результате система может перейти в режим «degraded entropy», где PRNG продолжает работу, но без криптографической гарантии стойкости.


Влияние виртуализированных окружений

Современные браузеры и контейнеризированные среды могут существенно снижать качество энтропии:

  • виртуальные машины используют предсказуемые аппаратные тайминги;
  • контейнеры часто имеют ограниченный доступ к системным событиям;
  • sandbox-режимы блокируют часть DOM-событий;
  • headless-режимы лишены пользовательской активности.

SJCL в таких условиях теряет ключевой источник вариативности — человеческое взаимодействие.


Повторяемость генерации ключей

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

  • одинаковые симметричные ключи;
  • повторяющиеся IV (initialization vectors);
  • предсказуемые nonce в потоковых режимах шифрования.

Это разрушает даже сильные алгоритмы вроде AES, поскольку их стойкость напрямую зависит от уникальности параметров генерации.


Ошибки интеграции разработчиков

На практике уязвимости чаще всего возникают не в самой SJCL, а в её использовании:

  • ручная установка seed фиксированным значением для «отладки»;
  • отключение entropy collectors ради ускорения загрузки;
  • игнорирование событий mousemove, keydown, touchstart;
  • генерация ключей до инициализации сборщика энтропии;
  • отсутствие проверки готовности PRNG.

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


Атаки на слабую энтропию

При недостаточной случайности возможны следующие классы атак:

  • brute-force по пространству seed;
  • восстановление PRNG-состояния по частичным выходным данным;
  • предсказание будущих ключей;
  • replay атакующие сценарии при повторяемом seed;
  • корреляция ключей между сессиями.

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


Выводы по архитектурным рискам

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

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