Безопасность

Deck.gl работает поверх WebGL и использует GPU-ускоренный рендеринг для визуализации больших наборов данных. Эта архитектура создаёт специфический класс рисков, отличающийся от классических веб-приложений.

Основная поверхность атаки формируется на пересечении трёх слоёв:

  • JavaScript-логика приложения
  • WebGL-контекст и шейдеры
  • Внешние источники данных (тайлы, GeoJSON, CSV, бинарные форматы)

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


Инъекции через данные и визуальные слои

Deck.gl активно работает с геоданными, которые могут поступать из недоверенных источников: API, пользовательских загрузок, внешних файлов.

Опасные сценарии:

  • GeoJSON с вредоносными свойствами, используемыми в кастомных рендерах
  • Подмена URL текстур в слоях типа BitmapLayer
  • Инъекции в кастомные шейдеры (через GLSL строки)
  • Манипуляции свойствами объектов, влияющими на отрисовку

Особое внимание требуется при использовании кастомных getColor, getFilterValue, getPosition функций, если они строят логику на неподтверждённых данных.


Безопасность шейдеров WebGL

Shader-инъекции — один из наиболее недооценённых рисков.

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

  • внедрение некорректных GLSL-конструкций
  • перегрузка GPU через бесконечные циклы
  • попытки чтения неинициализированной памяти GPU
  • создание условий для DoS на уровне видеокарты

Проблема усиливается тем, что GLSL не имеет встроенной песочницы уровня JavaScript.


Работа с внешними тайлами и сетевыми источниками

Многие приложения на Deck.gl используют тайловые серверы для картографических данных. Часто это интеграция с экосистемой, связанной с платформами наподобие Mapbox.

Опасности:

  • подмена tile-server endpoint
  • DNS hijacking
  • загрузка изображений с вредоносных доменов
  • утечка внутренних параметров через URL шаблоны

Особенно критично, когда URL формируется динамически:

getTileData: ({x, y, z}) => 
  `https://example.com/tiles/${z}/${x}/${y}.pbf`

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


Cross-Origin и текстурная безопасность

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

Риски:

  • использование изображений без CORS-заголовков
  • отрисовка чувствительных данных в canvas с последующим экспортом (toDataURL)
  • атаки через “tainted canvas”
  • утечка пиксельной информации при смешении слоёв

Особенно важно учитывать поведение ImageBitmap и кеширование текстур в GPU.


Безопасность loaders.gl и парсинга данных

Deck.gl часто используется вместе с loaders.gl для загрузки и декодирования форматов (CSV, JSON, LAS, 3D Tiles).

Уязвимые места:

  • перерасход памяти при обработке больших файлов
  • zip-bomb подобные структуры в архивированных данных
  • некорректные бинарные буферы
  • неожиданные типы данных, приводящие к аварийному поведению парсера

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


Контроль исполнения пользовательского кода

Некоторые слои Deck.gl позволяют задавать функции, которые выполняются на этапе рендеринга:

  • getPosition
  • getColor
  • getElevation
  • onHover, onClick

Если приложение позволяет пользователю влиять на эти функции (например, через конфигурацию), появляется риск выполнения произвольного JavaScript-кода.

Особенно опасны случаи, когда конфигурация хранится в базе данных и рендерится без санитизации.


CSP и изоляция контекста исполнения

Content Security Policy остаётся одним из ключевых механизмов защиты приложений с Deck.gl.

Рекомендуемые ограничения:

  • запрет inline-scripts
  • ограничение connect-src только доверенными API
  • блокировка загрузки шейдеров из внешних источников
  • запрет unsafe-eval, если используется динамическая генерация функций

Однако CSP не защищает GPU-уровень, поэтому должна рассматриваться как слой, а не как полное решение.


Безопасность при интеграции с картографическими платформами

Deck.gl часто используется как слой визуализации поверх картографических движков.

В экосистеме, связанной с платформами вроде Uber, важную роль играет разделение ответственности:

  • карта отвечает за базовый рендеринг
  • deck.gl — за аналитические слои и визуализацию
  • данные поступают через API-слой

Риски возникают при нарушении этого разделения:

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

Утечки через picking и интерактивность

Deck.gl поддерживает механизм picking — определение объектов под курсором.

Потенциальные проблемы:

  • раскрытие скрытых атрибутов объектов через hover-события
  • утечка структур данных через tooltip
  • доступ к индексам или внутренним ID, не предназначенным для клиента

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


Управление памятью GPU и устойчивость

WebGL-контекст ограничен по памяти, и Deck.gl активно использует буферы GPU.

Уязвимости:

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

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


Изоляция worker-процессов

Deck.gl и связанные библиотеки могут использовать Web Workers для парсинга и подготовки данных.

Риски:

  • передача в worker неподконтрольных объектов (structured cloning issues)
  • перегрузка потоков CPU через массивные вычисления
  • отсутствие ограничения на размер сообщений

Worker-среда снижает риск блокировки UI, но не устраняет возможность ресурсных атак.


Контроль зависимостей и supply chain

Экосистема Deck.gl включает множество зависимостей: рендеринг, парсеры, утилиты.

Риски цепочки поставок:

  • компрометация npm-пакетов
  • подмена зависимостей через typosquatting
  • внедрение вредоносного кода в loader-модули

Особое внимание требуется к версиям luma.gl, loaders.gl и связанных пакетов, так как они напрямую работают с низкоуровневыми API WebGL.


Защита через архитектурное разделение

Наиболее устойчивые системы строятся на принципах:

  • разделение слоя данных и слоя визуализации
  • предварительная валидация геометрии и атрибутов
  • минимизация динамической генерации шейдеров
  • жёсткое ограничение источников URL и тайлов
  • изоляция пользовательских данных от GPU-логики

Без этих ограничений Deck.gl превращается из визуализационного инструмента в потенциальный вектор атак на уровне браузера и графического процессора.