脆弱性の報告の中で、常に一定の割合を占める脆弱性に「クロスサイトスクリプティング」があります。この脆弱性を悪用されると、利用者のWebブラウザ上でスクリプトを実行され、例えば悪意のあるWebサイトに誘導されてしまいます。その結果、利用者の個人情報などが盗まれてしまう可能性があります。ここでは、クロスサイトスクリプティングとは何なのか、どのような対策をすればいいのかを説明していきます。
※第2章冒頭の記載内容に語弊があったため、修正しました。お詫びして訂正いたします。(2018/6/13)
目次 [非表示]
1:クロスサイトスクリプティングとは
クロスサイトスクリプティング(Cross Site Scripting:CSSはCascading Style Sheets、カスケーディング・スタイル・シートと混同する可能性があるため、XSSと呼ばれる。)は、利用者のWebブラウザ上で、本来は実行されるはずのないスクリプトが実行されてしまう脆弱性です。この脆弱性が悪用されると、利用者のWebブラウザ上で任意のスクリプトが実行されてしまいます。
例えば、掲示板や資料請求などのリンクをクリックした際に、そのサイトや企業とは異なる、悪意のあるサイトに飛ばされてしまいます。利用者はそれに気づきにくいので、リンク先のサイトに個人情報などを入力してしまい、それらの情報が悪意のある第三者の手に渡ってしまうのです。同様に、クッキー情報の取得によるセッションハイジャック、マルウェア感染などの被害に遭う可能性があります。
通信の相手先が別のサイトに変わってしまうことから、クロスサイトスクリプティングと呼ばれています。最近では別のサイトに遷移することなく悪意あるスクリプトが実行されてしまうケースもありますが、これらもクロスサイトスクリプティングと呼ばれます。
米MITRE社が中心となって仕様策定された「共通脆弱性タイプ一覧(CWE:Common Weakness Enumeration)」では、CWE-79が割り当てられています。また、OWASP(The Open Web Application Security Project)Top 10では7番目にランクされていますが、アプリケーション全体のおよそ3分の2で検出されるとしています。
2:クロスサイトスクリプティングが発生する仕組み
クロスサイトスクリプティングは、利用者のWebブラウザ上で悪意あるスクリプトが実行されてしまう脆弱性です。スクリプトとはJavaScriptなどのスクリプト文のことで、Webサイト上でさまざまな機能を使用できるため、多くのサイトに導入されています。
例えばJavaScriptには、不正な動作を制限するためのサンドボックスという機能があります。これには、PC内のファイルへのアクセス制限や、クリップボードへのアクセス制限、印刷機能の制限、同一生成ポリシーなどがあります。特に同一生成ポリシーは、異なる生成元(スキーム、ホスト、ポート)のスクリプトの実行を制限するものです。
クロスサイトスクリプティングの脆弱性があると、この同一生成ポリシーを回避されてしまいます。その結果、サイトを横断して(クロスサイト)スクリプトを実行されてしまうのです。その主な手法には3種類あります。
2-1:格納型クロスサイトスクリプティング
サイバー攻撃者がWebサイトを改ざんし、コンテンツに不正なスクリプトを埋め込む手法を「格納型クロスサイトスクリプティング」といいます。ストア型や持続型とも呼ばれます。Webサイト側に不正なスクリプトが埋め込まれているため、脆弱性のある環境でアクセスするために悪意あるスクリプトが実行されてしまいます。
2-2:反射型クロスサイトスクリプティング
サイバー攻撃者が、悪意のあるスクリプトを埋め込んだリンクを、メールやSNSなどに書き込み、利用者にクリックさせることで実行させる手法を「反射型クロスサイトスクリプティング」といいます。リフレクト型や非持続型とも呼ばれます。この場合、リンクにスクリプトが埋め込まれており、そのリクエストがそのまま利用者に返ってきてスクリプトが実行されてしまいます。
2-3:DOM型クロスサイトスクリプティング
利用者のWebブラウザ内部で行われるデータ構造の操作を悪用する手法を「DOM型クロスサイトスクリプティング」といいます。必ずしも、スクリプト自身がWebサイトを経由するとは限らないことが特徴で、コンテンツに含まれる正規のスクリプトによって動的なWebページを出力する際に、意図しないスクリプトが生成され、実行されます。このため、Webサイト側は気づけない攻撃といえます。
3:どのような被害を受けるのか
クロスサイトスクリプティングの脆弱性を悪用されることで、利用者のWebブラウザ上で任意のスクリプトを実行されます。つまり、スクリプトで行えることは、ほぼ実行される可能性があります。具体的には次のような影響が考えられます。
・正規のページのように見せかけて偽情報を表示される
・悪意のあるWebサイトに誘導される
・フィッシングサイトに誘導され、そこで入力したログイン情報などを盗まれる
・セッションハイジャックにより、ログイン中のサイトで意図しない操作をされる
・Webブラウザに保存されたCookie情報を盗まれる
・Webブラウザに任意のCookieを保存される
4:クロスサイトスクリプティングへの対策
クロスサイトスクリプティングの影響を受けやすいWebサイトとしては、Cookieを利用してログインのセッション管理を行っているサイトや、ログイン画面、個人情報の入力画面などフィッシングに悪用されやすいサイトが挙げられます。具体的には、次のようなページの機能です。
・入力内容を確認させる表示画面(会員登録、アンケートなど)
・誤入力時の再入力を要求する画面で、前の入力内容を表示するとき
・検索結果の表示
・エラー表示
・コメントの反映(ブログ、掲示板)など
クロスサイトスクリプティングへの対策としては、次のようなものがあります。
4-1:入力値の制限
クロスサイトスクリプティングの脆弱性を悪用する方法のひとつに、入力エリアへの不正なスクリプトの入力があります。このため、入力エリアに検索機能や個人情報の登録、HTMLタグなどを入力できないようにすることが、対策のひとつになります。
4-2:サニタイジング
ブログや掲示板、SNSなどでは、入力値の制限が難しい場合が多いといえます。このような場合には、HTMLタグの属性値などに該当する文字を削除したり、別の文字に置き換える処理を行います。また、URLを出力するときには「http://」や「https://」で始まるURLのみを許可し、「javascript:」で始まるURLを出力しないようにします。
4-3:スクリプトを許可しない
スクリプトを利用する必要がない場合は、スクリプトを無効にすることも有効な対策です。最近ではJavaの脆弱性が多く発見されており、深刻な影響を受けるケースもあるため、スクリプトを無効にするWebサイトも増えています。
4-4:WebアプリケーションのHTML出力時のコードを制限する
Webブラウザによっては、HTMLテキストの冒頭部分などに特定の文字列が含まれていると、必ず特定の文字コードとして処理されるものがあります。この場合、サイバー攻撃者が故意に特定の文字コードをブラウザに選択させるような文字列を埋め込み、その文字コードで解釈した場合にスクリプトのタグとなるような文字列を埋め込む可能性があります。このため、WebアプリケーションがHTML出力をする際には、HTTPレスポンスヘッダのContent-Typeフィールドに文字コード(charset)を指定するようにします。
4-5:Webアプリケーションの脆弱性を解消する
クロスサイトスクリプティングの脆弱性は、ほとんどのWebアプリケーションで確認されています。このため、自社にどのようなWebアプリケーションが動作しているか、バージョン情報を含めて把握する必要があります。そして、脆弱性情報が発表されたときには、なるべく早くパッチやアップデートといった対策を適用すべきでしょう。
4-6:WAFなどのソリューションの導入
セキュリティ対策機器には、クロスサイトスクリプティングに対応するものがいくつかあります。その代表となるのが「WAF:Web Application Firewall」です。WAFは、パターンファイルによるウイルス対策のように、脆弱性を悪用するコードをあらかじめ持っていて、そのコードを含む通信を検知して遮断します。たとえWebアプリケーションにクロスサイトスクリプティングの脆弱性が存在しても、それを悪用する攻撃を遮断できるので、仮想パッチとして活用できます。その間に、Webアプリケーションのバージョンアップやパッチの適用、あるいはプログラムの改修を行えばいいのです。
4-7:脆弱性診断サービスを実施する
外部から擬似的な攻撃を行い、悪用されると危険な脆弱性があるかどうかを確認する「脆弱性診断」サービスを利用することも有効な対策です。検査する脆弱性の内容はサービスによって異なりますが、多く使用されているものや、「OWASP Top 10」などに挙げられているものには対応しているケースが多くなっています。別のサービスに付帯しているケースも多いので、調べてみるとよいでしょう。
5:まとめ
クロスサイトスクリプティングの脆弱性は、企業などの組織のWebサイトが影響を受けるのではなく、利用者のWebブラウザ上で悪意あるスクリプトが実行される脆弱性です。この脆弱性を悪用する攻撃は、Webサイト側、Webブラウザ側ともに気づきづらいので、あらかじめ脆弱性を想定した対策を行うことが重要です。特に、入力エリアのあるページでの入力制限などは有効な対策となります。まずは使用しているWebアプリケーションの棚卸しを行い、バージョン管理から始めましょう。
マカフィー株式会社 マーケティング本部