バッファオーバーフロー攻撃と?
バッファオーバーフローは、攻撃車によって長い間悪用されてきた脆弱性です。
毎日、世界中のハッカーがWebサイト、アプリケーション、さらにはシステムアーキテクチャの新しい脆弱性を発見して悪用しています。
古いものでも新しいものでも、すべてのデバイスに共通することの1つは、メモリに格納されているプログラムによって実行されることです。
ハッカーはこれを悪用し、バッファオーバーフローと呼ばれる脆弱性を発見しました。
これは、新しいものではありませんが、バッファオーバーフロー攻撃と脆弱性がサイバースペースに大混乱をもたらしています。
ここでは、バッファオーバーフロー攻撃とは何か、およびそれらを防ぐ方法について説明します。
2つのメモリ
バッファオーバーフロー攻撃とは何か、そしてそれがどのように機能するかを理解するには、バッファとは何か、そしてコンピュータのメモリがどのように機能するかを知る必要があります。
スタックメモリとヒープメモリは、コンピュータのメモリの2つの主要な機能です。
これらは、メモリ割り当てに使用されるデータ構造です。
それらは似ていますが、スタックメモリとヒープメモリは複数の点で異なります。
後入れ先出し(LIFO)の概念を使用するスタックは、プログラムの実行を一時的に格納するためにRAM(ランダムアクセスメモリ)で使用され、ヒープはグローバル変数への動的割り当てを使用してメモリを割り当てます。
それらに共通しているのはバッファーです。
バッファとは?
バッファは、データをある場所から別の場所に移動するときに、データを格納するために使用されるメモリの領域です。
ほとんどの場合、コンピュータのRAMに格納されます。
これらのデータは通常、実行する必要のあるプログラムです。
バッファはスタックまたはヒープに格納され、データの実行を最適化します。
バッファオーバーフローとは?
バッファオーバーフローは、バッファがストレージ容量を超えるデータを受信したときに発生します。
受信した量のデータを処理できないため、オーバーフローします。
コンピュータのメモリ内で、バッファまたはバッファスペースの直後が、リターンアドレスになります。
このアドレスは、実際には拡張命令ポインタ(EIP)と呼ばれます。
バッファに保持できるよりも多くのデータを受信し、オーバーフローすると、リターンアドレスにオーバーフローします。
これを理解するために、5文字しか保持できないバッファスペースがあると仮定します。
したがって、「sugar」や「peace」などの単語を入力すると、バッファフローにそれを含めることができます。
しかし、「authentication」のような言葉があると、必然的に溢れ出てしまいます。これにより、システムにバグまたはクラッシュが発生します。
ハッカーはこの脆弱性を悪用してバッファオーバーフロー攻撃を開始する可能性があります。
バッファオーバーフロー攻撃は、どのように機能するのか?
バッファオーバーフロー攻撃は、ハッカーがリターンアドレスまたはEIPを制御するときに発生します。
攻撃者がシステムのメモリのサイズを知っている場合、攻撃者は意図的にデータをそのシステムに書き込んでオーバーフローさせることができます。
次に、EIPが、システムへのアクセスを許可したり、システムに保存されている機密情報を明らかにしたりできるプログラムを指すように書き込みます。
攻撃者は、悪意のあるコードを含むデータを書き込んで、バッファをオーバーフローさせる可能性もあります。
次に、システムを悪意のあるコードにリダイレクトするようにEIPが書き込まれ、実行されます。
そして、ハッカーがシステムを制御します。
バッファオーバーフロー攻撃には、次の5つの主要なステップがあります。
- スパイク
- ファジング
- オフセットを見つける
- EIPを上書きする
- 脆弱性の悪用
スパイクは最初のステップです。
ここで、ハッカーは、バッファオーバーフローに対して脆弱なプログラムのメモリの部分を見つけます。
次に、スパイクに似たファジングが発生しますが、ここでは、ハッカーがプログラムに文字を送信して、プログラムが壊れているかどうかを確認します。
成功すると、攻撃者はバッファがオーバーフローした場所であるオフセットの検索に進みます。
これは、バッファのサイズとリターンアドレスを知るために行われます。
次に、ハッカーは悪意のあるシェルコードを挿入し、システムを制御します。
バッファオーバーフロー攻撃の種類
バッファオーバーフロー攻撃には、主にスタックベースの攻撃とヒープベースの攻撃の2種類があります。
1.スタックベースのバッファオーバーフロー攻撃
スタックベースのバッファオーバーフロー攻撃は、最も一般的なタイプのバッファオーバーフロー攻撃です。
これらは、システムのスタックメモリがオーバーランして悪用されたときに発生します。
スタックスマッシングとも呼ばれます。
2.ヒープベースのバッファオーバーフロー攻撃
このタイプのスタックオーバーフローは、実装と活用が難しいため、あまり一般的ではありません。
プログラムに割り当てられたメモリがオーバーフローしたときに発生します。
2021年1月、GoogleはChromeのV8コンポーネントにヒープベースのバッファオーバーフローの脆弱性を発見しました。
バッファオーバーフロー攻撃をどのように防ぐか?
バッファオーバーフロー攻撃は、OSランタイム保護、安全なプログラミング言語、アドレス空間配置のランダム化、および全体的な適切なセキュリティ対策を使用して軽減できます。
1.OSランタイム保護の使用
ランタイム保護は、ランタイム配列境界チェックとも呼ばれます。
これにより、実行されるすべてのプログラムが、使用可能なバッファスペースまたはメモリ内に確実に収まります。
また、システムのメモリに書き込まれたすべてのデータをチェックします。
これにより、ハッカーがシステムにデータを上書きして脆弱性を悪用することが困難になります。
2.安全なプログラミング言語の使用
CやC++のようなプログラミング言語は、システムに書き込まれたすべてのプログラムをチェックするために余分なコードが必要であり、速度が低下するため、ランタイム配列境界チェックを実装していません。
したがって、バッファオーバーフロー攻撃の影響を受けやすくなります。
C#、Java、Pythonなどのより安全な言語を使用すると、バッファオーバーフロー攻撃のリスクが低くなるため、より適切です。
3.アドレス空間配置のランダム化(ASLR)を使用する
このセキュリティ対策により、システムのメモリ内のプログラムと機能のアドレスがさまざまなデータ領域にランダムに割り当てられます。
攻撃者がメモリ内の機密性の高い機能をナビゲートすることを困難にします。
4.厳格なセキュリティポリシーを確保する
これには、システムを定期的に更新し、システムに書き込まれるすべてのデータを検証し、ユーザーに最小限の特権を割り当てることが含まれます。
適切なセキュリティポリシーが設定されていれば、バッファオーバーフロー攻撃について心配する必要はありません。
バッファオーバーフロー攻撃に対抗するには、セキュリティを厳しく保つことが不可欠です。
セキュリティに関する一般的なことわざによると、「システムが人間によって使用されている限り、脆弱性が存在する」ということは真実であり、避けられません。
適切なセキュリティ対策を講じ、厳守することで、攻撃の可能性を常に減らすことができます。