何が起きたか・対象
Orchard CMSの未リリース開発版で、攻撃者がURLの検索パラメータなどに入れたHTMLを、閲覧者のブラウザで実行させるXSSの欠陥がありました。識別子はGHSL-2026-072です。
管理者がリクエストの値を表示するLiquidテンプレートを使う構成が対象です。値を出すStringValuesValue.WriteToAsyncがHTMLエンコーダーを使わず、文字列を応答へ直接書いていました。攻撃者がタグやJavaScriptを動かすイベント属性を含むURLを被害者に開かせると、その値が応答のHTML構造になり、ブラウザでコードが動くおそれがありました。公開リリースへ入る前に修正されています。 例えば画像の読込失敗時にJavaScriptを動かすonerror属性が応答のimg要素になると、読込失敗をきっかけに実行されます。攻撃者の文字列はOrchardが返したページの一部になるので、そのページ内の情報を読める権限で動きます。
報告・修正・公開の時系列
2026-03-31に報告、04-01にリリース前の開発版で修正されました。研究公開は09-21です。検証コミットはc2cdcd19d5b68a082568c587ec5edf35c21f6695で、安定版の利用者全体に起こる問題とは扱いません。
正常ならどう動くはずだったか
Liquidテンプレートで検索語などを出す場合、HTMLとして意味を持つ記号は文字として表示する必要があります。Fluidエンジンは既定でそのためのエンコードを行います。値を包む独自の型でも、同じようにエンコードする必要があります。 例えば検索語が<b>なら、応答には<b>と書き、ブラウザにはタグを作らず文字の<b>を表示させます。これがHTMLエンコードによって、入力をHTML構造にしないという意味です。
HTTPのQuery・Headers・Formの値をStringValuesValueへ包み、Liquidテンプレートがその値の表示を指定すると、Fluidは独自型の出力メソッドを呼びます。このメソッドへエンコーダーも渡すため、型の実装がそれを使って文字列を出す必要があります。標準処理が有効でも、独自型がその出力処理を省略すると保護は失われます。
技術的な原因
HTTPリクエストのQuery、Headers、Formの値は、複数の文字列を扱うStringValuesValueに包まれます。そのWriteToAsyncが、受け取ったencoderを使わずTextWriterへ文字列を直接書いていたため、テンプレートから値を出すと標準のHTMLエンコードを通りませんでした。利用者が指定した文字列が、そのままレスポンスのHTML構造へ入る箇所が不備です。
攻撃が成立する条件と流れ
管理者がRequest.Queryなどを表示するLiquidテンプレートを使っている開発版が対象です。攻撃者はタグやイベント属性をURLのパラメータに含め、そのURLを被害者へ開かせます。サーバーが問題の型を通して値を応答へ出し、被害者のブラウザがその値をHTMLとして解釈してコードを動かすとXSSになります。影響する値の型とテンプレートの使用が条件です。 そのコードがページ内の個人情報を読み、外部へ送れる構成なら、攻撃者は閲覧者の情報を取得するおそれがあります。
確認された事実と、想定される影響
応答に混ざったコードはOrchardのページの一部として動きます。同じオリジンとはURLのスキーム・ホスト・ポートの組が同じ範囲で、そのページ内の表示情報や同じオリジンのAPIを扱えることが、次の説明例の前提です。全ての別サイトの情報を読めるという意味ではありません。
情報取得の説明用の例では、実行されたコードが被害者のページ内の個人情報を読み、攻撃者のサーバーへHTTPリクエストで送ります。その通信が成立すれば、攻撃者は被害者が見ていた情報を入手します。
API操作の説明用に、登録メールアドレスを変更する場合を考えます。実行されたコードが、攻撃者のアドレスを同じオリジンの設定変更APIへ送ります。ブラウザは送信条件に合う被害者のログイン用Cookieを、そのリクエストのCookieヘッダーへ付けます。APIが変更を許可して保存し、その宛先へ通知を送る構成なら、攻撃者はアカウント通知を受け取るおそれがあります。追加の認可や再認証で拒否される場合には成立しません。未リリース開発版の欠陥であり、安定版全体の被害や実窃取が確認された報告ではありません。
実際の修正・対応方針
修正コミットはccfc6e9351385f732f380e7f34ede833a263c1fbです。同期・非同期の出力をWriteEncodedToへ集約し、encoder.Encodeで各文字列を出すよう変更しています。Query・Headers・Formの回帰テストも加わり、外部値をエンコードせずHTMLへ出力する処理を修正しています。
利用者・運用者が確認すること
該当する開発コミットを使っている場合は修正後へ更新します。独自の値ラッパーやテンプレート拡張も、標準のエンコーダーを省略していないか確認します。
開発者への教訓(教材としての考察)
フレームワークの標準エスケープが安全でも、独自型の出力実装で無効化できます。実際に書き出す処理まで追い、渡されたHTMLエンコーダーが使われるか確認することが必要です。
出典・確認範囲
- [1] HTML encoding bypass enables cross-site scripting in Orchard CMSGitHub Security Lab / 確認日 2026-10-29
- [2] Fix Liquid StringValues HTML encoding (#19101)Orchard Core / 確認日 2026-10-29
未リリース開発版の問題です。実悪用や実際の被害件数は参照資料では確認できません。