Ajax の脆弱性を理解する

Ajax を使用して作成した Web アプリケーションを保護する

Ajax (Asynchronous JavaScript + XML) は Web 技術ではなく、動的 Web アプリケーションを作成することを明確に意図して作られた技術の集合にすぎません。幅広い機能と使いやすさから、Ajax は Web アプリケーションを作成するために現在最も広く使われている手段の 1 つとなっています。しかし Ajax 技術を使用して作成されたアプリケーションをはじめとし、どんなアプリケーションでもセキュリティーの弱点を突いた攻撃によって Web サイトおよびサイトを構成するデータベースのセキュリティーが侵害される可能性があります。この記事では、Ajax 技術に対する脅威のいくつかについて、その概要と、Ajax 技術を使用して作成されたアプリケーションをそうした脅威から守る方法を説明します。

Jeffrey Orloff, Freelance Technology Writer

Jeff はフリーのテクニカルライターであり、米フロリダ州 School District of Palm Beach County (パームビーチ郡学区) の技術コーディネーターでもあります。彼はセキュリティーを専門に、一貫して Web 技術を扱ってきました。彼はこれまで、SafeWave の技術担当ディレクター、Applicure Technologies のセキュリティー・エバンジェリスト、Developer Drive (Web サイト開発に関するチュートリアルを専門とするブログ) の編集者を務めた経験があります。



2012年 5月 31日

はじめに

よく使われる頭文字語

  • Ajax: Asynchronous JavaScript + XML
  • CSS: Cascading Style Sheet
  • DOM: Document Object Model
  • HTML: HyperText Markup Language
  • JSON: JavaScript Object Notation
  • SQL: Structured Query Language
  • UI: User Interface
  • XML: Extensible Markup Language
  • XSS: Cross-Site Scripting

Ajax が Web 開発者の間で人気となった理由として、以下の点を挙げることができます。

  • Ajax により、データ駆動型 Web サイトの基礎となる堅牢な Web アプリケーションを作成することができます。
  • Ajax により、Web サイトの応答速度とユーザビリティーを高めることができます。

しかし、Web ベースのアプリケーションを従来のデスクトップ・アプリケーションのように見せるために多くの開発者が使用している「技術」は、実際には 1 つの技術ではありません。Ajax は技術の集合であり、それぞれの技術が最終的なアプリケーションの中で重要な役割を果たします。Ajax に含まれる技術を示したものが表 1 です。

表 1. Ajax に使用される技術
技術用途
JavaScriptすべての技術を協調して動作させるためのスクリプト言語
XMLサーバーとクライアントとの間でデータを転送、操作、交換するためのマークアップ言語
HTML と CSSUI のデザインとアプリケーションの表示を実現する技術
DOMコンテンツの動的表示とデータの動的操作を実現する技術

Ajax が Web 開発者を引き付ける要素は、Ajax のセキュリティーにとっての最大の脅威ともなります。ほとんどのセキュリティー専門家は Web アプリケーションがサイバー犯罪の大きなターゲットであることを認めていますが、一般に Web のセキュリティーにかける予算は組織のセキュリティー予算のごく一部を占めるにすぎません。現在、Web 上で目にする多くのアプリケーションの開発には Ajax が使用されていることから、JavaScript コードの脆弱性を突こうとする攻撃者は Ajax をターゲットにするようになっています。

Ajax が存在する最大の理由は、データ駆動型の Web サイトを作成するためです。しかし攻撃者は、単に Ajax が Web アプリケーション開発ツールとして使用されているから、という理由で Ajax に目を付けるわけではありません。財務データであれ、個人情報が含まれるデータであれ、機密データであれ、データはオンラインで日常的に利用されるもののなかで守るべき貴重な情報であることから、やはりデータ駆動型の Ajax がサイバー犯罪のターゲットになるのです。

この記事では Ajax のセキュリティーに対する一般的な脆弱性と脅威について、ブラウザー・ベースの攻撃、SQL インジェクション、クロスサイト・スクリプティング (XSS)、Ajax ブリッジなどを含めて詳しく探ります。さらに、攻撃から保護するために取り得る予防手段についても説明します。


攻撃のタイプを理解する

数字で見る Ajax のセキュリティー

Ajax を使用して作成された Web アプリケーションの数を明らかにすることはおそらく不可能でしょうが、Ajax は Web アプリケーション開発者が最もよく使用する技術の 1 つであるため、過去 24 ヶ月の間にセキュリティーの侵害を受けたと認められる Web アプリケーションが全体の 73% に上ると仮定すると、それらの Web アプリケーションに関して以下のことが言えます。

  • Ajax がかなり大きく関わっている、既知の Web アプリケーションの脆弱性が過去 24 ヶ月で 2,155 種類検出された。
  • Ajax がかなり大きく関わる深刻な脆弱性が少なくとも 1 件あった Web アプリケーションは、セキュリティー侵害を受けた Web アプリケーションの 83% に上る。

