バッファ オーバーフロー攻撃のしくみ
攻撃者は、バッファ オーバーフローの弱点を突き、入力プロセス用に予約された固定サイズのメモリ バッファをあふれさせることで、実行可能コードを実行します。このコードによって、攻撃者はターゲット コンピュータを乗っ取ったり、そのデータに不正にアクセスできます。
次のプロセスは、スタックベースのバッファ オーバーフロー攻撃を説明したものです。
- 標準のスタック メモリ プロセス - 固定サイズのスタック メモリ オブジェクトは通常は空であり、ユーザからの入力を待っています。プログラムがユーザからユーザ名などの入力を受け取ると、そのデータはスタックの一番上に保管されて、そのデータに戻りアドレスが割り当てられます。このスタックが処理されると、ユーザの入力値はプログラムによって指定された戻りアドレスに送信されます。
- スタックのオーバーフロー - プログラムへの書き込み時には、特定量のメモリ領域がデータ用に予約されます。書き込まれたデータが、メモリ スタック内でそのデータ用に予約された領域より大きい場合は、スタックのオーバーフローが発生します。このことが問題となるのは、攻撃目的の入力を伴う場合のみです。
- オーバーフローの悪用 - プログラムがユーザによるユーザ名の入力を待っている場合に、攻撃者がスタック サイズを超える実行可能なコマンドを入力した場合は、そのコマンドは予約済み領域の外部で保存されます。
- 不正なコードの実行 - このコマンドは、スタック バッファ領域のサイズより大きいという理由だけで、自動的には実行されません。しかし、その不正なコマンドを指す戻りアドレスが攻撃者によって提供された場合は、このコマンドは実行される可能性があります。プログラムは、最初はバッファ オーバーフローが原因でクラッシュしかけますが、攻撃者によって提供された戻りアドレスを使用して回復しようとします。この戻りアドレスが有効なアドレスの場合は、不正なコマンドは実行されます。
- 権限の悪用 - プログラムは通常、カーネル モードで実行されるか、サービス アカウントから継承された権限を使用して実行されるため、この時点で不正なコードは、セキュリティが侵害されたアプリケーションと同じ権限を使用して実行されています。この結果として、攻撃者によってオペレーティング システムが完全に乗っ取られる可能性があります。