エンジニアのためのセキュリティ学習:クロスサイトスクリプティング(XSS)を理解する

クロスサイトスクリプティング(XSS)は、2000年代初頭からセキュリティ専門家を悩ませてきた問題であり、残念ながら数十年経った今でも、コードレベルで最も一般的な脅威の一つとして挙げられます。この種のソフトウェア脆弱性はあまりにも長く私たちを苦しめてきましたが、CISAが「Secure-by-Design(設計段階からのセキュリティ)」の一環として発表した最近の警告は、この問題を根本から根絶しようとするものです。彼らは脆弱性のクラスを大規模に排除するという世界的な使命を掲げており、開発者主導のセキュリティに焦点を当てるこの取り組みは、状況を大きく変える可能性を秘めています。しかし、それを実現するには、開発者がセキュリティ面で成功できるよう環境を整える、賢明な企業のコミットメントが不可欠です。
では、XSSとは正確には何なのでしょうか?
Webブラウザはオンライン上の素晴らしいコンテンツへの入り口ですが、残念ながら良いことばかりではありません。ブラウザの本来の動作が、セキュリティ脆弱性の引き金になることがあるのです。ブラウザは当初、読み込んだマークアップを信頼し、疑問を持たずに実行するという特性を持っていました。その機能が悪用されるまでは問題ありませんでしたが、当然ながら攻撃者はこの傾向を悪用し、悪意のある目的を達成する方法を見つけ出しました。
クロスサイトスクリプティングは、ブラウザの信頼性とユーザーの知識不足を悪用して、データの窃取、アカウントの乗っ取り、Webサイトの改ざんを行う攻撃手法です。非常に深刻な被害を短時間で引き起こす可能性がある脆弱性です。
XSSの仕組み、被害の内容、そしてその防止策について見ていきましょう。
XSSはどのように機能するのでしょうか?
XSSは、信頼できない入力(多くの場合データ)がページ上の出力としてレンダリングされる際、実行可能なコードとして誤って解釈されることで発生します。攻撃者は入力パラメータ内に悪意のある実行可能コード(HTMLタグ、JavaScriptなど)を配置し、それがブラウザに返されると、データとして表示されるのではなく実行されてしまいます。
前述の通り、この脆弱性はブラウザの基本的な動作に起因しており、データと実行可能コードを区別することが困難です。Webの動作モデルは以下の通りです。
- ユーザーがWebページにアクセスする
- ページがブラウザに対し、読み込むファイルと実行する内容を指示する
- ブラウザはページ上の内容を疑問を持たずに実行する
この機能のおかげで、私たちはWeb上で非常に魅力的でインタラクティブな体験を享受できています。しかしその反面、コストのかかる悪用や脆弱性を招く原因にもなっています。
攻撃者が脆弱なサイトに悪意のあるスクリプトを追加すると、それは疑問を持たれることなく実行されます。そこには詳細な調査も、検知対策も存在しないからです。

