ネットワークセキュリティ入門

攻撃方法から学ぶ、自己防衛の方針

last update 2000/9/3

簡易的な攻撃方法の分類

プログラムミス

 さて、先に述べた設定ミスはユーザ、管理者のミスであるが、次に示すのはいわば、ベンダー(プログラマー)のミスである。このミスの内、最も多いと思われるのは「バッファオーバーフロー」と入力文字列制限ミスの2つではないかと思う。前者は主にデーモン攻略に使われ、後者は主にWWW攻略に使われる場合が多い。

 さて、それぞれについて具体的に説明したい。まず、バッファオーバーフローから。

 バッファオーバーフローは、プログラムの仕組みがわからないと理解しづらいと思う。できるだけ感覚的(つまり、正確に言うと違うんだけど、まぁだいたいあっている、と言うような文章となる)に書いてみたい。

 入力した文字をそのまま画面に出力するプログラムを作り、実行したとする。実行時、もちろん文字を入力するわけだが、入力された文字は一般的にバッファと呼ばれる場所に保存される。そして、(ここが重要なのだが)バッファの後ろの方には、大抵「次の命令が書いてある場所を示すデータ」を保存した箇所があるのだ。

 さて、何文字まで入力してよいことにしようか。80文字としておこう。このため、バッファは80文字分確保しておく事にする。さて、ここで本来は80文字以上入力しようとした場合に、「80文字を超えました」や「エラーです」などといった処理(80文字以上は例外的な状態であり、これを処理するので例外処理という)を行わないといけない。

 ところが、比較的多くのプログラムがこの処理を怠っている。この結果、80文字どころか200、300、1000文字入力してもそのままバッファに入れようとする事になる。

 思い出して欲しい。バッファの後ろには「次の命令がおいてある場所」が書いてある。これも書き換えてしまうのだ。そうすると、プログラムは本来次の命令にいくはずが「あられもない場所の命令」を実行しようとして、おかしくなってしまう。これがバッファオーバーフローである。

 さて、ここからが重要である。大量の文字を入力する事で、「次の命令がおいてある場所」を書き換えてしまうのだが、その場所をうまく書き換えたらどうだろう。次の命令がおいてある場所を「大量の文字が入力された場所」にしたら。そして、その入力された文字というのが、実はプログラムだったら。

 そう。入力された文字(=プログラム)が実行される。そのプログラムが、もしハードディスクの中身を全部消去するプログラムだったら。もし、かってにユーザ(つまり攻撃者の名前)を追加し、攻撃者がいつでもログイン可能な状態になったとしたら。まさにゲームオーバーである。

 これが、(正確にはちょっと違うが)バッファオーバーフローを利用した攻撃である。

 さて、具体的なバッファオーバーフロー攻撃の内、既に書籍などで広く知られているものを紹介する。これは、sendmailという、メールを配送するデーモンに存在する(新しいバージョンのものは当然修正されている)。sendmailにはVRFYというコマンドがあり、これはメールアドレスが合っているかどうか(正確にはhoge@hugaのhogeの方が合っているかどうか)確認するためのものである。が、これに上記のようなバッファオーバーフローが存在しているため、攻撃者は任意のコマンドを実行することが可能だったのである。

 しかも、sendmailはroot権限で実行されているため、sendmailから(図らずも)実行されたコマンドはroot権限で実行されるようになっている。つまり、なんでもありである。もし、現代にこの問題を抱えたメールサーバがあるとすれば、攻撃者はそのメールサーバにおかれた、メールの内容をすべて読むことも、書き換えることも可能となるのである。

 防御方法としては、まず、必要のないものは使わない、と言うことだろう。あらゆるプログラムにはバグはつきものであるが、使っているソフトが少ないほど、コンピュータ内のバグは少なくなるため、それを利用した攻撃はやりにくくなるからだ。

 さらに、使う(使わざるを得ない)場合にはできるだけ新しいものを使う必要がある。過去に見つかった、そういった不具合を修正してあるからだ。アップデートが面倒だからと言ってほったらかしにしてはいけない。攻撃者の思うつぼである。

 ここでは、ファイアウォールはほとんど役に立たない、と言ってよい。IDS(侵入検知システム)は、これらの攻撃を検知することはできる。しかし、攻撃を防ぐことはできない。


 次に入力文字列制限ミスについて。入力文字長の制限ではない。

 これも具体的な事例を述べる。有名な(ただし古い)攻撃方法である、phf攻撃を紹介する。これは、WWWサーバの拡張機能である、CGI用スクリプトの不具合を利用した攻撃である。

 CGIとは、WWWを見ている人が入力した内容を元にプログラムを実行し、答えをWWWブラウザに出力したりする機能である。例えば、「あなたは?人目の訪問者です」とWWWページに書いてあるところがあるが、これはCGIを利用している。

 その機能の中にphfと呼ばれる機能があったのだが、このスクリプト、ユーザの入力した内容を確認せずに実行してしまうのである。具体例はこうである。

 http://www.manuke.com/cgi-bin/pgf?Qalias=x%0a/bin/cat%20/etc/passwd

 ここで、%20とはスペースのこと、%0aとは改行のことである。つまり、phf?Qalias=xまでを実行すればよいのに、その後改行して、/bin/cat /etc/passwdも実行し、WWWブラウザにその出力を表示してくれるのである。さぁ、パスワードファイルの入手ができた、あとは思いのままだ、という結果になる。

 このプログラムの作者が%0a以降を無視するようにプログラムを書いていたらそんなことにはならなかった。が、文字(ここでは%0a=改行)を制限しなかったためにこのようなセキュリティ上の問題が起きてしまう。

 さて、対処方法だが、先のバッファオーバーフローと同じである。「ファイアウォールでは8割方防げない」。いろいろなサービス、プログラム。これらを使わないでよければ使わない、使うのならば最新のものを。これに尽きるのだ。

 
前に戻る目次に戻る次に進む