クロスサイト・スクリプティング
クロスサイト・スクリプティング(XSS)はウェブサイトの入力フォームに仕掛けられるスクリプトの埋め込み攻撃です。
これらのスクリプトはユーザーがウェブアプリケーションと共有するログイン情報や個人情報などの機密情報を盗むために使用されます。
セキュリティの担当者だけでなく、今や誰にとっても注意すべきインターネット上のブービートラップのようなものです。
XSS攻撃の3つのタイプ 蓄積型、反射型、DOM型
XSSの攻撃は以下の3つのタイプに分類できます。
蓄積型XSS (持続的XSS)
Stored XSS攻撃は、悪意のあるスクリプトがターゲットサーバーに恒久的に保存される場合に発生します。
ユーザーが影響を受けるページにアクセスすると、そのスクリプトがブラウザに送信され、実行されます。恒久的に保存されるため持続的(persistent)XSSともいいます。
反射型XSS (非持続的XSS)
Reflected XSS攻撃では、ユーザーを騙して、悪意のあるスクリプトを含むリンクをクリックさせます。
ユーザーがリンクをクリックすると、スクリプトはサーバーに送信され、ユーザーのブラウザに反映され、そこで実行されます。非持続的(non-persistent)XSSともいいます。
DOM型XSS
DOMベースのXSS攻撃は、Web文書のプログラミング・インターフェースであるDocument Object Modelを操作するものです。
攻撃者はオリジナルのクライアントサイドスクリプトが使用する被害者のブラウザのDOM環境を操作し、クライアントサイドコードが予期せぬ方法で実行されるようにします。
クロスサイトスクリプティングの例

実際的なXSS攻撃の例としては大量の人数にメールやSNSのDMなどを送り付けるフィッシングキャンペーンがあります。
攻撃者はXSS攻撃を使って、例えば銀行のウェブサイトにスクリプトを注入することができます。
これにユーザーがログインすると、スクリプトはログイン情報、具体的には打ち込んだ内容やクッキーの情報などを取得し攻撃者に送信してしまいます。
こうしたものは実は電子メール以外にも日々使われるインスタグラムやツイッターといったSNSでもあり得るため多くの人にとって油断は禁物なのです。また金融系のウェブサイトのトラップは実際に多いようなので、そうしたものは一層の注意が必要となります。
実際のXSSの攻撃例
攻撃の概要と手口
実際のXSSの攻撃例として有名なものにイギリスの代表的航空会社ブリティッシュ・エアウェイズ(BA)の被害があります。
2018年8月21日から9月5日にかけて、ブリティッシュ・エアウェイズはハッカー集団Magecartによる大規模な攻撃を受けました。
この攻撃は、クロスサイトスクリプティングの一種であるフォームジャッキング(デジタルスキミング)を用いたもので、BAのウェブサイトとモバイルアプリの支払いページに悪意あるJavaScriptコードが注入されました。
攻撃者はBAのサーバー上で動作するスクリプト(Modernizrライブラリの改変版)を改ざんし、顧客が入力したクレジットカード番号、名前、住所などの個人情報を詐欺サーバーに送信。
詐欺サーバーはBAの公式ドメインを模倣し、SSL証明書で信頼性を偽装する巧妙な手口でした。これによって約380,000件もの予約取引データが漏洩し、被害は後になって発覚しました。
影響とセキュリティ対策の教訓
この攻撃はサーバーサイドのスクリプト改ざんが大規模なデータ漏洩を引き起こす危険性を浮き彫りにしました。
信頼の高かった当該企業は顧客の信頼を一時的に失い、英国の情報コミッショナー事務局(ICO)からGDPR違反として約2,000万ポンドの罰金を科され、企業の評判に深刻な影響を受けました。
セキュリティ対策としては、入力データのサニタイズ、コンテンツセキュリティポリシー(CSP)の導入、定期的な脆弱性スキャン、サーバーサイドのコード監査が不可欠です。
また、第三者スクリプトのインテグリティチェック(例: Subresource Integrity, SRI)やセキュリティパッチの迅速な適用も重要と実感させられる事件だったといえるでしょう。
クロスサイトスクリプティングを防ぐには 一般的具体策
1. 入力の検証とサニタイズ
ユーザーからの入力は常に検証、つまりサニタイズすることが重要です。
やはり特にJavaScriptのコードが含まれる可能性のある入力は適切に処理する必要があります。サニタイズとは危険な文字やタグを除去またはエスケープすることを指します。
例えば<script>タグを無効にすることが考えられます。
2. 出力エンコーディング
出力時にはデータを適切にエンコードすることが必要です。これにより、ブラウザがデータをコードとして解釈するのではなく、単なるテキストとして表示するようになります。
具体的にはHTMLエンコーディングやJavaScriptエンコーディングを使用することが推奨されます。
3. コンテンツセキュリティポリシー(CSP)の導入
CSPは、ウェブアプリケーションがどのリソースを読み込むことができるかを制御するためのセキュリティ機能です。
これを設定することで、悪意のあるスクリプトの実行を防ぐことができます。CSPを適切に設定すればXSS攻撃のリスクを大幅に低減できるともいえます。
4. ホワイトリストの使用
許可された入力やタグのリストを作成し、それ以外のものを拒否するホワイトリスト方式を採用することも効果的でしょう。
予期しないスクリプトの実行を防ぐことができます。
5. フレームワークやライブラリの利用
多くのウェブ開発フレームワークやライブラリは、XSS攻撃を防ぐための組み込み機能を提供しています。
これらを利用することでセキュリティ強化ができます。例えば、ReactやAngularなどのフレームワークはデフォルトでXSS対策が施されています。
6. 適切なHTTPレスポンスヘッダーの使用
HTTPレスポンスにおいて、Content-TypeやX-Content-Type-Optionsヘッダーを適切に設定することで、ブラウザがレスポンスを意図した形式で解釈するようにすることができます。
7. セキュアなクッキー属性の設定
クッキーに対してHttpOnlyやSecure属性を設定することで、JavaScriptからのアクセスを制限しXSS攻撃によるクッキーの盗難を防ぐことができます。
8. 定期的なセキュリティテスト
少し面倒ですが、アプリケーションのセキュリティを維持するため定期的に脆弱性スキャンやペネトレーションテストを実施することも重要です。
これにより、新たな脆弱性を早期に発見し対策を講じることが可能になるかもしれません。
以上となりますが、こうした対策を組み合わせることで、XSS攻撃に対する防御を強化しアプリケーションのセキュリティを向上させることができます。

