SanitizeSVG(getDynamicIcon、認証なし)におけるSVG名前空間プレフィックスのバイパスによる、SiYuanのリフレクト型XSS脆弱性
プラットフォーム
go
コンポーネント
github.com/siyuan-note/siyuan/kernel
修正バージョン
0.0.0-20260330031106-f09953afc57a
### 概要 v3.6.0で導入された、認証なしの`/api/icon/getDynamicIcon`エンドポイントのXSSを修正するための`SanitizeSVG`関数は、`<x:script xmlns:x="http://www.w3.org/2000/svg">`のような名前空間プレフィックス付きの要素名を使用することでバイパスできます。Go HTML5パーサーは、要素のタグを`"script"`ではなく`"x:script"`として記録するため、タグチェックを通過します。SVGは`Content-Type: image/svg+xml`で、Content Security Policyなしで提供されます。ブラウザがレスポンスを直接開くと、XMLパーサーはプレフィックスをSVG名前空間に解決し、埋め込まれたスクリプトを実行します。 ### 詳細 `getDynamicIcon`ルートは認証なしで登録されます: ```go // kernel/server/serve.go ginServer.Handle("GET", "/api/icon/getDynamicIcon", getDynamicIcon) ``` タイプ8の場合、`content`クエリパラメータは、HTMLエンコードなしで`fmt.Sprintf`を使用してSVG `<text>`要素に直接挿入されます: ```go // kernel/api/icon.go:579-584 return fmt.Sprintf(` <svg id="dynamic_icon_type8" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"> <path d="..."/> <text x="50%%" y="55%%" ...>%s</text> </svg>`, ..., content) ``` `SanitizeSVG`は、SVGを `
修正方法
公式パッチはありません。回避策を確認するか、アップデートを監視してください。