
CVE-2026-9811 is a Stored Cross-Site Scripting (Stored XSS) vulnerability affecting Mautic 7 (versions 7.0.0 through 7.1.1).
CVE-2026-9811は、Mautic 7(バージョン7.0.0から7.1.1まで)に影響を与える格納型クロスサイトスクリプティング(Stored XSS)の脆弱性です。この脆弱性はProject Selectorコンポーネントに存在し、AJAXリクエストで返されたプロジェクト名が、適切な出力エンコーディングやサニタイズなしにページに挿入されます。プロジェクトを作成する権限を持つ認証済みユーザーは、プロジェクト名に悪意のあるJavaScriptペイロードを格納できます。その後、別の管理者がプロジェクトセレクタを含むエンティティエディタを開くと、悪意のあるスクリプトがそのブラウザで実行されます。
プロパティ 値 製品 Mautic 影響を受けるバージョン 7.0.0 – 7.1.1 修正バージョン 7.1.2 コンポーネント Project Selector 脆弱性の種類 格納型クロスサイトスクリプティング(XSS)
このアプリケーションは、認証済みユーザーが指定したプロジェクト名を保存し、後でAJAXエンドポイントを通じて取得します。プロジェクトセレクタをレンダリングする際、アプリケーションはこれらの値をエスケープやサニタイズを行わずに、HTMLのoption要素としてDOMに直接挿入します。
概念的には次のようになります:
ユーザーがプロジェクトを作成
│
▼
プロジェクト名がデータベースに保存される
│
▼
AJAXがプロジェクト名を返す
│
▼
サニタイズなしでDOMに挿入される
│
▼
ブラウザが埋め込まれたJavaScriptを実行する
アプリケーションが保存済みデータを信頼しているため、別の特権ユーザーが脆弱なページを読み込むたびに、悪意のあるJavaScriptが実行されます。
攻撃者
│
▼
悪意のあるJavaScriptペイロードを名前に含むプロジェクトを作成する
│
▼
ペイロードがデータベースに保存される
│
▼
管理者がエンティティエディタを開く
│
▼
AJAXリクエストがプロジェクト名を取得する
│
▼
アプリケーションがプロジェクト名をエンコーディングなしでDOMに挿入する
│
▼
ブラウザが悪意のあるスクリプトを実行する
│
▼
攻撃者が管理者のセッション内で操作を実行する
プロジェクト作成権限を持つ攻撃者は、名前欄に悪意のあるJavaScriptペイロードを含むプロジェクトを作成します。
その後、管理者がProject Selectorを含む別のエンティティを編集します。セレクタはAJAX経由でプロジェクト名を読み込み、それらをページに直接挿入します。プロジェクト名がサニタイズされていないため、ブラウザは管理者の権限で埋め込まれたスクリプトを実行します。
Mauticに次のようなフォームがあるとします:
POST /projects/create HTTP/1.1
Content-Type: application/x-www-form-urlencoded
projectName=Marketing Campaign
description=Email Campaign
プロジェクトは次のように保存されます:
Marketing Campaign
ステップ2: 攻撃者がプロジェクトを作成する
通常の名前の代わりに、攻撃者は無害なJavaScriptイベントを含むHTMLを入力します:
POST /projects/create HTTP/1.1
Content-Type: application/x-www-form-urlencoded
projectName=<img src="https://raw.githubusercontent.com/aj2108/cve-2026-9811/HEAD/x" onerror="console.log('XSS Demo')">
description=Test
データベースには、その文字列がそのまま保存されます。
ステップ3: AJAXが保存された値を返す
その後、管理者がプロジェクトを読み込むページを開きます。
AJAXレスポンス:
{
"id": 7,
"projectName": ""
}
ステップ4: 脆弱なJavaScript
アプリケーションが次のことを行うとします:
const project = response.projectName;
document.getElementById("projects").innerHTML +=
`<option>${project}</option>`;
ブラウザは次のように解釈します:
<option>
<img src="https://raw.githubusercontent.com/aj2108/cve-2026-9811/HEAD/x" onerror="console.log('XSS Demo')">
</option>
アプリケーションが文字列をテキストではなくHTMLとして挿入したため、ブラウザはこれを実際の要素として解析します。画像の読み込みに失敗するため(src="x")、onerrorハンドラが実行されます。
攻撃に成功すると、攻撃者は以下を行う可能性があります:
| メトリクス | スコア |
|---|---|
| CVSS v3.1 (CNA) | 5.4(中) |
NVDはこのCVEに関する独自のCVSS評価をまだ公開していません。
注記: ベンダーは正確な脆弱なソースコードを公開していません。以下の例は脆弱性のパターンのみを示しています。
// Data returned from AJAX
const project = response.projectName;
// Unsafe: inserted directly into the DOM
document.getElementById("projectSelector").innerHTML +=
`<option>${project}</option>`;
プロジェクト名はユーザー入力に由来しますが、HTMLエンコーディングなしでページに挿入されます。保存された値にHTMLやJavaScriptが含まれている場合、ブラウザはそれをプレーンテキストではなく実行可能なコンテンツとして解釈します。
const option = document.createElement("option");
// Safe: assign as text, not HTML
option.textContent = response.projectName;
document.getElementById("projectSelector").appendChild(option);
または、HTML出力が避けられない場合は、挿入前に適切な出力エンコーディングを確保してください。
textContent(または同等の安全なAPI)を使用することで、特殊文字が実行可能なHTMLやJavaScriptではなくプレーンテキストとして扱われるようになります。悪意のあるプロジェクト名がデータベースに保存されていても、実行されるのではなく文字通り表示されます。