MapLibre GL JSに存在する深刻な脆弱性により、悪意のある地図帰属表示(attribution)コンテンツを通じて攻撃者がゼロクリックのクロスサイトスクリプティング攻撃を実行できる可能性があることが分かりました。
CVE-2026-85061およびGitHubセキュリティアドバイザリGHSA-jrc7-96c5-q579として追跡されているこの脆弱性は、maplibre-glバージョン6.4.0以前に影響します。MapLibre GL JSバージョン6.4.1で問題は修正されています。
この脆弱性は、コンテンツがレンダリングされる前に潜在的に危険なHTML属性を除去することを目的としたsrc/util/dom.ts内の関数DOM.sanitize()に存在していました。
しかし、このサニタイザーは要素のattributesコレクションから属性を削除しながら、同じコレクションを反復処理していました。elem.attributesはライブのNamedNodeMapであるため、一つの属性を削除すると、反復処理中に残りの要素の位置が変化してしまいます。
この挙動により、属性がスキップされる条件が生じます。サニタイザーが危険な属性を削除すると、直後にある属性のインデックスが一つ繰り下がります。
その後ループがカウンターをインクリメントするため、繰り下がった属性は評価も削除もされずにスキップされてしまいます。攻撃者は、危険な属性を連続して含むHTMLを送り込むことでこのロジックを悪用でき、サニタイズ後も悪意のあるイベントハンドラーを一つ無傷のまま残すことができます。
概念実証(PoC)のペイロードでは、open、onload、ontoggleといった属性を連続して配置した<details>要素を使用することが考えられます。
サニタイザーは最初の危険な属性を除去しても、次の属性をスキップしてしまう可能性があります。生き残ったイベントハンドラー属性がMapLibreの帰属表示コントロール(attribution-control)のレンダリング処理を通じてページに挿入されると、被害者がクリックしたりホバーしたりといった操作を一切行わなくても、JavaScriptが自動的に実行されてしまいます。
この攻撃のゼロクリックという性質は、影響を受けるアプリケーションのリスクを大幅に高めます。このアドバイザリでは、CVSS v3.1ベクターAV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:Nとともに、深刻度「Critical」が付与されています。
つまり、リモートから悪用可能で、攻撃の複雑さは低く、攻撃者側の権限は不要で、ユーザーの操作にも依存しません。悪用に成功すると、影響を受けたアプリケーションのブラウザコンテキスト内で機密性と完全性が損なわれる可能性があります。
HarelM氏によると、サードパーティから取得した地図スタイル、帰属表示文字列、ソースメタデータをレンダリングするアプリケーションは特にリスクにさらされているとのことです。
リスクシナリオとしては、外部でホストされたスタイルを読み込む地図ポータル、ユーザーがカスタムの地図帰属表示を設定できるプラットフォーム、信頼できないプロバイダーから地図メタデータを取得するアプリケーションなどが挙げられます。
こうした環境では、攻撃者が細工した帰属表示の値を注入し、脆弱なサニタイズ処理に到達させる可能性があります。この根本的な脆弱性はCWE-79「Webページ生成時の入力の不適切な無害化」、いわゆるクロスサイトスクリプティングに分類されます。
この脆弱性はサニタイズ用ユーティリティに存在していますが、実際の影響度は、攻撃者が制御するコンテンツが属性コントロールに到達し、最終的にinnerHTML経由で挿入され得るかどうかに左右されます。
MapLibreは、属性を処理する前に静的なスナップショットを作成する形でこの問題を修正しました。修正後のコードは、ライブのNamedNodeMapを直接反復処理する代わりにArray.from(elem.attributes)を使用しています。
これにより、削除操作中にインデックスの位置が変化することがなくなり、すべての属性が確実にチェックされるようになります。MapLibre GL JSを利用している組織は、直ちにバージョン6.4.1以降へアップグレードすることが推奨されます。
アップグレードが完了するまでの間、開発者はソースの帰属表示フィールドをMapLibreに渡す前に厳格にサニタイズ・検証すべきです。特に、スタイルやメタデータが信頼できない外部ソースに由来する場合は注意が必要です。
16,000以上の組織から得られる最新のインテリジェンスで、脅威の検知率を58%向上。TIフィードを統合し、貴社のSOCへ
翻訳元: https://cyberpress.org/critical-maplibre-gl-js-flaw/