課題6


課題6:バッファオーバーフローの実験 サンプルプログラム(2)を実行せよ。このプログラムはgets()関数を用いて、標準入力からの入力をバッファにデータを読み込むものであるが、結果を見ると、プログラム中で操作していないバッファdmy[]に値が入ることがある。この原因を考察し、解決策を示せ。また、この問題によって引き起こされるTCP/IP通信におけるセキュリティ上の欠陥はどのようなものが考えられるか、具体例を挙げて述べよ。

以下、サンプルプログラムの実行結果

j05014@nw0514:nagata1[50] bufovf
before
buf(Len:0) =
dmy(Len:0) =
warning: this program uses gets(), which is unsafe.
0.333333333333333333333333333333333333333333333333333333333333
3333333333333333333333333333333333333333333333333333333333333
3333333333333333333333333333333333333333333333333333333333333
3333333333333333333333333333333333333333333333333333333333333
after
buf(Len:246) = 0.333333333333333333333333333333333333333333333333
3333333333333333333333333333333333333333333333333333333333333
3333333333333333333333333333333333333333333333333333333333333
3333333333333333333333333333333333333333333333333333333333333
333333333333
dmy(Len:0) =
Segmentation fault
gets()関数が原因でこのような結果となる。この関数は値が許容量を超えて入力されても対応でき無いからだ。fgets()関数を使用すれ ば文字数を指定しての利用が可能となるので問題は解決する


修正プログラム
修正後の実行結果

j05014@nw0514:nagata1[61] ufovf 0.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333
333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
3333333333333333333333333333333333333333333333333333333333333333
after
buf(Len:49) = 0.3333333333333333333333333333333333333333333333
dmy(Len:0) =

セキュリティホールの一つ、バッファオーバーフローが起こった場合別のソフトが起動したりする。オーバーフローのデータの書き込み先により、プログラムが意図してない動作をする可能性があるからだ。修正されたプログラムを利用すれば、ある程度問題の発生を抑えられる。