これまで JavaScript の脆弱性のために、多くの企業が望ましくない報道をされる羽目になりました。悪意を持ったハッカー達は、クロスサイト・スクリプティング (XSS) 脆弱性を突いた攻撃によって、JavaScript コードにスクリプトを混入することで、サイトの訪問者からセッション・クッキーを盗んだのです。これらのクッキーにはログイン情報が含まれているため、攻撃者はその情報を利用して、被害者のさまざまなアカウントに関連付けられた任意のサービスにアクセスできるようになります。

有名な Samy ワームは、実際にはソーシャル・ネットワーキング・サイトで多くの友達を集めるためのいたずらとして始まりました。Samy ワームの作成者は彼のプロフィールを通じて悪意のあるコードをアップロードし、そのコードが以下の内容を実行しました。

  • 彼のプロフィールを訪れた人をすべて、その人達の友達リストに追加します。
  • 被害者のプロフィールの最後に「Samy is my hero」と書き込みます。
  • 被害者の友達リストの全員に対してコードを複製します。

最初の人が被害を受けてから 24 時間経たないうちに、Samy は 100 万人の友達を獲得し、そのソーシャル・ネットワーキング・サイトの動作が停止しました。

Ajax を使用したからと言って、他の Web 技術を使用した場合よりも Web サイトの危険性が高まるわけではありません。何が脅威なのかを理解していれば尚のことです。この記事のこれから先では、開発作業の中で想定して考慮することが可能なセキュリティーの脆弱性をいくつか概説します。


ブラウザー・ベースの攻撃

Ajax の基礎となる JavaScript は、悪意のあるコードと無縁ではありません。ブラウザー・ベースの攻撃が実際に機能するためには、悪意のあるコードが Web 技術 (この場合は JavaScript) を悪用し、攻撃者の望むコードをブラウザー自体に実行させることができなければなりません。

ブラウザー・ベースの攻撃が行われている場合の簡単な例として、被害者が自分のホームページが変更されたことに気付く場合、あるいは被害者がブラウザーのアドレス・バーに URL を入力すると別のサイトにリダイレクトされる場合などがあります。これらに対処するのは面倒で手間がかかりますが、最悪のシナリオではありません。

ブラウザー・ベースの攻撃の多くは、感染したコンピューターに気付かれないようにするために、他の攻撃を軽減するように設計されています。攻撃は多くの場合、被害者のブラウザーがマルウェア除去サイトにアクセスできないようにしたり、あるいは Web 経由での署名ファイルの更新をできないようにしたりします。他の脅威としては、ブラウザー・プロキシーを利用するものやキーストローク・ロギングなどがあります。

予防手段

ブラウザー・ベースの攻撃から保護するための簡単な方法として、Java 技術、JavaScript、Microsoft ActiveX のコントロールを無効にする方法があります。しかしそうすると、非常に多くの Web アプリケーションが実行できなくなります。それよりも、オペレーティング・システム・ソフトウェア、ブラウザー・ソフトウェア、マルウェア対策ソフトウェアを最新の状態に保持する必要があります。また、評価の高いファイアウォール・アプリケーションを使用し、ファイルをダウンロードする際や Web サイトを訪れる際に十分に注意する必要もあります。


SQL インジェクション

なぜ SQL インジェクションが Ajax にとって脅威なのでしょう。何しろ、Ajax には SQL などありません。簡単に言えば、SQL インジェクションが脅威となる理由は Ajax がクライアント・サイドで実行されるためです。Web アプリケーションのサーバー・サイドには相変わらずデータベースが必要であり、SQL が使用されるからです。

SQL インジェクションは、Web サイト内の不適切に作成された領域 (フォームなど) に攻撃者が悪意のあるコードを注入することによって行われます。攻撃を受けたサイトに脆弱性があると、データベースの内容全体が公開されてしまう可能性があります。この方法による攻撃が使用された場合の例として、パスワード・データベースが公開され、オンライン決済システムからクレジットカード情報が盗まれたことがあります。もっと最近では、この方法を使用して人気エンターテイナーのサイトからファンの E メール・アドレスが盗まれたことがありました。金銭的な盗難はありませんでしたが、このエンターテイナーの商品の販売に見せかけてマルウェアを拡散しようとしたスパマー達は、盗んだアドレスを実際に使用しました。

Ajax を使用して開発されるアプリケーションにおいて、SQL インジェクションの被害を軽減するための方法は、他の Web 技術の場合と同じです。ただし、単純に JavaScript ベースのサニタイズ手法を使用するだけでは、このタイプの攻撃から保護する上では十分ではありません。JavaScript は SQL インジェクションが行われるサーバー・サイドで実行されるわけではなく、クライアント・サイドで実行されるからです。

予防手段

