Уязвимости, специфичные для браузерного окружения

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

Проблема возникает в современных условиях:

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

Если SJCL используется до накопления достаточной энтропии, состояние PRNG становится частично предсказуемым, что приводит к:

  • слабым ключам симметричного шифрования
  • повторяемым nonce/IV
  • деградации HMAC-защиты

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

Современный браузерный API window.crypto.getRandomValues() решает эту проблему, но SJCL может быть настроен на fallback-режим, который значительно слабее.


Разрыв модели доверия между JavaScript и средой выполнения

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

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

  • перезапись глобальных функций (Math.random, Array, Uint32Array)
  • monkey patching криптографических функций SJCL
  • подмена JSON.stringify для утечки ключей
  • вмешательство расширений браузера

Даже если сама SJCL реализована корректно, её окружение может быть изменено до или после загрузки библиотеки.


XSS как критическая точка компрометации ключей

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

При использовании SJCL типичный сценарий выглядит так:

  • ключ шифрования хранится в памяти JavaScript
  • данные расшифровываются на клиенте
  • результат используется в DOM

При наличии XSS атакующий получает:

  • доступ к plaintext до шифрования
  • доступ к ciphertext и ключам
  • возможность перехвата вызовов SJCL API
  • внедрение собственного криптографического слоя поверх оригинального

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


Утечки через DOM и состояние страницы

В браузере данные часто проходят через DOM-слой, что создаёт дополнительные поверхности атаки:

  • временное отображение расшифрованных данных
  • хранение секретов в input-полях
  • автозаполнение форм
  • кэширование значений в React/Vue состояниях

SJCL не контролирует, как приложение использует результат расшифровки. В результате типичная ошибка выглядит так:

  • данные расшифрованы
  • помещены в state компонента
  • попали в debug tools или логирование

Даже кратковременное присутствие секретов в памяти страницы увеличивает риск их извлечения через DevTools или вредоносные скрипты.


Уязвимости, связанные с localStorage и sessionStorage

SJCL часто используется для шифрования данных перед сохранением в localStorage. Однако сама модель хранения в браузере создаёт дополнительные угрозы:

  • данные доступны любому скрипту на том же origin
  • расширения браузера могут читать storage
  • XSS мгновенно раскрывает всё содержимое

Ключевая ошибка архитектуры:

шифрование на клиенте не защищает от атак в рамках того же origin

Если ключ хранится рядом с зашифрованными данными (даже частично), устойчивость системы падает до нуля.


Проблемы с изоляцией iframe и postMessage

В сложных приложениях SJCL может использоваться в нескольких iframe, которые обмениваются данными через postMessage.

Типовые уязвимости:

  • отсутствие проверки origin
  • доверие любым сообщениям
  • пересылка ключей между фреймами
  • перехват сообщений через внедрённый скрипт

Если атакующий получает доступ к одному iframe, он может:

  • перехватывать сообщения между контекстами
  • внедрять поддельные зашифрованные payload’ы
  • заставлять другой контекст расшифровывать вредоносные данные

Side-channel утечки через производительность JavaScript

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

  • время выполнения операций шифрования
  • различия в обработке больших блоков данных
  • GC-паузы при обработке ключей

SJCL, как чисто JS-реализация, работает заметно медленнее WebCrypto, что увеличивает поверхность тайминговых атак в локальных сценариях.

Особенно это проявляется при:

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

Уязвимости через CDN и цепочку поставки

SJCL часто подключается как внешняя библиотека через CDN или сборочные системы.

Риски:

  • подмена скрипта на CDN (если нет SRI)
  • компрометация npm-пакета
  • внедрение модифицированной версии SJCL
  • незаметное добавление логирования ключей

В браузере любой изменённый файл становится частью доверенной среды выполнения, что делает supply chain одной из самых критичных угроз.


Отсутствие аппаратной изоляции ключей

В отличие от WebCrypto API, SJCL полностью работает в JavaScript и не использует аппаратные хранилища (TPM, Secure Enclave).

Это приводит к следующим последствиям:

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

Даже кратковременный доступ к DevTools даёт атакующему возможность восстановить состояние криптосистемы.


Риски утечки через логирование и диагностику

Браузерные приложения часто включают:

  • console.log в development-сборках
  • remote debugging
  • аналитические SDK

Если SJCL используется без строгой политики логирования, возможны:

  • запись plaintext до шифрования
  • логирование ключей при ошибках
  • сохранение IV и salt в телеметрии

В браузере эти данные часто уходят в сторонние сервисы без контроля приложения.


Проблемы совместимости с WebCrypto и гибридные ошибки

Распространённая архитектура — использование SJCL как fallback при отсутствии WebCrypto.

Ошибки возникают при:

  • несогласованности алгоритмов
  • различиях в режиме padding
  • несовместимых форматах ключей
  • смешивании энкодинга (UTF-8 vs binary arrays)

Это приводит к состояниям, где:

  • часть данных шифруется SJCL
  • часть WebCrypto
  • при миграции возникает неправильная дешифрация

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


Уязвимости через расширения браузера

Расширения имеют расширенные права доступа к странице:

  • чтение DOM
  • перехват network requests
  • доступ к JS контексту

SJCL в таком окружении полностью прозрачен:

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

Это делает модель доверия полностью зависящей от установленных расширений пользователя.


Проблемы сериализации и неявного раскрытия данных

JavaScript-объекты, содержащие криптографические данные SJCL, часто проходят через:

  • JSON.stringify
  • structured cloning
  • state management (Redux, MobX)

Ошибки возникают, когда:

  • в объект случайно попадает ключ или seed
  • сериализуются промежуточные крипто-структуры
  • данные кешируются в devtools state snapshots

Даже если SJCL корректно защищает данные на уровне алгоритма, ошибка сериализации приводит к их утечке вне криптографического контекста.