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

コンピュータプログラムでは、変数は固定サイズのメモリブロックで割り当てられます。 このメモリが割り当てられると、プログラムはこれらの場所からデータを格納および取得できます。 バッファー オーバーフローは、これらのメモリ ブロックの 1 つに書き込まれるデータの量がそのサイズを超えたときに発生します。 その結果、他の目的で割り当てられたメモリが上書きされ、プログラムにさまざまな影響を与える可能性があります。

eブックをダウンロード(英語) デモをリクエストする

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

バッファオーバーフロー攻撃

バッファオーバーフロー攻撃は、ユーザーが制御するデータがメモリに書き込まれるバッファオーバーフローの脆弱性を意図的に悪用する一般的な サイバー攻撃 です。 攻撃者は、割り当てられたメモリ ブロックに収まりきらないほど多くのデータを送信することにより、メモリの他の部分のデータを上書きする可能性があります。

攻撃者は、重要なコードやデータを上書きしてプログラムをクラッシュさせる、実行する悪意のあるコードをプログラムに挿入する、重要な値を変更する、プログラムの実行フローを変更するなど、さまざまな理由でバッファオーバーフロー攻撃を実行できます。

バッファ オーバーフローの脅威

バッファオーバーフロー攻撃は、次のようなさまざまな目的を達成するために使用できます。

  • Denial of Service (DoS) Attacks: アプリケーションのメモリ空間内には、ポインター、コード、およびプログラムの実行に不可欠なその他のデータがあります。 このデータを上書きすると、プログラムがクラッシュし、DoS攻撃が発生する可能性があります。
  • コードの実行: バッファオーバーフローのエクスプロイトの一般的な目的は、脆弱なアプリケーションに攻撃者が提供したコードを強制的に実行させることです。 これにより、攻撃者は、悪用されたアプリケーションと同じアクセスとアクセス許可を使用して、影響を受けるシステムでコードを実行できます。
  • アクセス制御バイパス: バッファオーバーフローを悪用してコードを実行すると、攻撃者が標的のシステムにアクセスできるようになる可能性があります。 この拡張されたアクセスは、後続の攻撃を実行するために使用される可能性があります。

バッファオーバーフロー攻撃の種類

バッファオーバーフロー攻撃はいくつかの異なる方法で実行できますが、最も一般的な例には次のようなものがあります。

  • スタックベースのバッファオーバーフロー: プログラム スタックには、アプリケーションの重要な制御フロー データ (関数の戻りポインターなど) が含まれており、バッファー オーバーフロー攻撃の一般的なターゲットです。 リターン ポインターを上書きすると、プログラムは攻撃者が制御するデータにジャンプしてコードとして実行し、攻撃者がアプリケーションと同じアクセス許可でコードを実行する可能性があります。
  • ヒープベースのバッファオーバーフロー: プログラム・ヒープは、プログラムのコンパイル時にサイズが定義されていない変数にメモリーを動的に割り当てるために使用されます。 バッファオーバーフローの脆弱性を悪用し、システムヒープをフラッディングさせることで、攻撃者は重要なアプリケーションデータを上書きする可能性があります。
  • フォーマット文字列攻撃: C/C++ の printf ファミリの関数では、メモリの読み取りと書き込みを可能にする書式指定文字列を使用できます。 ユーザー指定のデータが書式指定文字列として解釈される場合、機密性の高い値を漏洩または変更するために使用できます。

バッファ オーバーフロー攻撃の例

バッファオーバーフローの脆弱性は 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] からユーザー指定の入力を受け取り、それを端末に出力します。 しかし、ユーザーの入力に書式指定文字列が含まれている場合、攻撃者はコンピュータ上のメモリを読み取ったり、編集したりする可能性があります。

バッファオーバーフローを防ぐ方法

バッファオーバーフローの脆弱性は、次の方法で防ぐことができます。

  • 入力検証の実行: バッファ オーバーフローの脆弱性は、プログラムがユーザー指定の入力について、これらの仮定を検証せずに仮定した場合に発生します。 データの長さを確認したり、特定のバイト数だけをメモリ位置にコピーしたりすると、バッファオーバーフローを回避できます。
  • ランタイムメモリ保護の有効化: ほとんどのコンピューターには、アドレス空間レイアウトのランダム化 (ASLR)、データ実行防止 (DEP)、構造化例外処理の上書き保護など、バッファー オーバーフローに対する保護機能が組み込まれています。 これらの保護を有効にすると、バッファオーバーフロー攻撃の実行がはるかに困難になります。
  • 脆弱な機能の回避: バッファオーバーフローは、C/C++ の gets、scanf、strcpy などの脆弱な関数によって可能になります。 バッファオーバーフローの脆弱性は、これらの関数の安全なバージョンを適切に使用することで回避できます。
  • メモリセーフ言語の使用: バッファオーバーフローは、固定サイズの変数を持ち、メモリ保護がないプログラミング言語で発生します。 Python、Java、C# などの他のプログラミング言語を使用すると、バッファー オーバーフローが困難または不可能になります。
  • 脆弱性の悪用の防止: Webアプリケーションファイアウォール (WAF)と WebアプリケーションおよびAPI保護 (WAAP)ソリューションは、バッファオーバーフローの脆弱性の悪用の試みを特定してブロックできます。 これにより、バッファ・オーバーフロー攻撃が企業の アプリケーション・セキュリティ (AppSec)にもたらすリスクが軽減されます。

CloudGuard AppSecによるバッファオーバーフロー保護

バッファオーバーフローの脆弱性を悪用すると、組織のシステム上でプログラムのクラッシュ、データ漏洩、または悪意のあるコードの実行を引き起こす可能性があります。 CloudGuard AppSecがバッファオーバーフロー攻撃やその他の脅威からの保護にどのように役立つかについては、このeBookをご覧ください。次に、 無料のデモにサインアップ して、CloudGuard AppSecがクラウドアプリケーションのセキュリティをどのように向上させるかをご自身でお確かめください。

×
  フィードバック
このWebサイトは、機能性と分析およびマーケティングの目的でCookieを使用しています。Webサイトを引き続きご利用いただくことで、Cookieの使用に同意したことになります。詳細については、Cookieに関する通知をお読みください。
OK