情報セキュリティ

安全なウェブサイトの作り方 - 1.10 バッファオーバーフロー

概要

ウェブアプリケーションを含む、あらゆるプログラムは、指示された処理を行うためにメモリ上に自身が使用する領域を確保します。プログラムが入力されたデータを適切に扱わない場合、プログラムが確保したメモリの領域を超えて領域外のメモリを上書きされ、意図しないコードを実行してしまう可能性があります。このような問題を「バッファオーバーフローの脆弱性」と呼び、この問題を悪用した攻撃を「バッファオーバーフロー攻撃」と呼びます。

  • バッファオーバーフロー

発生しうる脅威

バッファオーバーフローにより、発生しうる脅威は次のとおりです。

プログラムの異常終了
  • 意図しないサービス停止
任意のコード実行
  • ウイルス、ワーム、ボット等への感染、バックドアの設置、他のシステムへの攻撃、重要情報の漏えい 等

注意が必要なウェブサイトの特徴

バッファオーバーフローはC、C++、アセンブラなどの直接メモリを操作できる言語で記述されている場合に起こります。これらの言語を使って開発されたウェブアプリケーションを利用しているサイトは注意が必要です。

現在のウェブアプリケーションのほとんどはPHPやPerl、Javaなどの直接メモリを操作できない言語を使っており、バッファオーバーフローの脆弱性の影響を受ける可能性は低いといえますが、PHPやPerl、Javaのライブラリの中にはバッファオーバーフローの脆弱性が存在していたものがあります。

届出状況

バッファオーバーフローの脆弱性がウェブサイトに見つかったという届出を受けたことはありません。ソフトウェア製品においては、全体の数パーセント程度と多くはありませんが、継続的に届出を受けています。下記は、IPAが届出を受け、同脆弱性の対策が施されたソフトウェア製品の例です。

根本的解決

10-(i)-a 直接メモリにアクセスできない言語で記述する。

ウェブアプリケーションを直接メモリ操作できない言語で記述することで、バッファオーバーフローの脆弱性が作りこまれることを防げます。現在のウェブアプリケーションの多くは直接メモリを操作できない言語(PHP、Perl、Javaなど)で記述されており、これらの言語で作成されたウェブアプリケーションではバッファオーバーフローの問題は発生しません。

10-(i)-b 直接メモリにアクセスできる言語で記述する部分を最小限にする。

プログラムの内部でC、C++、アセンブラなどの直接メモリにアクセスできる言語で記述された独自のプログラムを呼び出す場合は、その呼び出されるプログラムにバッファオーバーフローの脆弱性が存在する可能性があります。この直接メモリ操作可能な言語で記述作成された部分を最小限にし、その部分にバッファオーバーフローの脆弱性がないことを集中的に確認します。

10-(ii) 脆弱性が修正されたバージョンのライブラリを使用する。

一般に流通しているライブラリを使用する場合、古いライブラリの中にはバッファオーバーフローの脆弱性が存在する場合があるので、脆弱性が修正されたバージョンを使用してください。

CWE