Библиотека MapLibre GL JS отвечает за интерактивные карты во множестве веб-приложений. Её используют логистические сервисы, аналитические панели, туристические порталы и сайты государственных органов. Библиотека распространяется с открытым исходным кодом. Разработчики подключают её через менеджер пакетов. В библиотеке обнаружили уязвимость межсайтового скриптинга, то есть внедрения чужого сценария в страницу. Проблема получила идентификатор CVE-2026-85061. Её описали в бюллетене GHSA-jrc7-96c5-q579. Ошибка затрагивает версии 6.4.0 и все более ранние. Исправление вошло в версию 6.4.1. Чужой код запускается в браузере посетителя без единого действия с его стороны. В первую очередь рискуют сайты, которые выводят на карте подписи об источниках данных. Если такие подписи приходят из внешнего или пользовательского источника, посетители сайта подвергаются риску.
Уязвимость CVE-2026-85061
Механизм ошибки связан с функцией очистки разметки внутри библиотеки. Перед вставкой в страницу она перебирает атрибуты фрагмента и удаляет те, что способны исполнить код. Однако список атрибутов в браузере остаётся живым. Любое удаление мгновенно меняет его состав. После удаления одного атрибута соседний сдвигается на освободившееся место. Перебор при этом перескакивает через него. В итоге очередной опасный атрибут остаётся нетронутым. Злоумышленнику достаточно передать разметку, где подряд стоят несколько исполняемых атрибутов. Очистка снимает первый из них, а второй сохраняется. Затем библиотека вставляет оставшуюся разметку в блок подписей на карте. Браузер исполняет чужой код. Такую ошибку легко пропустить при проверке. Очистка выглядит рабочей, ведь первый опасный атрибут действительно исчезает. Отказ проявляется только на строках, где несколько таких атрибутов стоят рядом.
Участие пользователя для атаки не требуется. Обычно межсайтовый скриптинг подразумевает переход по ссылке или нажатие кнопки. Здесь достаточно того, что страница вывела подготовленную строку подписи. Поэтому класс таких атак называют атаками без клика. Риск выше у тех, кто берёт подписи у сторонних поставщиков стилей карты. В зоне риска и приложения, где подпись формирует сам пользователь. Строка подписи принимает произвольный текст. Это делает её удобной для передачи вредоносной разметки. Попавший на страницу сценарий может читать её данные, менять внешний вид интерфейса и действовать от имени посетителя. Границы этих возможностей задают настройки браузера и логика самого приложения. По шкале CVSS 3.1 уязвимость оценили как критическую. Вектор указывает на сетевой способ эксплуатации, низкую сложность и отсутствие нужных привилегий. Влияние на конфиденциальность и целостность признано высоким, на доступность отсутствующим. Отдельно отмечена смена области действия. Это означает, что последствия могут выйти за пределы самого компонента библиотеки. Публичных сообщений о реальных атаках с использованием этой ошибки в описании нет. При этом порог входа остаётся низким. Учётная запись, особые права или редкие условия атакующему не нужны.
Подписи об источниках данных обычно обязательны по лицензиям картографических материалов. Их строки задают в настройках стиля карты. Настройки нередко лежат на внешнем сервере или приходят от третьей стороны. Поэтому злоумышленнику не обязательно атаковать сам сайт. Достаточно повлиять на содержимое стиля или на поле ввода, которое попадает в подпись. Очистка разметки пропускает часть опасных атрибутов. Подготовленная строка проходит дальше и исполняется. Со стороны сервера такую попытку заметить трудно.
Исправление меняет порядок работы очистки. Теперь она сначала делает неподвижный снимок списка атрибутов, а уже потом его перебирает. Изменения в исходном списке больше не влияют на обход. Всем, кто использует библиотеку, стоит перейти на версию 6.4.1 или более свежую. После обновления нужно пересобрать веб-приложение. Отдельно стоит убедиться, что в готовом наборе файлов не осталось прежней версии зависимости. Состав сборки проверяют по дереву зависимостей. В проектах на Node.js для этого подходит команда npm ls maplibre-gl. Проверить наличие устаревшей копии стоит и в сборочных артефактах, и в кеше промежуточного сервера. Полезно обновить кеш на стороне сервера и у поставщика доставки контента. Если обновление откладывается, подписи источников нужно очищать до передачи в библиотеку. Также стоит проверить конфигурации карт, поставщиков стилей и все места, куда попадает ввод пользователя.
Обходной путь не заменяет обновление. Защита от межсайтового скриптинга строится из нескольких слоёв. Сюда входят экранирование вывода и политика безопасности контента, то есть набор правил, ограничивающих источники выполняемых сценариев. Политику настраивают отдельно для страниц с картами. Она ограничивает домены, с которых браузеру разрешено загружать и исполнять сценарии. Однако здесь нужна аккуратность: слишком строгие правила ломают работу карт. Такие меры снижают ущерб, но не устраняют ошибку в коде.
Ошибки в средствах очистки разметки относятся к распространённому классу. Причина почти всегда одна: неверная работа с изменяемыми структурами данных. Живые коллекции, изменяемые словари, параллельная правка списков приводят к пропуску элементов при переборе. MapLibre GL JS используется во многих картографических сервисах. Поэтому единичный промах в одном цикле затрагивает сразу множество сайтов. Обновление до версии 6.4.1 закрывает проблему. Однако порядок работы с внешними подписями стоит пересмотреть и тем, кто уже обновился. Наборы зависимостей разумно пересматривать регулярно, а не только после громких публикаций.
Ссылки