2009-10-15

Chaotic Next Stage                       第8号

                                                  発行責任者  稲崎義明

脆弱性とは(2)

 

実際に乗っ取る方法についてですが、Webページや文書ファイルの処理されるデータ(あくまでデータです、プログラムではありません)に細工をすることによって、そのデータを下のプログラムの一部として実行させることによって乗っ取ることになります。つまり、データのはずのものをプログラムの一部とご認識してしまうことになります。もちろん通常はありえない動作ですが、プログラムに脆弱性があった場合、可能になってしまいます。

もう少しその手口について見てみましょう。これだけでは、なんでそうなるのかがわからないでしょうから。まずはバッファオーバーフローという脆弱性の場合です。その前提として、普通のプログラムの動作を理解する必要があります(プログラムの動作がわからないと、この後理解できないかもしれませんので)。まず、プログラムを実行(たとえばダブルクリックして)すると、プログラムはパソコンのメモリ上に読み込まれます。読み込まれた領域を「プログラム領域」、プログラムがデータとして利用する領域を「データ領域」として確保されます。このデータ領域に、プログラムが読み込んだデータや、プログラムに必要なデータ(アドレス)などが一時的に保存されます。また、プログラムにはプログラムの本体であるメインルーチンとデータの読み込みといった特定の処理を行う場合に使用するサブルーチンというものがあります。実際のプログラムの実行は読み込まれた先頭から順に実行され、必要に応じてサブルーチンが呼び出されるのですが、このサブルーチンを読み出す場合、そのサブルーチンから戻る場所のアドレス(戻り先アドレス)をまずデータ領域に保存します。サブルーチン内の処理を実行し、処理を終えるとデータ領域に保存した「戻り先アドレス」を読み出して、プログラムの元の場所に戻り、続きを実行することになります。

問題が無ければこのような動きをするはずなのですが、「バッファオーバーフロー」に脆弱性があり、この点を突いたウィルスが感染した場合は、別の動きをしてしまいます。脆弱性がある場合、入力データを適切にチェックしないために、プログラムがサブルーチンでジャンプした場合の戻り先アドレスを、入力データで上書きされてしまう可能性があるということになります。入力データを保存するための領域(バッファー)からデータがあふれ出し(オーバーフロー)、戻り先アドレスを格納した領域を“侵食”することになり、これを「バッファオーバーフロー」といいます。この脆弱性を突く場合、攻撃者はウィルスおよびウィルスが格納されている場所の先頭アドレスを含むデータを読み込ませます。この読み込ませ方に工夫をすることによって、プログラムの開発者の想定したデータ領域からあふれ出させ、プログラムが一時保存した「戻り先アドレス」を「ウィルスの先頭アドレス」で上書きさせます。そうなると、サブルーチンの処理が終わったプログラムは「ウィルスの先頭アドレス」を、戻り先アドレスと勘違いして、データ領域中のウィルスを実行してしまうことになります。ではどのような工夫でデータをあふれ出させるかです。プログラムの開発者は取り扱うデータを想定し、それ以外のデータを受け取らないようにしているのですが、それが十分でない(脆弱性)場合、想定外のデータ(たとえば非常に長いデータ)を読み込ませることによって、バッファはオーバーフローしてしまうことになります。しかし、脆弱性を利用してウィルスを実行させるには、対象とするプログラムや脆弱性の詳細を知らなければまず不可能です。ウィルスを実行させるために読み込ませるデータには、プログラム部分とそのアドレスに間違ってジャンプさせるなどいろいろな工夫が必要ということになります。       (次回へ続く)