何が起きたか・対象

Material for MkDocsの検索候補機能では、URLのqパラメータを検索欄へ入れ、候補表示の文字列へ連結してinnerHTMLへ渡していました。ブラウザが検索語を文字でなくHTMLの要素・属性として解析するため、攻撃者のJavaScriptが閲覧者のブラウザで動くDOMベースXSSになりました。識別子はCVE-2026-73295、GHSL-2026-151です。

攻撃者はタグやイベント属性を検索語に含むURLを作り、search.suggestが有効な脆弱版サイトの利用者へ開かせます。候補へ入力が届き、たとえば画像の読み込み失敗で動くonerror属性がHTMLへ入れば、追加のクリックがなくてもコードが実行され得ます。 攻撃者は検索語のURLを作るだけで、サーバーへファイルを置く権限は不要です。ページの検索処理がqを入力欄へ復元し、検索候補の結果を表示する経路で実行されます。

コードはドキュメントのページと同じオリジン(URLのスキーム・ホスト・ポートの組)で動きます。そのページが持つ認証トークンなどを読み、外部サーバーへ送れる構成なら攻撃者が取得できますが、別ホストの認証付きアプリまで同じ権限で読めるという意味ではありません。製品の欠陥と、個々のサイトに置いた秘密やAPIによる影響を分けて評価します。

報告・修正・公開の時系列

2026-07-16に報告されています。開発元アドバイザリの公表表示は07-17、研究側の時系列では07-19に修正公開と記録されています。この差は統合せず残します。研究記事の公開は10-22です。

正常ならどう動くはずだったか

検索候補では、URLから復元した検索語を画面に文字として出せば足ります。検索語に記号があっても、ページの要素や実行処理を作るHTMLとして解釈させる必要はありません。

技術的な原因

URLのqパラメータが検索入力へ入り、検索候補の表示処理がその語を結合してinnerHTMLへ代入していました。空白の置換は行っていても、タグやイベント属性を文字として扱う検査・出力にはなりません。ブラウザが検索語をHTML要素や属性としてページへ追加し、属性内のJavaScriptを実行できることがXSSの成立箇所です。

攻撃が成立する条件と流れ

search.suggestが有効な脆弱版サイトで、利用者がHTMLのタグやイベント属性を検索語に含めたリンクを開き、候補表示の処理へ値が届くことが条件です。ドキュメントをホストするサーバーへコードを置く権限は不要で、攻撃者が用意するのは、検索語を含むURLです。 qの復元だけでなく、その検索語を検索候補のwordsへ出す処理に到達する必要があります。候補表示までのUI操作の細かな差はここでは直接確認していないため、全ての設定でURLを開いた直後に必ず実行されるとは断定しません。

確認された事実と、想定される影響

コードはドキュメントサイトのオリジンで動きます。説明用に、サイトのJavaScriptがブラウザ内のlocalStorageへ認証トークンを保存しているなら、コードがその値を読み取れます。HttpOnlyで保護されていないCookieも、Cookieが見える範囲のコードから読まれるおそれがあります。その値を攻撃者のサーバーへ送信できれば、攻撃者はサイト内の保存情報を入手します。 localStorageは同じオリジンのJavaScriptから読めるため、そこで動く攻撃コードも保存値を参照できます。

API応答の例では、コードが同じオリジンのAPIへHTTPリクエストを送り、送信条件を満たすログイン用CookieをブラウザがそのリクエストのCookieヘッダーに付けます。APIが本人向けの情報を返し、コードがそれを外部へ送信できれば、攻撃者はその情報を入手するおそれがあります。ドキュメントサイトと認証付きアプリが別ホストなら、同じ条件で全応答を読めるわけではありません。 HttpOnlyはJavaScriptからCookieの値を直接読むことを防ぐ属性で、ブラウザが宛先・パス・Secureなどの送信条件に従ってAPI要求へ付けることは止めません。例はそのAPI宛てにログイン用Cookieが送られる構成を前提にしています。

偽画面の例では、コードが検索ページ内へ再ログインを装う入力欄を作り、利用者にパスワードを入力させます。入力値を読み外部へ送信できると、攻撃者はその値を入手します。検索候補の処理でコードが実行されること、利用者が入力すること、外部送信ができることが必要です。これらの可能性と、実際の窃取の観測は区別します。

実際の修正・対応方針

開発元は7.2.0以上9.7.7未満を影響範囲、9.7.7を修正版としています。更新できない場合はsearch.suggestを無効にする案内です。具体的な変更差分はここでは直接確認していません。

利用者・運用者が確認すること

使用版と検索候補の設定を確認し、修正済み版でサイトを再生成・配信します。同じオリジンに認証が必要な機能を置いている場合は、ドキュメント上のスクリプトが読み取れる情報や、実行できる操作の範囲も見直します。

開発者への教訓(教材としての考察)

検索語の保存や検索式の解析に問題がなくても、最後にinnerHTMLへ渡す処理で実行可能になる場合があります。URLを作れる人、検索入力へ値を移す処理、候補をHTMLへ変えるAPI、その後にコードが読める情報を順に確認します。

出典・確認範囲

  1. [1] Crafted search links can execute JavaScript on mkdocs-material sitesGitHub Security Lab / 確認日 2026-10-29
  2. [2] DOM XSS in search suggestions via query parameterMaterial for MkDocs / 確認日 2026-10-29
未確認事項・限界

資料間で公開・修正日の表示に差があります。差分の直接確認と実悪用の観測は未確認です。