Skip links

バッファオーバーフロー

バッファオーバーフローとは

バッファオーバーフロー攻撃とは、本来上限として想定される長さを超えたデータがバッファに入力され、確保していた領域からあふれてしまうことを指します。

例えば、ヒープ領域上に計算や操作に必要な領域を確保するために、プログラム上で「10バイトの文字列領域」を指定するとします。(例:C言語なら「char s[10];」)。この指定された領域でC言語やC++などのプログラミング言語で書かれたプログラムを利用すると、実は確保された領域以上のデータを入力できてしまうことがあります。

具体的には、10バイトの領域に15バイトのデータを入力できてしまういうことです。またこの指定を超えた15バイトのデータは圧縮され10バイトの領域に詰め込まれるのではなく、余分な5バイトが後ろにあふれてしまいます。このデータのあふれが、エラーにならずに処理されてしまうことをオーバーフローと呼びます。

バッファオーバーフロー攻撃が脆弱性となる理由

プログラムの戻り先が格納されるスタック領域

スタック領域には「プログラムの戻り先」が格納されています。具体的にはプログラムは、OSから順次呼び出されるようになっており、終了したら呼び出し元に戻ることになります。戻り先は呼び出し元のプログラムが指定し、呼び出されたプログラムは初期処理として指定された戻り先をスタック領域コピーします。このような一連の処理がスタック領域の仕組みとなります。

バッファオーバーフロー攻撃が脆弱性となる理由

スタック領域の戻り先を書き換えられることで起きる

さてバッファオーバーフロー攻撃がプログラムの脆弱性になる理由は、データがあふれても格納されてしまうという性質を悪用され、スタック領域内のプログラムの戻り先を書き換えることができるからです。例えば侵入に成功したウィルスソフトやマルウェアを戻り先に指定されると、そのプログラムが終了すると同時にそれらの悪意あるソフトが起動されることになってしまいます。

その結果、システムが誤作動を起こしたりコンピューターが乗っ取られてしまったり、攻撃者が乗っ取たコンピューターを踏み台にまた別のシステムを攻撃するなど被害は多岐にわたります。

対策

開発者側の対策は、バッファオーバーフローを発生させないようなプログラムを開発することです。 入力データの長さチェックをする、書き込み上限バイトや境界をチェックするようなライブラリ関数を利用する(市販のライブラリもあります)、比較的安全と言われているJavaなどの言語に置き換える、などの方法があります。