Критична уязвимост от тип междоксусметен скриптинг (XSS) в широко използваната библиотека MapLibre GL JS би могла да изложи приложения и приблизително 2,7 милиона потребители на атаки без необходимост от взаимодействие (zero-click).

Проблемът в сигурността, проследяван като CVE-2026-85061 и GitHub Security Advisory GHSA-jrc7-96c5-q579, засяга maplibre-gl версии 6.4.0 и по-ранни.

MapLibre GL JS е библиотека за картографиране с отворен код на JavaScript, използвана от уебсайтове и уеб приложения за изчертаване на интерактивни карти. Уязвимостта се намира във функцията DOM.sanitize() на библиотеката, чието предназначение е да премахва ненадеждни HTML атрибути, преди съдържанието да бъде вмъкнато в страницата.

Изследователите установиха, че функцията за изчистване обработва атрибутите на даден елемент чрез динамичен браузърен обект NamedNodeMap. Докато функцията обхожда атрибутите, тя същевременно премахва опасните чрез elem.removeAttribute().

Zero-Click уязвимост в MapLibre

Това създава състояние на изместване на индекса: след като даден атрибут бъде премахнат, следващият атрибут се премества на неговото място, но цикълът продължава към следващия индекс. В резултат на това функцията за изчистване може да пропусне злонамерен атрибут, поставен непосредствено след друг ненадежден атрибут.

Атакуващ би могъл да се възползва от проблема, като предостави HTML, съдържащ последователни опасни атрибути. Бюлетинът за сигурност на GitHub предоставя пример с елемента details с атрибути като open, onload и ontoggle.

Функцията за изчистване може да премахне един злонамерен атрибут, но да не успее да провери или премахне съседния манипулатор на събития. Когато по-късно MapLibre вмъкне останалия зловреден код в innerHTML чрез своя контрол за авторски права (attribution control), манипулаторът на събития може да се изпълни автоматично.

Атаката не изисква потребителско взаимодействие, автентификация или специални привилегии. Това я прави изключително сериозна за услуги, които зареждат стилове за карти, текстове за авторски права или други данни за картографиране от външни източници.

Приложения, които позволяват на потребителите да въвеждат персонализирани атрибуции, също могат да бъдат уязвими, ако предават тези стойности към MapLibre без независима проверка и изчистване.

Успешното използване на уязвимостта може да позволи на атакуващите да изпълнят JavaScript в контекста на сигурността на браузъра на жертвата. В зависимост от засегнатото приложение това би могло да даде възможност за кражба на сесии, неоторизирани действия, достъп до чувствителни данни, пренасочване към фишинг страници или манипулиране на видимото съдържание на картата.

Проблемът получи критична оценка за сериозност според CVSS v3.1. Неговият вектор е CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N, което отразява възможност за експлоатация през мрежата, ниска сложност, липса на изисквани привилегии и липса на необходимост от потребителско взаимодействие.

Бюлетинът класифицира уязвимостта като CWE-79 – неудовлетворително неутрализиране на въведените данни при генериране на уеб страница, обикновено известно като междоксусметен скриптинг (cross-site scripting).

Разработчиците на MapLibre отстраниха уязвимостта в maplibre-gl версия 6.4.1. Корекцията за сигурност променя поведението на функцията за изчистване, като първо създава статично копие на атрибутите на елемента с Array. from (elem. attributes). from(elem.attributes). След това кодът може безопасно да проверява и премахва атрибути, без да променя колекцията, която обхожда в момента.

Организациите, използващи MapLibre GL JS, трябва незабавно да актуализират до версия 6.4.1 или най-новата налична версия. Екипите по сигурност трябва също така да идентифицират приложения, които обработват ненадеждни метаданни за стилове на карти, низове за авторски права от трети страни или контролирани от потребителя полета за персонализирана атрибуция.

Като временна мярка за ограничаване на риска разработчиците трябва да изчистват входните данни, свързани с атрибуцията, преди да ги предоставят на MapLibre. Инсталирането на актуализацията обаче остава най-надеждното решение, тъй като уязвимата логика е част от вътрешния процес за DOM изчистване на библиотеката.