「セキュリティに対する重要性は理解したけれど、用語が難しくて」という声を聞くことがよくあります。そんな方にセキュリティの頻出用語を解説します。今回は、「バッファオーバーフロー」についてです。
バッファオーバーフロー(buffer overflow)は、読んで字のごとく、「buffer(バッファー)」が、「overflow (あふれ出す)」ことをさし、メモリー領域を破壊すること、あるいはそれに従って予期しない動作が起きることをさします。
脆弱性に関するニュースに、「悪意のあるコードが実行される可能性がある」といった報道がなされていることに気がつくことも多いでしょう。このようなセキュリティホールとして、利用される割合が高いものの1つが、バッファオーバーフローです。バッファオーバーランと呼ばれることもあります。
C/C++言語などで開発したプログラム内であらかじめ確保しているメモリー領域のことをバッファと呼びます。バッファには大きく3つの領域があります。実行命令が格納されているコード領域、プログラム実行のための一時的な情報が格納されているスタック領域、計算や操作のためのデータを格納するヒープ領域の3つです。バッファオーバーフローは、このバッファの大きさを超えるデータを送り込み、データをそのバッファから“あふれ”させ、システム上で悪意のあるプログラムを実行させることをいいます。例えば、システム上にある重要な情報を盗んだりするプログラムを実行させることが可能です。バッファオーバーフローを利用して、サイバー攻撃を行うことをバッファオーバーフロー攻撃といいます。
バッファオーバーフロー脆弱性対策には多くのものが考案されています。まず、アプリケーション開発側で、セキュアな(安全な)プログラミングを実施することが重要です。バッファオーバーフロー対策がなされたC/C++以外の言語を利用して開発することも一つの方策です。しかし別の言語を使ってもすべての問題を解決できるわけではありません。多くの言語がCのライブラリに依存していたりするからです。
また、現実的にすべてのアプリケーションをC/C++以外の言語で開発することは難しいものです。
C/C++で開発する場合は、『セキュア・プログラミング講座:C/C++言語編』(独立行政法人 情報処理推進機構)を参考にすることも役に立ちます。このドキュメントでは開発工程の中のタイミング別に、次のような対策を紹介しています(詳しくはリンク先をご確認ください。)
- ソースコード記述時の対策
領域あふれを未然に防ぐように配慮してソースコードを記述する対策です。 - ソースコードの静的検査
ソースコードを領域あふれ等の観点から検査し、 造り込まれた脆弱性を最も早期に見つけ出す対策です。 - あふれを検出するデバッグ
プログラムのデバッグの際に領域あふれの問題を見つける対策です。 - 運用環境における防御
プログラムのリリース後に、 ソフトウェアの運用環境の機能を利用してバッファオーバーフロー攻撃を阻止するものです。
利用者サイドのバッファオーバーフロー対策としては、まずソフトウェアベンダーから提供される修正パッチを速やかに適用し、最新の状態を維持することが重要です。