コンピュータプログラムでは、変数は固定サイズのメモリブロックで割り当てられます。 このメモリが割り当てられると、プログラムはこれらの場所からデータを格納および取得できます。 バッファー オーバーフローは、これらのメモリ ブロックの 1 つに書き込まれるデータの量がそのサイズを超えたときに発生します。 その結果、他の目的で割り当てられたメモリが上書きされ、プログラムにさまざまな影響を与える可能性があります。
バッファオーバーフロー攻撃は、ユーザーが制御するデータがメモリに書き込まれるバッファオーバーフローの脆弱性を意図的に悪用する一般的な サイバー攻撃 です。 攻撃者は、割り当てられたメモリ ブロックに収まりきらないほど多くのデータを送信することにより、メモリの他の部分のデータを上書きする可能性があります。
攻撃者は、重要なコードやデータを上書きしてプログラムをクラッシュさせる、実行する悪意のあるコードをプログラムに挿入する、重要な値を変更する、プログラムの実行フローを変更するなど、さまざまな理由でバッファオーバーフロー攻撃を実行できます。
バッファオーバーフロー攻撃は、次のようなさまざまな目的を達成するために使用できます。
バッファオーバーフロー攻撃はいくつかの異なる方法で実行できますが、最も一般的な例には次のようなものがあります。
バッファオーバーフローの脆弱性は C/C++ で一般的であり、プログラムが固定サイズのメモリ チャンクを割り当て、そのメモリにデータを安全にコピーした場合に発生します。 次のコード サンプルには、バッファ オーバーフローの脆弱性が含まれています。
char buf[BUFSIZE]; gets(buf);
このコード サンプルでは、変数 buf のサイズは BUFSIZE に固定されています。 ただし、 gets 関数はデータを読み取り、null ターミネータ (0x00) に達するまで buf 内に格納します。 攻撃者はこれを悪用して、 bufの末尾を超えてデータを上書きする可能性があります。
フォーマット文字列攻撃は、バッファオーバーフローの特殊なケースです。 次のコード サンプルには、書式指定文字列の脆弱性が含まれています。
#include <stdio.h>void main(int argc, char **argv) { printf(argv [1]); }
この例では、プログラムは argv[1] からユーザー指定の入力を受け取り、それを端末に出力します。 しかし、ユーザーの入力に書式指定文字列が含まれている場合、攻撃者はコンピュータ上のメモリを読み取ったり、編集したりする可能性があります。
バッファオーバーフローの脆弱性は、次の方法で防ぐことができます。
バッファオーバーフローの脆弱性を悪用すると、組織のシステム上でプログラムのクラッシュ、データ漏洩、または悪意のあるコードの実行を引き起こす可能性があります。 CloudGuard AppSecがバッファオーバーフロー攻撃やその他の脅威からの保護にどのように役立つかについては、このeBookをご覧ください。次に、 無料のデモにサインアップ して、CloudGuard AppSecがクラウドアプリケーションのセキュリティをどのように向上させるかをご自身でお確かめください。