ポイント

●バッファ・オーバーフローとは,プログラマが想定していたサイズを超えるデータを特定のメモリー領域にコピーしたときに起こり,ほかのメモリー領域を破壊する状態のことを指す。原因は,プログラムのミス(バグ)であることが多い
●攻撃者はオーバーフローする部分に悪さをするコードを埋め込んでおく
●ユーザー(利用者)は,セキュリティ・パッチが出たら早めに適用するように習慣づけておくことが必要

 脆弱性とは,システムが持つセキュリティ上の欠陥や問題点のことです。パスワードなど,ターゲットに直接侵入するための情報が入手できない場合には,第4章でこれまで勉強してきたような情報収集手法を用いてターゲットの脆弱性を調査し,攻撃します。

 脆弱性といっても,いろいろなものがありますが,今回は主にOSの脆弱性であるバッファ・オーバーフローを勉強します。攻撃者はOSのプログラム・ミス=バグを利用して,悪意のコード(プログラム)をターゲット・マシン上で動作させることにより,何らかの利益を享受しようとします。

バッファオーバーフローの原理

 最初に,オーバーフローと呼ばれる状況について確認しておきましょう。

 コンピュータの核となるCPUが動作するためには,記憶領域(メモリー)が必要です。CPUはメモリー領域の任意の部分にアクセスする必要があるため,メモリー領域にはそれぞれ番地(アドレス)が振られています。プログラム自体や,プログラムが動作するときに使う変数領域も,メモリー領域上に確保されます。

 プログラミング言語によっては,プログラマが変数のサイズを指定しないでも済むようにしている場合もありますが,多くのプログラミング言語はサイズを指定する必要があります。例えばC言語でプログラムを書く場合には,プログラマはあらかじめ変数に必要な大きさを見積もって,型を宣言することで適切なメモリー領域を確保します。ここで,確保した領域を超えるデータが入力されると「オーバーフロー」が発生します。具体的に見ていきましょう。

 図1は,デバッガを使ってテスト用のプログラムを動作させ,その実行中のメモリー内を見たところです。buffer_Yという名前の変数が12ff78番地(16進数表記:以下同様)から12ff7b番地まで4バイト,buffer_Zという名前の変数が,続く12ff7c番地から12ff7f番地まで4バイト確保されています。まだこの段階では,データは何も格納されていないため,変数領域の中身は空になっています。

図1●メモリー上に変数領域が確保されている様子
図1●メモリー上に変数領域が確保されている様子
buffer_Yが12ff78~12ff7bに番地に,続く領域にはbuffer_Zが配置されている。