はじめに
みなさんこんにちは、セキュアスカイ・テクノロジーのはせがわようすけと申します。
周知のとおり、ここ数年のブラウザの機能強化は目覚ましいものがあり、CSS3やSVGを含むHTML5ブーム以降のブラウザ内での表現力の向上や、JavaScriptエンジンの最適化による実行速度の向上は、数年前では考えられないような目を見張るものがあります。また、HTML5の仕様策定後の現在でも、WHATWGやW3Cではさまざまな議論が継続的に行われており、これまでブラウザ上に存在しなかったような多様なAPIの仕様が生み出され、各ブラウザに日々実装されています。
利用者視点だけでなく、以下のような開発者視点での需要に応えるフロントエンド開発環境の改善も、ここ数年でかつてないほど大きく進んでいます。
- CoffeeScriptやTypeScriptに代表されるaltJSと呼ばれる言語処理系の登場
- ES2015やES2016といったECMAScript(ここではJavaScriptと同義と捉えておきます)の言語仕様の拡充
- それらを早い段階で現実的に利用可能にするBabelなどのトランスパイラの存在
- AngularJSやReactといったモダンなフレームワークの登場
JavaScriptを取り巻く以上のような環境の変化のなかで、従来であればブラウザ上では実現しえなかった機能やアプリケーションがJavaScriptによって実装されることで、JavaScript上で処理されるデータ量やJavaScriptのコード量そのものもこれまで以上に増加しています。
そして、JavaScriptのコードが増加するということは、比例してコード内のバグも増加するということであり、同時にセキュリティ上の問題を引き起こすバグ、すなわち脆弱性も増加することになります。
このような背景をふまえ、本連載ではこれまでJavaScriptでプログラミングを行ってきた方々を対象に、「JavaScriptに関連するセキュリティ上の問題はどういったところで発生するのか?」「どうすればセキュリティ上の問題を防ぐことができるのか?」といったことについて解説していきます。
JavaScriptのセキュリティに関する具体的な説明を始める前に、まずは最低限知っておいてほしいWebセキュリティの基礎を改めて解説します。これまでにWebセキュリティについての基礎的な事柄をすでに学習しており、XSSやCSRFといった言葉が何を意味しているのか十分に知っているという人は、読み飛ばしていただいてかまいません。
能動的攻撃と受動的攻撃
Webアプリケーションに関する攻撃は、「能動的攻撃」と「受動的攻撃」に大きく分けることができます。
能動的攻撃とは、攻撃者がサーバ自体を対象として直接的に攻撃・侵害し、サーバ自身に被害が及ぶ攻撃手法を指します。能動的攻撃の代表的なものとしては、OSコマンドインジェクションやSQLインジェクションなどがあります。
一方、受動的攻撃とは、攻撃者があらかじめ罠サイトや罠ページを用意しておき、ユーザーがその罠サイトを訪れた際に何らかの被害が発生するような、ユーザー自身の行動をトリガーとして被害が発生するような攻撃手法です。たとえば、ブラウザやブラウザのプラグインの脆弱性を利用し、ページを閲覧することでユーザーのPC上でコード実行などが可能な場合に、攻撃者はブラウザやプラグインを攻撃する「細工されたコンテンツ」を罠サイト上に作成したうえで、そのURLを掲示板やSNS、メールなどで拡散し、ユーザーが訪問してくるのを待ちかまえます。ユーザーがうっかりそのURLを訪問した場合には、ユーザーのPC上で攻撃者の用意した悪意あるコードが実行されることになります。
また、ブラウザやプラグインの脆弱性を利用してユーザーに対して被害を与えるというだけでなく、ユーザーの使用しているWebアプリケーションの脆弱性を利用することで、そのWebアプリケーションを通じてユーザーやWebアプリケーションに被害を及ぼす場合もあります。
ブラウザ上で実行されるJavaScriptコードに欠陥がある場合には、攻撃者の用意した罠URLや罠サイトへの訪問をきっかけにユーザーのブラウザ上でセキュリティ上の問題が発生することが大半であり、すなわちそれは受動的攻撃そのものとなります。ですので、本連載で取り上げるのは受動的攻撃の手法と対策が中心となります。
Webアプリケーションで代表的な4つの受動的攻撃
Webアプリケーションで代表的な受動的攻撃としては、以下の4つがあります。
- クロスサイトスクリプティング(XSS)
XSSとは、動的にHTMLを生成するWebアプリケーションにおいて、データをエスケープせずに出力しているために、生成されるHTMLに攻撃者の作成したHTML断片やJavaScriptコードが埋め込まれてしまう脆弱性です。攻撃者の作成したJavaScriptがサイトを訪問したユーザーのブラウザ内で実行されるという、まさに受動的攻撃の代表格とも言えます。
- クロスサイトリクエストフォージェリ(CSRF)
CSRFとは、たとえば掲示板の書き込みなどのように、リクエストを発行することでWebアプリケーションに永続的な副作用を持つ機能に対して、攻撃者のサイト上に設置されたformなどからリクエストを発行させる攻撃です。
- オープンリダイレクト
オープンリダイレクトは、ほかのページへのリダイレクト機能を持つWebアプリケーションにおいて、攻撃者が指定した任意のURLへのリダイレクトが可能になってしまう問題です。
- クリックジャッキング
クリックジャッキングとは、攻撃対象となるWebサイトを透明にした状態で、iframeなどを用いて攻撃者の用意した罠サイト上に設置することで、ユーザーにクリックなどの錯誤を発生させる攻撃手法です。
これらの攻撃は、いずれも攻撃者自身が直接的にサーバを攻撃したり、サーバそのものに被害を与えるものではなく、攻撃者が用意した罠ページをユーザーが訪問したことをきっかけに
- そのWebアプリケーションが取り扱っている機密情報を奪取する
- Webアプリケーション内に攻撃者が用意した偽コンテンツを表示する
- Webアプリケーションに対する操作を、ユーザーの許可を得ることなく、攻撃者の意図にしたがって実行させる
といったような被害がユーザー自身に発生するものとなります。
次回は、これらの受動的攻撃の詳細について、もう少し掘り下げて解説します。本来のテーマであるJavaScriptのセキュリティまで少し遠回りとなりますが、おつきあいいただければと思います。