
VaahCMSにおける安全でないSVGファイルアップロード処理を介した保存型XSS脆弱性の詳細な開示。悪用の流れ、影響を受けるエンドポイント、およびセキュリティ研究者向けの緩和策を含みます。
MediaController.php のファイルアップロードロジックと UserBase.php の storeAvatar() メソッドの相互作用において、格納型クロスサイトスクリプティング(XSS)の脆弱性が確認されました。これにより、低権限の登録ユーザーがJavaScriptを埋め込んだ悪意のあるSVGファイルをアップロードできるようになります。この脆弱性は、コンテンツやMIMEタイプの検証が行われる前にファイルストレージが実行され、悪意のあるファイルが予測可能で一般公開されたパスに残されることに起因します。
この脆弱性は MediaController.php 内の upload() メソッドから発生します。
*** $path = $request->file($input_file_name) ->storeAs($request->folder_path, $upload_file_name);**
これにより、攻撃者はディレクトリパスを指定でき、XSSを仕込んだSVGなどの悪意のあるファイルを public/ ディレクトリに直接配置し、ペイロードをWebブラウザから即座にアクセス可能にします。
悪用に成功すると、攻撃者は公開ストレージパス(/storage/media/YYYY/MM/<制御可能なファイル名>.svg)に書き込まれるファイルの内容とファイル名を制御できます。この公開されたSVGが後にユーザーのブラウザで ``、<object>、または細工されたリンクを介してレンダリングされると、埋め込まれたスクリプトが実行され、永続的なXSSが発生します。
POST /backend/vaah/manage/media/upload
/storage/media/YYYY/MM/<制御可能なファイル名>.svg に保存されます。{"success": false, "errors": ["Unable to decode input"]})を返した場合でも、ファイルは残り続けます。POC.svg 参照)を作成します。xss.svg)を制御します。/storage/media/2025/08/xss.svg にディスクに保存されます。
enshrined/svg-sanitize など)を使用する研究者: Thaw Phone Nyo
開示日: 2025/10/8