課題6:バッファオーバーフローの実験
サンプルプログラム(2)を実行せよ。このプログラムはgets()関数を用いて、標準入力からの入力をバッファにデータを読み込むものであるが、結果を見ると、プログラム中で操作していないバッファdmy[]に値が入ることがある。この原因を考察し、解決策を示せ。また、この問題によって引き起こされるTCP/IP通信におけるセキュリティ上の欠陥はどのようなものが考えられるか、具体例を挙げて述べよ。
BUFLENを5に設定して、プログラムを実行してみた。実行結果を以下に示す。
0:06:/Users/j05059/jikken2/tcpip:%./bufovf
before
buf(Len:0) =
dmy(Len:0) =
warning: this program uses gets(), which is unsafe.
1234567890123456789012345678901234567890
after
buf(Len:40) = 1234567890123456789012345678901234567890
dmy(Len:0) =
Segmentation fault
上記の結果では"Segmentation fault"と表示されているため、dmy[]によけいな値が入っていると考えられる。
この原因はgets()関数を使っているためだと考えられる。gets()関数は配列の長さを指定することができないため、配列以上の文字が入力されるのを防ぐことができず、そのままdmy[]に値を書き込んでしまう。
この解決策は、fgets()関数を使えばよい。fgets()関数は指定した配列より長い値を入力すると、指定したバッファのサイズを超えないように書き込むという特徴があるからである。
バッファオーバーフローによって引き起こされるTCP/IP通信におけるセキュリティ上の欠陥は、バッファオーバーフローを利用すると、引き起こしたプログラムが持っているアクセス権の範囲で任意の動作を行うことが可能となる。ゆえにwebサーバなどの管理者権限を奪われることもある。このような危険をおさえるためにソフトウェアメーカー等から提供される修正プログラムをなるべく速やかに適用することが重要である。
もどる