C言語で発生し得るバッファオーバーフローと呼ばれる脆弱性について調べたのでまとめてみる。
バッファオーバーフローとは
読んで字の如く,バッファ(メモリ上に確保された領域)からデータがオーバーフロー(あふれる)ことである。
バッファオーバーフローは入力データを検査しないプログラムの脆弱性によって,バッファ領域として設定されているアドレス範囲を超えたメモリが上書きされ,誤動作が引き起こされる。バッファオーバーフローが起きた場合,通常は該当プログラムの動作が不安定になったり停止したりする。しかし,そのようなバグを含むプログラムに対して,意図的に悪意のあるデータを与えることにより,コンピュータの動作を乗っ取ってしまえる可能性が問題となる。
バッファオーバーフローが起きる原因
C言語の標準入出力関数であるgets関数はバッファ長のチェックを行わないで標準入力をバッファに書き込むので,この関数を使う全てのプログラムには,バッファオーバーフローによる不正動作の危険性がある。また使い方が分かりやすいという理由でC言語初心者向けの入門プログラミングでしばしば用いられるscanf関数も書式指定を誤った場合は同じ危険性を持っている。これらの関数を実用的なプログラムで用いる場合には注意が必要である。
具体的な例
- メールアドレスは200文字を超えないだろうと予想して200文字分の領域をバッファとして(char型の変数とかで)用意する。
- ユーザが200文字より長いメールアドレスを入力する。
- プログラムがバッファの大きさをチェックせずに入力データを書き込む。
- バッファとして確保した領域をはみだしてデータが書き込まれてしまう。
これがバッファオーバーフローである。具体的な対策方法としては,コード上でバッファの大きさをチェックして入力データが収まるかどうかを判定してあげるか,そもそもC言語のようなバッファオーバーフローが起こる可能性のある標準入出力関数を持つプログラミング言語を使わないか,ということが挙げられる。