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

バッファにデータを書き込むプログラムがそのバッファの容量をオーバーロードすると、バッファオーバーフローが発生します。12オンスの牛乳を8オンスのグラスに注ぐようなものです。

学習目的

この記事を読み終えると、以下のことができるようになります。

  • バッファの定義
  • バッファオーバーフローと、それがサイバー攻撃でどのように使用されるかを説明
  • 誰が最も脆弱で、バッファオーバーフロー攻撃から保護する方法を理解

関連コンテンツ


さらに詳しく知りたいとお考えですか?

是非、Cloudflareが毎月お届けする「theNET」を購読して、インターネットで最も人気のある洞察をまとめた情報を入手してください!

当社がお客様の個人データをどのように収集し処理するかについては、Cloudflareのプライバシーポリシーをご確認ください。

記事のリンクをコピーする

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

バッファオーバーフローは、ソフトウェアがバッファにデータを書き込むとバッファの容量がオーバーフローし、隣接するメモリ位置が上書きされるときに発生する異常です。つまり、十分なスペースのないコンテナに渡される情報が多すぎて、その情報が隣接するコンテナのデータを置き換えてしまうことです。

バッファオーバーフローは、コンピューターのメモリを変更してプログラムの実行を妨害または制御することを目的とした攻撃者によって悪用される可能性があります。

バッファオーバーフロー

バッファとは?

バッファ(データバッファ)は、ある場所から別の場所に移動している間にデータを一時的に保存するために使用される物理的なメモリストレージの領域です。これらのバッファは通常、RAMメモリに存在します。コンピューターは頻繁にバッファを使用してパフォーマンスを向上させます。最新のハードドライブのほとんどは、バッファリングを利用してデータに効率的にアクセスし、多くのオンラインサービスもバッファを使用しています。たとえば、バッファは、中断を防止するためにオンライン動画ストリーミングで頻繁に使用されます。動画がストリーミングされると、動画プレーヤーはおそらく動画の20%を一度にダウンロードしてバッファに保存し、そのバッファからストリーミングします。こうすることで、接続速度のわずかな低下やサービスの迅速な中断は、動画ストリームのパフォーマンスに影響しません。

バッファは、特定の量のデータを含むように設計されています。バッファを使用するプログラムに、大量のデータがバッファに送信されたときにデータを破棄する組み込み命令がない限り、プログラムはバッファに隣接するメモリ内のデータを上書きします。

バッファオーバーフローは、攻撃者がソフトウェアを破壊するために悪用される可能性があります。十分に理解されているにもかかわらず、バッファオーバーフロー攻撃は依然としてサイバーセキュリティチームを苦しめる大きなセキュリティ問題です。2014年、「ハートブリード」として知られる脅威は、SSLソフトウェアのバッファオーバーフローの脆弱性のために、何億人ものユーザーを攻撃にさらしました。

攻撃者はどのようにバッファオーバーフローを悪用しますか?

攻撃者は慎重に作成された入力をプログラムに意図的に送り込み、プログラムが十分に大きくないバッファーにその入力を保存しようとし、バッファスペースに接続されたメモリの一部を上書きします。プログラムのメモリレイアウトが適切に定義されている場合、攻撃者は実行可能コードを含むことがわかっている領域を意図的に上書きできます。その後、攻撃者はこのコードを独自の実行可能コードに置き換え、プログラムの動作方法を大幅に変更できます。

たとえば、メモリ内の上書きされた部分にポインタ(メモリ内の別の場所を指すオブジェクト)が含まれる場合、攻撃者のコードはそのコードをエクスプロイトペイロードを指す別のポインタに置き換えることができます。これにより、プログラム全体の制御を攻撃者のコードに移すことができます。

バッファオーバーフロー攻撃に対して脆弱なのは誰ですか?

特定のコーディング言語は、他のコーディング言語よりもバッファオーバーフローの影響を受けやすくなっています。 CとC++は、メモリ内のデータへのアクセスや上書きに対する保護が組み込まれていないため、脆弱性の高い2つの一般的な言語です。 Windows、Mac OSX、およびLinuxにはすべて、これらの言語の一方または両方で記述されたコードが含まれています。

Java、PERL、C#などの最新の言語には、バッファオーバーフローの可能性を減らすのに役立つ組み込み機能がありますが、それを完全に防止することはできません。

バッファオーバーフロー攻撃から保護する方法

幸いなことに、最新のオペレーティングシステムには、バッファオーバーフロー攻撃の軽減に役立つランタイム保護があります。悪用のリスクを軽減するのに役立つ次の2つの一般的な保護について調べてみましょう:

  • アドレス空間のランダム化 - プロセスの主要なデータ領域のアドレス空間の位置をランダムに再配置します。バッファオーバーフロー攻撃は一般に、重要な実行可能コードの正確な場所を知ることに依存していますが、アドレススペースのランダム化はそれをほぼ不可能にします。
  • データ実行防止 - メモリの特定の領域を実行可能または非実行可能としてマークし、実行不可能な領域で発見されたコードを悪用で実行するのを防止します。

ソフトウェア開発者は、組み込みの保護機能を備えた言語で記述したり、コードで特別なセキュリティ手順を使用したりすることにより、バッファオーバーフローの脆弱性に対する予防措置を取ることもできます。

予防措置にも関わらず、開発者は新しいバッファオーバーフローの脆弱性を発見し続けており、悪用の成功によって気付く場合もあります。新しい脆弱性が発見された場合、エンジニアは影響を受けるソフトウェアにパッチを適用し、ソフトウェアのユーザーがパッチにアクセスできるようにする必要があります。

バッファオーバーフロー攻撃にはどのようなタイプがありますか?

さまざまな戦略を採用し、さまざまなコードを標的とするさまざまなバッファオーバーフロー攻撃があります。以下は最も有名なもののいくつかです。

  • スタックオーバーフロー攻撃 - これは最も一般的なタイプのバッファオーバーフロー攻撃であり、コールスタック*のバッファのオーバーフローを伴います。
  • ヒープオーバーフロー攻撃 - このタイプの攻撃は、ヒープ*と呼ばれるオープンメモリプール内のデータを標的にします。
  • 整数オーバーフロー攻撃 - 整数オーバーフローでは、算術演算の結果、整数を格納する整数型(整数)には大きすぎる整数になります。これにより、バッファオーバーフローが発生する可能性があります。
  • ユニコードオーバーフロー - ユニコードオーバーフローは、ASCII文字を予期する入力にユニコード文字を挿入することにより、バッファオーバーフローを作成します。(ASCIIとユニコードは、コンピューターがテキストを表すことができるエンコード標準です。たとえば、文字「a」はASCIIの数字97で表されます。ASCIIコードは欧米言語の文字のみを対象としていますが、ユニコードは地球上のほぼすべての言語の文字を作成できます。ユニコードには非常に多くの文字が使用できるため、多くのユニコード文字は最大のASCII文字よりも大きくなります。)

*コンピューターは、スタックとヒープとして知られる2つの異なるメモリ割り当てモデルに依存しています。どちらもコンピューターのRAMにあります。スタックはきちんと整理されており、データを後入れ先出しモデルで保持します。一番最近にスタックに配置されたデータが最初に出てきます。これは、弾薬弾倉に挿入された最後の弾丸が最初に発射されるようなものです。ヒープは、余分なメモリの無秩序なプールであり、データは特定の順序でヒープに出入りしません。スタックからメモリにアクセスする方がヒープからアクセスするよりもはるかに高速であるため、通常、ヒープはより大きなデータまたはプログラマが明示的に管理したいデータ用に予約されています。