Ajax を使用する場合にデータベースを保護するためには、ユーザー入力が妥当かどうかを検証する必要があり、その検証をサーバー・サイドで行う必要があります。パラメーター化された文、つまりプリペアド・ステートメントを使用すると、データベースや SQL 文に値が直接入力されなくなるため、SQL インジェクションを防ぐことができます。値を直接入力する代わりに、プレースホルダー (バインド変数とも呼ばれます) を使用し、そのプレースホルダーに対する値を別の API 呼び出しを通じて提供するようにします。


クロスサイト・スクリプティング

XSS も、悪意のあるコードをアプリケーションに挿入するインジェクション攻撃の例です。XSS 攻撃に対して脆弱な Web アプリケーションには、Ajax によく使用されるブラウザー・サイドのスクリプトなどがあります。通常、このタイプの脆弱性を突いた攻撃によって、何の疑いも持たずに Web サイトにアクセスした人に悪意のあるスクリプトが渡されます。これらのスクリプトによって、ID やクッキーが盗まれる場合や、訪問者の Web 使用状況の監視、機密情報へのアクセス、さらには DoS (サービス拒否) 攻撃などが行われる場合もあります。

2010年にニュースとなった有名な XSS 攻撃の中に、ソーシャル・メッセージング・サイトへの攻撃があります。@Matsta というユーザーによって開始された攻撃により、そのサイトを見た人が悪意のあるメッセージの上をマウス・オーバーすると JavaScript のポップアップが表示されるようになりました。また、このサイトに対する他の XSS 攻撃により、ユーザーは調査サイトや不適切なコンテンツをホストするサイトにリダイレクトされるようになりました。

予防手段

Ajax を作成する場合、以下の手段に従うことによって XSS に対する脆弱性から保護することができます。

  • JavaScript の変数を必ず引用符で囲む。
  • JavaScript に16 進エンコードを使用する。
  • JavaScript に Unicode エンコードを使用する。
  • バックスラッシュによるエンコード (\"\’\\ など) を避ける。
  • JSON.parse ライブラリーまたは json2.js ライブラリーを使用して JSON を構文解析する。
  • JSON の構文解析に eval() メソッドを使用しないようにする (eval() メソッドを使用すると JSON に含まれる任意のスクリプトを実行できてしまいます)。

Ajax ブリッジ

Ajax アプリケーションは、その Ajax アプリケーションがホストされる Web サイトに接続されるように作成されますが、セキュリティー対策によって、サイト A のアプリケーションはサイト B へ接続することはできません。しかし、多くのサイトではサードパーティーの Web サイトやデータ・ソースを利用してマッシュアップを作成しています。Ajax サービスのブリッジは、ブラウザー上で実行される JavaScript とサードパーティー・サイトとの間のトラフィックを転送するプロキシーの役割をする Web サービスを、ホストを通じて提供するために作成されます。Ajax ブリッジを使用すると、サイト B からサイト A を訪れた人に対してサイト A がデータやコンテンツを提供できるようになります。

Ajax が特定の技術ではなく技術の集合であるのと同じように、ブリッジは特定の脆弱性ではありません。Ajax ブリッジによって悪意のあるハッカーにとって攻撃の道筋が増えるため、脅威の範囲が広がります。XSS や SQL インジェクションなどの攻撃が Ajax ブリッジ・サービスを通じて渡される可能性があります。サイト B はサイト B 訪問者が利用できる攻撃の脅威から Web アプリケーションを保護するために、あらゆる対策を講じているかもしれませんが、見逃されていた Ajax ブリッジを使用して、サイト A 経由でサイト B が攻撃される場合があるかもしれません。

予防手段

Ajax ブリッジに対する脆弱性を回避するためには、Ajax ブリッジを使用してサードパーティーへのアクセスを提供するサイト間に信頼が必要です。また、サードパーティー・サイトが皆さんの Web サイトにどのようにアクセスするかを監査し、Ajax ブリッジによって攻撃される可能性がある脆弱性がないかどうかをスキャンする必要もあります。


まとめ

Ajax そのものに新たなセキュリティーの脆弱性や独特のセキュリティーの脆弱性があるわけではありません。また、Web アプリケーションを開発するための他の手段に比べ、Ajax の安全性が劣るとみなすべきでもありません。この記事では、Ajax のセキュリティーの脆弱性と脅威のいくつかを説明するとともに、開発作業のなかでそれぞれに対応した予防手段を取る方法についても説明しました。

最初にアプリケーションの計画を立てているときに、脆弱性に対してアプリケーションを保護することを開発の初期段階の優先事項にする必要があります。どのような組織も、Web セキュリティー戦略の一環として、テストと脆弱性スキャンを頻繁に行う必要があります。

参考文献

学ぶために

製品や技術を入手するために

  • ModSecurity: このアプリケーションにより、Web アプリケーションのための優れたファイアウォールを無料で実現することができます。
  • IBM 製品の評価版: IBM 製品の評価版をダウンロードするか、あるいは IBM SOA Sandbox のオンライン試用版で、DB2、Lotus、Rational、Tivoli、WebSphere などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development
ArticleID=818650
ArticleTitle=Ajax の脆弱性を理解する
publish-date=05312012