Overview
クロスサイトスクリプティング(XSS:Cross-Site Scripting)とは、Webアプリケーションの脆弱性を利用して、悪意のあるJavaScriptコードをWebページに注入(インジェクション)するサイバー攻撃手法です。CSSとの混同を避けるため「XSS」と略されます。OWASP Top 10に継続的にランクインしており、Webアプリケーションで最も頻繁に発見される脆弱性の一つです。
XSS攻撃が成功すると、被害者のブラウザ上で攻撃者が任意のJavaScriptを実行できるようになります。これにより、セッションCookieの窃取によるセッションハイジャック、キーストロークの記録による認証情報の窃取、偽のログインフォームの表示によるフィッシング、マルウェアの配布など、多様な攻撃が可能になります。
XSSの根本原因は、ユーザーからの入力データを適切に検証・エスケープせずにHTMLに出力することにあります。出力エンコーディングの徹底やContent Security Policy(CSP)の導入により防御可能ですが、モダンなSPA(Single Page Application)やJavaScriptフレームワークの普及により、DOM操作に起因する新たな攻撃ベクトルも増加しています。
Details
XSS攻撃の種類
- Stored XSS(格納型XSS):攻撃者が注入した悪意のあるスクリプトがサーバー側のデータベースに永続的に保存され、そのページを閲覧するすべてのユーザーに影響を与える。掲示板やコメント欄、ユーザープロフィールなどが典型的な攻撃対象。最も危険度が高い
- Reflected XSS(反射型XSS):攻撃者が細工したURLに含まれるスクリプトが、サーバーからのレスポンスにそのまま反映されて実行される。検索結果ページやエラーメッセージが典型的な攻撃対象。被害者に細工したURLをクリックさせる必要がある
- DOM-based XSS(DOM操作型XSS):サーバー側の処理を介さず、クライアントサイドのJavaScriptがDOM(Document Object Model)を操作する際の脆弱性を悪用する。URLフラグメント(#以降)やlocation.hashの値を直接DOMに挿入するケースが典型的
攻撃ペイロードの例
XSS攻撃のペイロード(攻撃コード)は多種多様です。最も基本的なものはscriptタグを使用したJavaScript実行ですが、imgタグのonerror属性、SVGのonload属性、イベントハンドラ属性など、HTMLの様々な機能を悪用した攻撃ベクトルが存在します。攻撃者はWAFやフィルタリングを回避するために、エンコーディングの多重化、大文字小文字の混在、HTMLエンティティの利用など、多数の難読化テクニックを使用します。
Content Security Policy(CSP)
CSPは、Webページで実行を許可するスクリプトのソースをHTTPヘッダーで明示的に指定するセキュリティ機構です。インラインスクリプトの実行禁止、許可されたドメインからのスクリプトのみ実行許可、eval()の使用禁止などのポリシーを設定できます。適切に設定されたCSPはXSS攻撃の被害を大幅に軽減しますが、設定が複雑であり、レガシーコードとの互換性問題が発生しやすい点が課題です。
エスケープ処理とサニタイゼーション
エスケープ処理(出力エンコーディング)とは、HTMLの特殊文字(< > & " '等)をHTMLエンティティに変換し、ブラウザがスクリプトとして解釈することを防ぐ処理です。出力先のコンテキスト(HTML本文、HTML属性、JavaScript、CSS、URL)に応じて適切なエスケープ方式を選択する必要があります。
サニタイゼーションは、ユーザー入力からHTML的に危険な要素を除去または無害化する処理です。リッチテキストの入力を許可する必要がある場合、DOMPurifyなどの実績のあるライブラリを使用して、安全なHTMLタグ・属性のみを許可するホワイトリスト方式のサニタイゼーションを実施します。
Security Measures
- 01コンテキストに応じた出力エスケープの徹底:ユーザー入力をHTML、JavaScript、CSS、URLの各コンテキストに出力する際、それぞれ適切なエスケープ処理を行ってください。テンプレートエンジンの自動エスケープ機能を活用し、生のHTML出力を最小限にしましょう。
- 02Content Security Policy(CSP)の適切な設定:CSPヘッダーを設定し、インラインスクリプトの実行を禁止してください。script-src、style-src、img-srcなどのディレクティブを用いて、許可するリソースのソースを厳密に制限しましょう。nonce-basedまたはhash-based CSPの導入を推奨します。
- 03HttpOnly・Secure・SameSite属性の設定:セッションCookieにはHttpOnly属性を設定し、JavaScriptからのアクセスを禁止してください。さらにSecure属性(HTTPS通信のみ送信)とSameSite属性(クロスサイトリクエスト制限)を併用することで、Cookie窃取のリスクを低減できます。
- 04サニタイゼーションライブラリの活用:リッチテキスト入力を許可する場合は、DOMPurifyなどの実績のあるサニタイゼーションライブラリを使用してください。独自のサニタイゼーション処理を実装するのではなく、コミュニティで検証されたライブラリに依存することが安全です。
- 05フレームワークの自動エスケープ機能の活用:React、Vue.js、Angular等のモダンフレームワークは、デフォルトで出力のエスケープを行います。dangerouslySetInnerHTML(React)やv-html(Vue.js)など、エスケープをバイパスする機能の使用は必要最小限にとどめ、使用時は必ずサニタイゼーションを実施してください。
- 06定期的なXSS脆弱性スキャンの実施:Burp Suite、OWASP ZAP等のWebアプリケーション脆弱性スキャナーを使用して、定期的にXSS脆弱性を検出してください。CI/CDパイプラインにセキュリティテストを組み込み、デプロイ前に自動的にスキャンすることを推奨します。
Incidents
📋 Samy Worm(MySpace XSSワーム事件)(2005年)
2005年10月、Samy Kamkar氏が作成したXSSワーム「Samy」がMySpace上で爆発的に拡散しました。このワームはMySpaceのプロフィールページに存在するStored XSS脆弱性を悪用し、感染したプロフィールを閲覧したユーザーのプロフィールにも自動的にワームを埋め込むように設計されていました。
わずか20時間で100万人以上のMySpaceユーザーに感染し、史上最速で拡散したウイルスの一つとなりました。ワーム自体は悪意のある破壊活動は行わず、感染者のプロフィールに「Samy is my hero」というテキストを追加するだけでしたが、MySpaceは一時的にサービスを停止して対応を余儀なくされました。この事件はXSS脆弱性の潜在的な破壊力を世界に知らしめました。
📋 British Airways Magecartスキミング攻撃(2018年)
2018年8月から9月にかけて、British Airwaysの公式ウェブサイトとモバイルアプリが攻撃グループ「Magecart」によるXSS攻撃を受け、約38万件の顧客のクレジットカード情報が窃取されました。
攻撃者はBritish Airwaysのウェブサイトに悪意のあるJavaScriptコードを注入し、決済ページで入力されるクレジットカード番号・有効期限・セキュリティコードをリアルタイムで外部サーバーに送信していました。スクリプトはわずか22行のコードで構成されており、約2週間にわたって検出されませんでした。British Airwaysは英国ICOからGDPR違反として当初1億8,339万ポンドの罰金を通告され、最終的に2,000万ポンドの罰金が科されました。
📋 Fortnite XSS脆弱性(2019年)
2019年1月、セキュリティ企業Check Pointの研究者らが、Epic Gamesの人気オンラインゲーム「Fortnite」のアカウントシステムにXSS脆弱性を発見しました。この脆弱性を悪用すると、攻撃者はFortniteプレイヤーのアカウントを完全に乗っ取ることが可能でした。
攻撃は、Epic Gamesの古い未使用のサブドメインに存在するXSS脆弱性を起点としていました。攻撃者がフィッシングリンクをプレイヤーに送信し、クリックさせることで認証トークンを窃取し、アカウントにログインできました。当時Fortniteのプレイヤー数は約2億人に達しており、ゲーム内通貨(V-Bucks)の購入やチャット履歴の閲覧など、広範な被害が発生し得る状況でした。Epic GamesはCheck Pointの報告を受けて迅速に脆弱性を修正しました。