
| 項目 | 詳細 |
|---|
| CVE ID | CVE-2026-27621 |
| 深刻度 | MEDIUM |
| アドバイザリ | アドバイザリを表示 |
| 発見者 | Lukasz Rybak |
TypiCMS のファイルアップロードモジュールには、格納型クロスサイトスクリプティング (XSS) の脆弱性が存在します。このアプリケーションは、ファイルアップロード権限を持つユーザーに SVG ファイルのアップロードを許可します。MIME タイプの検証は行われますが、SVG ファイルのコンテンツはサニタイズされません。攻撃者は、悪意のある JavaScript コードを含む特別に細工された SVG ファイルをアップロードできます。別のユーザー (管理者など) がアプリケーションを通じてこのファイルを表示またはアクセスすると、スクリプトがそのユーザーのブラウザで実行され、そのユーザーのセッションが侵害されます。
この問題は、SVG 解析ロジックのバグによって悪化します。アップロードされた SVG に viewBox 属性が含まれていない場合、500 エラーが発生する可能性があります。ただし、攻撃者は悪意のあるペイロードに有効な viewBox 属性を簡単に含めることができるため、これは XSS の脆弱性を緩和するものではありません。
TypiCMS\Modules\Core\Http\Requests\FileFormRequest.php および TypiCMS\Modules\Core\Services\FileUploader.phpこの脆弱性は、主に 2 つの点に起因します。
FileFormRequest は、アップロードで許可される MIME タイプとして svg を明示的にホワイトリストに登録しています。FileUploader サービスは、<script> タグや on* イベントハンドラなどの悪意のある要素を削除するためにコンテンツを解析およびサニタイズすることなく、SVG ファイルをサーバーに保存します。デフォルトのファイルシステムディスクが public に設定されている場合、アップロードされた SVG ファイルは公開アクセス可能なディレクトリに保存されるため、直接 URL でファイルにアクセスして XSS ペイロードをトリガーすることが簡単になります。
悪意のある SVG ファイルを作成する:
malicious.svg という名前のファイルを以下の内容で作成します。viewBox 属性は、アプリケーションの解析バグを回避するために含まれています。
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<script>
// A simple PoC to demonstrate the vulnerability
alert('XSS in TypiCMS! Your session cookie is: ' + document.cookie);
</script>
<text x="10" y="50">If you see this, the script has run.</text>
</svg>
悪意のあるファイルをアップロードする:
/admin/files) に移動します。malicious.svg ファイルをアップロードします。アプリケーションはファイルを受け入れ、保存します。http://<your-site>/storage/files/malicious.svg という形式です。この脆弱性が悪用されると、攻撃者は被害者のブラウザのコンテキストで任意の JavaScript を実行できます。セッション Cookie での HttpOnly フラグの使用により document.cookie を介したセッション ID の直接的な窃取は防がれますが、攻撃者は被害者に代わって操作を実行することで、被害者のアカウントを完全に侵害できます。
影響には以下が含まれます:
操作偽造によるアカウント乗っ取り: 攻撃者のスクリプトは、被害者のブラウザからアプリケーションの API に対して認証済みリクエストを送信できます。これにより、攻撃者は被害者が許可されている任意の操作を実行できます。例:
機密情報の開示: スクリプトは、被害者が管理パネル内で表示する任意のページのコンテンツを読み取ることができます。これには、ユーザー一覧 (名前とメールアドレスを含む)、プライベートなアプリケーション設定、その他の機密データが含まれ、攻撃者が管理するサーバーに外部送信される可能性があります。
フィッシングとソーシャルエンジニアリング: スクリプトは管理パネルの UI を操作して偽のログインフォームを表示し、ユーザーに資格情報の再入力を促したり、悪意のある Web サイトにリダイレクトしたりすることができます。
キーストロークロギング: スクリプトは、侵害されたページのフォームに被害者が入力した情報をキャプチャできます。
認証された管理者として攻撃者が任意の操作を実行できるため、この脆弱性はセッション Cookie への直接アクセスがなくても、実質的にアプリケーション全体の侵害につながります。リスクは高です。
この脆弱性を緩和するには、多層防御 (defense-in-depth) アプローチを適用することをお勧めします。
主な修正: SVG コンテンツのサニタイズ:
最も堅牢な解決策は、アップロード時に SVG ファイルをサニタイズすることです。ファイルを保存する前に、<script>、<style>、<foreignObject> タグや、すべての on* イベント属性など、潜在的に危険な要素をすべて削除するために解析する必要があります。これは、専用の SVG サニタイズライブラリを使用して実現できます。
副次的な修正: SVG アップロードの無効化:
SVG アップロードがアプリケーションの重要な機能でない場合、最も簡単で安全な解決策は、それらを完全に無効にすることです。これは、TypiCMS\Modules\Core\Http\Requests\FileFormRequest.php の許可された MIME タイプのリストから 'svg' を削除することで実行できます。
// In FileFormRequest.php
// BEFORE:
$fileRule = 'mimes:jpeg,gif,png,...,svg,...|max:...';
// AFTER:
$fileRule = 'mimes:jpeg,gif,png,...,pdf,...|max:...'; // Removed 'svg'
堅牢化 - Content-Security-Policy (CSP): アプリケーションに厳格な Content-Security-Policy (CSP) ヘッダーを実装します。適切に構成された CSP はインラインスクリプトの実行を防ぐことができ、この XSS 脆弱性の影響を緩和します。
堅牢化 - ユーザーコンテンツを別ドメインから配信する: すべてのユーザーアップロードファイルを、Cookie を使用しない別のドメインから配信します。これは、ユーザー生成コンテンツをメインアプリケーションから分離し、スクリプトがセッション Cookie にアクセスしたり、アプリケーションの DOM とやり取りしたりするのを防ぐ、非常に効果的なセキュリティ対策です。
この CVE は、協調的脆弱性情報開示 (Coordinated Vulnerability Disclosure) の慣行に従って責任を持って開示されました。ここで提供される情報は、教育および防御目的のみを目的としています。