XSSには3つのタイプがあります。
- 保存型XSS
- 反射型XSS
- DOMベースXSS
保存型XSSは、攻撃者がアプリケーションのデータフィールド(ユーザーの携帯電話番号を保存するフィールドなど)に悪意のあるスクリプトを永続的に保存できる場合に発生します。この不審なスクリプトは、そのデータフィールドがアプリケーションに表示されるたびに、ユーザーのブラウザに送信されます。
このタイプの攻撃は、掲示板サイトやコメント機能でよく見られます。攻撃者がコメント欄に悪意のあるスクリプトを入力すると、そのコメントを見たすべてのユーザーが知らぬ間にスクリプトを実行させられてしまいます。
反射型XSSは、ユーザーの入力がそのままユーザーのブラウザに反射(反映)される場合に発生します。例えば、検索結果を表示する際に「~の検索結果」と表示する検索ボックスなどが挙げられます。
ここで、検索語句をURLのクエリパラメータとして渡す仕組みを想像してみてください。攻撃者は、悪意のあるスクリプトを埋め込んだリンクを被害者に送りつけることができ、ほとんどのWebユーザーはそれに気づくことさえありません。
被害者がそのリンクをクリックするとフィッシングサイトにリダイレクトされ、知らぬ間にサイトのパスワードを入力させられます。被害者が気づいたときには、攻撃者はすでにアカウントの鍵を盗み出しているのです。
DOMベースXSSは、この脆弱性の中でも比較的新しい種類です。AngularやReactといった多くのUIフレームワークに見られる複雑なテンプレート構造を悪用します。
これらのテンプレートは動的なコンテンツやリッチなUIアプリケーションを実現しますが、誤った使い方をするとXSS攻撃を実行するために利用されてしまいます。
以上がXSSの概要です。XSSがどのように破壊的な目的で利用されるのか、さらに詳しく見ていきましょう。
なぜXSSはこれほど危険なのでしょうか?
XSSは、ユーザーを悪意のあるサイトへリダイレクトさせたり、Cookieを盗んだり、セッションデータを狙ったりするために利用されます。基本的に、JavaScriptでできることはすべてXSS攻撃でも可能です。
XSS攻撃の3つの例を挙げます。
- Yahooメールのユーザーは2015年にXSSを利用され、セッションCookieを盗まれました。
- 「Samyワーム」は、MySpaceのXSS脆弱性を介して拡散されました。これは史上最も急速に拡散したマルウェアであり、わずか20時間で100万人のユーザーに影響を与えました。
- eBayでは、商品詳細ページに悪意のあるスクリプトを埋め込むことが可能でした。これが、eBayユーザーに対するXSS攻撃につながりました。
XSS攻撃は一見単純ですが、非常に深刻です。セッションの乗っ取り、ユーザー認証情報の窃取、機密データの流出につながる可能性があります。企業の評判低下や収益減少は、こうした攻撃の大きな代償です。Webサイトの改ざんだけでも、ビジネスに望ましくない結果をもたらす可能性があります。
しかし、あなたのような優れたセキュリティ戦士であれば、XSSを打ち負かすことができます。修正は決して複雑ではなく、XSSが一般的な攻撃手法となって以来、業界は大きく進歩しました。
あなたはXSSを打ち負かすことができます。
XSSを打ち負かす鍵は、コンテキストを理解することです。具体的には、ユーザーの入力がクライアントにどのようにレンダリングされるか、そしてどこにレンダリングされるかというコンテキストです。HTMLコード内なのか、それともJavaScriptスニペット内なのかを把握する必要があります。
ユーザー入力をブラウザに送り返す必要がないのであれば、それに越したことはありません。しかし、送り返す必要がある場合は、HTMLエンコードを行うのが一般的です。出力をHTMLエンコードすることで、ブラウザに対し、コンテンツをそのまま表示し、実行しないよう指示できます。
入力バリデーションも重要ですが、バリデーションやホワイトリストだけでは万全の解決策とは言えません。エンコードはさらに一歩進んだ対策であり、ブラウザが悪意のあるスクリプトを実行するのを防ぎます。バリデーションやホワイトリスト戦略で防ぎきれなかったものも、エンコードによってカバーできます。
現在、多くのフレームワークがHTML出力を自動的にエンコードしています。
Angular、ASP.NET MVC、そしてReact.jsは、デフォルトでHTMLエンコードが使用されるフレームワークです。これらのフレームワークでエンコードを無効にするには、特別なメソッドを呼び出して明示的に指示する必要があります。
その他のほとんどのフレームワーク(DjangoやSpringなど)にも、コードに簡単に組み込めるXSS防止用の標準ライブラリが用意されています。
最大の課題は、ユーザー入力がシステムに入り込むあらゆる経路を分析し、常に警戒を怠らないようにすることです。クエリパラメータだけでなく、POSTパラメータも攻撃の経路になり得ます。アプリケーション全体でのデータの流れを追い、外部から来るデータは一切信頼しないでください。
国境警備隊のように考えましょう。すべてのデータを止め、検査し、悪意があるように見えれば通さない。そしてレンダリング時にはエンコードを行い、見逃した悪意のある要素が問題を引き起こさないようにするのです。
これらの戦略を実行すれば、ユーザーはXSS攻撃から守られます。さらに詳しいヒントについては、OWASPチートシートを確認して、データをしっかりと管理しましょう。
XSSを阻止し、セキュリティスキルをレベルアップさせましょう。
XSSは、OWASP Top 10 2017のWebセキュリティリスクリストで第7位にランクインしています。古くからある脅威ですが、注意を怠れば、今でもアプリケーションに現れて問題を引き起こす可能性があります。
開発者がコードを作成する際にセキュリティ第一の考え方を身につけるには、トレーニングが非常に重要です。そして、そのトレーニングは、開発者が実際に使用している言語で、実際のアプリケーションをシミュレートする場合に最も効果を発揮します。それを踏まえ、XSSについてさらに学ぶために、私たちの学習リソースをチェックしてみてはいかがでしょうか?その後、トレーニングと実践を積み重ね、習得を目指しましょう。
今すぐXSS脆弱性を発見・修正する準備はできていますか?Secure Code Warriorプラットフォームで挑戦してみましょう。
AI主導の開発をリリース前にガバナンスする
AIを活用したリスク測定、コミット時のセキュアコーディングポリシーの強制、そしてSDLC全体を通じたセキュアなデリバリーの加速を実現します。
他のブログ記事を見る
セキュアコーディング、AIガバナンス、ソフトウェアリスク管理に関する専門的なコンテンツをご覧ください。
%252520%252520(3).avif)
Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Security as culture: How Blue Prism cultivates world-class secure developers
Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed
AIを活用した開発をリリース前にセキュアに
開発者のリスクを可視化し、ポリシーを適用することで、ソフトウェア開発ライフサイクル全体における脆弱性を未然に防ぎます。



.avif)