Part1では,セキュリティ・ホールの定義を説明するとともに,セキュリティ・ホールを攻撃する代表的な手法の一つであるバッファ・オーバーフローについて見ていこう。

 セキュリティ・ホールとは,一般に,OSやアプリケーションにおいて,プログラムの不具合(バグ)や設計ミスが原因で発生するセキュリティ上の欠陥を指す言葉である。単にプログラムの「脆弱性」(vulnerability)と呼ばれることもある。

 ハッカーなどの攻撃者は,セキュリティ・ホールを突いて悪さを試みる。セキュリティについて勉強していく上では避けられない必須といえる存在である。

 一口にセキュリティ・ホールといっても幅広い。先に「セキュリティ・ホールとは,一般に,OSやアプリケーションにおいて,プログラムの不具合(バグ)や設計ミスが原因で発生するセキュリティ上の欠陥を指す言葉である」と述べたが,実はセキュリティ・ホールの原因は必ずしもバグやミスだけではない。

 開発者が意図して作った「仕様」だとしても,それを悪用されてシステムへの侵入を許すような欠陥であれば,やはりセキュリティ・ホールと呼べる。さらに広い意味として,Webサイトの運営者やシステム管理者などの不適切な運用によりセキュリティが維持できなくなっている状態のことや,システムにバックドアを開けてしまうようなセキュリティ意識の低いユーザーのこともセキュリティ・ホールと呼ぶことがある。

 セキュリティ・ホールは,ネットワークにつながるあらゆるハードウエアやソフトウエアに存在する。サーバーやクライアント・パソコンなどのコンピュータはもちろんのこと,ルーターなどのネットワーク機器,携帯電話や情報家電,ゲーム機などにも存在する。

 この講座では,セキュリティ・ホールを攻撃する代表的な手法について紹介していく。取り上げるのは,(1)バッファ・オーバーフロー,(2)SQLインジェクション,(3)クロスサイト・リクエスト・フォージェリ,(4)クロスサイト・スクリプティング,(5)強制ブラウジング――である。

 まずは,代表的なセキュリティ・ホールである「バッファ・オーバーフロー」について解説しよう。攻撃者は,アプリケーションのバグを利用したバッファ・オーバーフローと呼ぶ方法がよく使われる。このバッファ・オーバーフローはアプリケーションの種類にかかわらず,広く生じがちな問題である。

バッファ・オーバーフローのしくみとは?

 それでは,バッファ・オーバーフローを利用して,アプリケーションに想定外の動作をさせるしくみを解説しよう。プログラムは,受け取ったデータを格納するために,バッファと呼ぶメモリー領域を確保する。あらかじめ決められた固定サイズのバッファを用意して,そこに受け取ったデータを書き込むのだ。

 一般に,受け取るデータの長さは可変である。そのため,プログラムは受け取ったデータがバッファのサイズを超えないように,データの長さをチェックすべきである。ところが,アプリケーションの中には,データの長さのチェックを省略している場合がある。

 このようなプログラムに対して,バッファのサイズを超えるデータを送り込むと,当然のようにバッファからデータがあふれる。あふれたデータは,プログラムが使っているほかのメモリー領域中のデータを上書きしてしまう。この結果,プログラムは正常に動作しなくなったり,ハングアップしてしまったりすることになる。

 このようにプログラムの不具合を利用することで,サーバーのプログラムをダウンさせることが可能になる。そうして,サーバーとしての動作を停止させるサービス妨害(DoS:denial of service)攻撃が可能になる。

任意のプログラムを実行させることも

 DoS攻撃によるサービスの停止だけでなく,バッファ・オーバーフローを利用して意図したアクションを実行させるという攻撃も登場してきている。

 プログラムは通常,あるプログラムが別の小さなプログラム(サブルーチン)に処理を依頼するように作られている。このサブルーチンは,コンピュータのメモリー上に一時的に利用するための領域(スタック領域)を確保する。スタック領域には,実際にサブルーチンが処理すべき命令コードや処理対象のデータのほか,前述したバッファや戻りアドレスが書き込まれている。戻りアドレスとは,サブルーチンによる処理が完了したら,元のプログラムへ戻るために利用するメモリーのアドレスである。

 このような状態で,前述のように送り込まれたデータがバッファよりも大きいと,データがあふれてしまい,戻りアドレスが記述されたスタック領域を上書きしてしまうことも可能になる。そこで,図1のように,送り込んだデータのあふれる部分に,戻りアドレスとして別の値を書き込んでおき,書き込まれた戻りアドレスが指定しているメモリー領域には攻撃者が望むようなコマンドを実行する命令コードを記述しておく。すると,攻撃者が送り込んだ不正な命令が実行できるのである。

図1●バッファ・オーバーフローを利用した不正アクセスのしくみ<br>プログラムで想定したバッファよりも大きなデータを送り込み、バッファからデータがあふれるのを利用して、戻りアドレスを書き換える。同時に、書き換えた戻りアドレスの先に命令コードを送り込むことによって、不正な命令を実行させることができる。
図1●バッファ・オーバーフローを利用した不正アクセスのしくみ
プログラムで想定したバッファよりも大きなデータを送り込み、バッファからデータがあふれるのを利用して、戻りアドレスを書き換える。同時に、書き換えた戻りアドレスの先に命令コードを送り込むことによって、不正な命令を実行させることができる。
[画像のクリックで拡大表示]

 この結果,元のプログラムが動作しているのと同じ権限で,任意のコマンドを実行できることになる。プログラムが管理者権限などの強い権限で動いていると,こういった攻撃を受けると直ちに致命的な結果を招く。どのような攻撃も思いのままになるのだ。

 バッファ・オーバーフローを悪用するプログラムの作成には,CPU(中央演算ユニット)やOSに関するそれなりの知識が必要である。だが,専門知識がなくても攻撃コードをとくれるツールが広く出まわっている。このため,だれにでも攻撃ができてしまうのが現実である。