事象
#1115 の対応で Javadoc 由来 Markdown は DOMPurify でサニタイズされるようになったが、Javadoc の ```mermaid コードブロック(renderMarkdownDiagrams)は解析対象コード由来のソースがそのまま `securityLevel: "loose"` の mermaid で描画される。loose では mermaid の `sanitizeText` がスキップされるため、ラベルに HTML を埋め込む形の XSS 経路が残っている。
strict に戻せない理由(#1115 での検証結果)
mermaid 11.12.0 の実装では、click の関数コールバック(click <id> <handlerName> 形式)は securityLevel === "loose" でのみ有効(minified コード中の securityLevel!=="loose"||...return)。package図の階層図・探索図のノードクリックがこれに依存しているため、全体を strict/antiscript にするとナビゲーションが壊れる。
該当定数: jig-core/src/main/resources/templates/assets/jig-mermaid.js の MERMAID_SECURITY_LEVEL
対応案
- click の関数コールバックをやめ、描画後の SVG に addEventListener でバインドする方式へ移行し、securityLevel を antiscript(HTML 可・script 除去・click 有効な href は維持)または strict に下げる
- もしくは Javadoc 由来ダイアグラムのみ描画設定を分離する(mermaid の initialize がグローバルなため、遅延レンダリングキューとの競合に注意)
あわせて検討(#1115 の修正案より)
CDN 依存(dompurify / marked / mermaid)のアセット同梱。オフライン環境対応と供給網リスク低減になる。
🤖 この issue は Claude Code による #1115 対応のフォローアップとして作成されました。
事象
#1115 の対応で Javadoc 由来 Markdown は DOMPurify でサニタイズされるようになったが、Javadoc の ```mermaid コードブロック(
renderMarkdownDiagrams)は解析対象コード由来のソースがそのまま `securityLevel: "loose"` の mermaid で描画される。loose では mermaid の `sanitizeText` がスキップされるため、ラベルに HTML を埋め込む形の XSS 経路が残っている。strict に戻せない理由(#1115 での検証結果)
mermaid 11.12.0 の実装では、click の関数コールバック(
click <id> <handlerName>形式)はsecurityLevel === "loose"でのみ有効(minified コード中のsecurityLevel!=="loose"||...return)。package図の階層図・探索図のノードクリックがこれに依存しているため、全体を strict/antiscript にするとナビゲーションが壊れる。該当定数:
jig-core/src/main/resources/templates/assets/jig-mermaid.jsのMERMAID_SECURITY_LEVEL対応案
あわせて検討(#1115 の修正案より)
CDN 依存(dompurify / marked / mermaid)のアセット同梱。オフライン環境対応と供給網リスク低減になる。
🤖 この issue は Claude Code による #1115 対応のフォローアップとして作成されました。