課題6:バッファオーバーフローの実験


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

【修正前の実行結果】


BUFLENを5にして実行した。
st-NEET:~/report/jikken/nagata j05043$ buff
before
buf(Len:0) = 
dmy(Len:0) = 
warning: this program uses gets(), which is unsafe.
213456745869706543213145678908765432134567890887654321343567890098765432113456789
after
buf(Len:81) = 213456745869706543213145678908765432134567890887654321343567890098765432113456789
dmy(Len:0) = 
Segmentation fault
dmyに"Segmentation fault"が出ていることから、dmyによけいな値が入っていると考えられる。

【修正後の実行結果】


fgets()は読み込むデータのサイズを指定できるため、gets()ではなくfgets()を用いることにする。
st-NEET:~/report/jikken/nagata j05043$ cc -o bufovf buff2.c
st-NEET:~/report/jikken/nagata j05043$ buff2
before
buf(Len:0) = 
dmy(Len:0) = 
1234567890-987654321234567890987654321
after
buf(Len:4) = 1234
dmy(Len:0) =
修正後のソース

【セキュリティ上の欠陥について】


バッファオーバーフローとは、確保したメモリ領域(バッファ)を超えてデータが入力された場合に、データがあふれてプログラムが暴走してしまうことである。これを利用して、バッファに対して許容量を超えるデータを送り付けることで、システムの機能停止にしたり、意図的にバッファをオーバーフローさせ、あふれ出たデータを実行されてしまう。これは、バッファオーバーフローが最も代表的なセキュリティ・ホールである為、これがそのままTCP/IPのセキュリティ欠陥となってしまう。