テクノ雑学
第150回 ぱっと見は気づきにくいセキュリティホール〜XSSの仕組みと対策〜
9月21日、人気のソーシャルネットワークサービス「Twitter」上で騒動が持ち上がりました。Twitter公式Webサイトのシステムにセキュリティホールがあり、その危険性を周知するために有志が行ったデモンストレーションが、猛烈なスピードで伝播していったのです。
発端となったのは、「rainbowtwtr」というアカウントから発せられた、「つぶやき」表示用の枠をカラフルに彩るものでした。Twitter公式サイト上でこのつぶやきを表示させ、枠内にマウスカーソルを置いたユーザーは、自分のアカウントでも勝手に同じ内容のつぶやきを発してしまうのです。以前からセキュリティホールの存在をTwitter側に通告していたユーザーがTwitter側に対策を急がせるため、危険周知用に行ったデモンストレーションだったのですが、ほどなく同じセキュリティホールを悪用した悪質ワームが登場したことで、ユーザーの間に大きな混乱を招きました。日本時間で日付が替わる頃には対策が行われて事態は収束、後にTwitter側は「8月の時点で対策済みだったが、その後のアップデートで再度発生してしまっていた」と発表しましたが、Web経由の攻撃の威力を再認識させる出来事でした。
今回、発覚したセキュリティホールは、通称「クロスサイトスクリプティング(Cross Site Scripting:サイトを横断したスクリプト処理。以下XSS。)」と呼ばれるものです。「CSS」ではなく「XSS」と略すのは、Webページのデザイン用などに使われる「カスケーディング・スタイル・シート(Cascading Style Sheets)」と区別するためです。XSS脆弱性による問題は以前からたびたび持ち上がっていましたが、7月にもYouTubeで発生するなど、最近はソーシャルネットワークサービスが攻撃の対象になってきたことで、被害の規模が大きくなりがちなのが問題です。
なぜ、このような問題が起こるのでしょう? まずはWebページがブラウザに表示される仕組みについて説明します。
Webコンテンツが表示される仕組み
Webページは、コンテンツを提供する「Webサーバー」と、それに対してリクエストを送る「Webクライアント」の間のやりとりによって成立しています。ここで言う「クライアント」は、ユーザー自身、そしてユーザーがWeb閲覧用に使うPCやケータイなどのハードウェアを指すとともに、その上で作動する閲覧用アプリケーションソフト、「Webブラウザ」をも指すと思ってください。
クライアントは「このページのデータを送信してください」とサーバーにリクエストを送ります。具体的には、ブラウザの入力ウィンドウにURIを入力したり、ブックマークに保存したショートカットをクリックしたり、という操作がサーバーへのリクエストになります。リクエストを受け取ったサーバーは、その内容に応じたデータ(ファイル)をクライアントに向けて送信します。データを受け取ったクライアント=ブラウザは、その内容に応じて画面表示用の描画(レンダリング)を行います。
表示させる内容が単純な文字と画像だけではなく、Flashなどを使ったリッチコンテンツだったり、ストリーミング配信による音声や動画の再生を行う場合は、「プラグイン」と呼ばれるブラウザの機能拡張用プログラムを呼び出して実行させたり、外部のアプリケーションに処理を引き渡すような処理を行います。
Webページ記述の基本は「HTML(HyperText Markup Language)」と呼ばれる言語です。ハイパーテキストとは、複数の文書や図版を相互に関連付ける仕組みを指します。マークアップ言語とは、文章そのものの中に、構造や見栄えなどに対する指定を書き込んでいくコンピュータ言語の種類です。つまり、HTMLはハイパーテキストを実現するためのマークアップ言語で、構造や見映え、作動の指定は「タグ」によって記述します。
たとえば、文字をクリックすると画像が表示されるようにするためには、以下のように記述します。
<a href=“画像ファイルのURI”>ここの部分の文字をクリックすると画像が見られます</a>
<>で囲まれた部分がそのタグの機能を示し、</>によって閉じられます。
HTMLの初期の仕様では、文書の中に画像を表示でき、文字の大きさや色が変えられる程度の機能しか定義されていなかったのですが、「www」が普及するにつれて、文書の表現力を高めるための仕組みが求められるようになりました。そんな要求に応えてHTMLは仕様を拡張し、同時にブラウザも独自の機能拡張を行うようになります。たとえば初期Webブラウザの代表格だったNetscape Navigatorは、1995年にリリースしたバージョン2で、独自のプログラム言語「Java Script」に対応します。「スクリプト」とは、テキストのままで実行できる簡易プログラム言語です。これによってWebブラウザ上での表現は飛躍的に自由度を増し、電光掲示板のように文字を流したり、ウィンドウのサイズを自動的に最適化する、といった「動き」が実現します。さらに、ブラウザを通じて実行可能なプログラム言語「Java」への対応によって、Webブラウジングの世界は大きく進化を遂げたのです。
しかし、利便性とリスクは表裏一体の関係にあります。Java Scriptやプラグインへの対応は、それだけ新たなセキュリティホールの発生の種を抱えることでもあります。いちいち数え上げるとキリがないほどの問題が起こってきましたが、それらの中でもXSSはかなり危険度の高い問題として認識されてきました。
セキュリティ上の不備を利用するXSS
XSSは2000年にCERT(Computer Emergency Response Team:コンピュータ緊急対応チーム)とマイクロソフトから報告されたセキュリティホールです。ごく簡単に言うと、Webページやメールの中に忍び込ませた攻撃用のスクリプトを、第三者である一般ユーザーのブラウザ上で動作させ、攻撃に加担させる類の攻撃方法を指す言葉です。ユーザーが認知できないよう、攻撃用スクリプトを別のサイト上に置くという特徴点から、「クロスサイト」と呼ばれています。
上のイラストではメールを使ってユーザーを攻撃に加担させる例を紹介しましたが、「怪しいメールは開封せずに破棄する」といった習慣が定着してきたため、現在ではこのパターンは減っているようです。より深刻なのは、掲示板や検索エンジンなど、クライアントのリクエストに対してコンテンツが動的に生成されるタイプのWebページを利用するパターンです。
この手のWebサイトでは、訪問者が掲示板に何かを書き込んで送信すると、サーバー上で作動している掲示板用のプログラムが、書き込み内容を反映したHTMLを生成して訪問者のブラウザへ送信します。サーバーが生成したHTMLを受信した訪問者のブラウザは、その内容を解釈して画面上に表示します。
攻撃者が用意した掲示板用サーバーが生成するHTMLには、攻撃用スクリプトの在りかと、それをどのように実行させるかを記述した「トリガー用スクリプト」が忍び込まされています。ポイントは、HTMLに直接、攻撃用スクリプトを仕込むのではない点です。トリガー用スクリプトの内容は、「攻撃用サーバー上にあるこのスクリプトを呼び出して実行しろ」というだけのものですから、それが攻撃を意図しているものか否かを判断することは困難です。
スクリプトはプログラム言語ですから、記述しだいでどのような動作をさせることも可能です。XSSによる被害には、サーバー攻撃に加担させる以外にも、ユーザーをフィッシング詐欺用に用意した偽装サイトに誘導したり、ブラウザに残っているプライバシー関連の情報を盗み出したり、といったものがありました。
■ 掲示板の書き込みやつぶやき機能などもターゲット
検索エンジンや掲示板などのサーバーで実行されているWebアプリケーションに脆弱性があったり、入力内容に対する適切なチェック機能がない場合は直接的な攻撃が可能で、これもXSS攻撃の引き金として利用されます。たとえば検索エンジンのキーワード入力欄に攻撃用スクリプトを含んだタグを打ち込むことで、他の利用者のブラウザに目的の動作を行わせる、といったことが可能になります。
今回、Twitterで起こった問題もこのパターンでした。つぶやきの中に特殊な文字列を混入すると、システムのバグによって<a>タグで囲んでいる状態になってしまっていたのです。<a>タグはアンカー(Anchor)の略で、通常はリンク先指定に使うものですが、記述しだいではJava Scriptを動作させることも可能なのです。
また、Twitter公式サイトは「マウスオーバーによるポップアップ機能」を実装していたのですが、これも悪用されました。マウスオーバーとは、タグで指定された部分にマウスカーソルを乗せるだけで、クリックしなくても指定の動作が実行されてしまう機能です。通常はWebアプリケーション側がマウスオーバーで実行される機能を制限するのですが、これもうまく機能していなかったため、XSSが仕込まれたつぶやきにマウスを乗せただけでスクリプトが実行されてしまい、猛烈な勢いで拡散していったというわけです。
XSSへの対策はサーバー側、ブラウザ側ともに進められていて、たとえばInternet Explorerではバージョン8のアップデートパッチによって初歩的な攻撃には対応しています。しかし、ブラウザ側で完全に防ぐには、スクリプトを使用しない以外に手はない、とも言えます。とはいえ、スクリプトを完全に停止してしまうと、たとえばFlashにも対応できなくなるなど、ブラウジングが非常に味気ないものになってしまいます。
対策としては、まずセキュリティソフトを使うことです。これらの多くが、攻撃用サーバーのURIをデータベース化しておき、そこにアクセスしようとした場合にブロックするような機能を備えています。データベースは絶えず更新されていますから、100%とは言わないまでも、かなりの確率で被害を防ぐことができます。
もう一つおすすめしたいのが、スクリプトの実行を能動的に選択できる仕組みです。筆者はメインのブラウザとしてMozilla Firefoxを使っていますが、「No Script」という拡張(アドオン)を使って、基本的にJava Scriptを無効化しています。Flashムービーなど、どうしてもスクリプトが必要な場合にだけ作動を許可することで、セキュリティとリッチコンテンツ閲覧をバランスさせるわけです。これでも完全な対策とは言えませんが、何もしないよりは遥かにマシです。ネット上の安全は、誰かに与えられるものではなく、自らが手間隙かけて初めて実現できるものと考えて、手間をいとわないように心がけていただきたく思います。
著者プロフィール:松田勇治(マツダユウジ)
1964年東京都出身。青山学院大学法学部卒業。在学中よりフリーランスライター/エディターとして活動。
卒業後、雑誌編集部勤務を経て独立。
現在はMotorFan illustrated誌、日経トレンディネットなどに執筆。
著書/共著書/編集協力書
「手にとるようにWindows用語がわかる本」「手にとるようにパソコン用語がわかる本 2004年版」(かんき出版)
「記録型DVD完全マスター2003」「買う!録る!楽しむ!HDD&DVDレコーダー」「PC自作の鉄則!2005」(日経BP社)
「図解雑学・量子コンピュータ」「最新!自動車エンジン技術がわかる本」(ナツメ社)など
TDKは磁性技術で世界をリードする総合電子部品メーカーです