web-dev-qa-db-ja.com

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

今日、分散システムクラスで、カーネルによってすべてのユーザーにアドレススペースが割り当てられていることを学びました。ユーザーがsu特権を取得したい場合は、カーネルアドレススペースにシフトする必要があります。

これは、ユーザーが自分のアドレススペースを超えた場合に、カーネルアドレススペースにアクセスしたり、単に上書きしたりできる可能性があるバッファオーバーフロー攻撃の基礎ですか?

3
tsudot

プロセスは、メモリの外部で読み取り、書き込み、または分岐することはできません。つまり、他のプロセスのメモリ、割り当てられていないメモリ、またはカーネルメモリにアクセスできません。したがって、攻撃者がプロセスでバッファオーバーフローをトリガーし、そのプロセスのコンテキストで任意のコードを実行できる場合でも、攻撃者にカーネルレベルのアクセス権を与えることはありません。

1つの方法があります。プロセスはシステムコールを行うことができます。 システムコールが行われる正確な方法 OSとプロセッサの種類によって異なります。最も単純な形式では、プロセッサには「システムコール」命令があります。これは、カーネルがシステムコール処理コードをインストールした特定のアドレスに分岐します。

システムコールが実行されると、プロセッサはメモリへのアクセス許可を変更します。このように、カーネルは、すべてのメモリへの読み取り、書き込み、分岐機能、ハードウェアデバイスへのアクセス機能など、昇格された特権で実行されます。繰り返しになりますが、特権昇格の実行方法の詳細は、特定のプラットフォームでシステムコールがどのように実装されているかに大きく依存します。たとえば、プロセッサが2つのアクセス制御テーブル(1つはユーザースペース用、もう1つはカーネルスペース用)を保持し、システムコール命令がこれら2つのテーブルを切り替える場合があります。

システムコールを処理するカーネルコードは、プロセスに渡された引数をデコードします(引数が渡される方法は、プラットフォームに大きく依存します)。システムコールがこれらの引数を適切に検証する場合があります。たとえば、カーネルが配列引数を予期し、配列全体がプロセスのアドレス空間に収まるかどうかをチェックしない場合、通常のプロセスがカーネルに対してバッファオーバーフロー攻撃を実行し、そのカーネルコードを実行できるようになる可能性があります。選択します。

リモートの攻撃者がカーネルレベルのアクセスを取得するには、通常、ネットワークプロセスとカーネルの2つの脆弱性を悪用する必要があります。カーネルネットワーク処理コードに、ワンステップ攻撃を許可するバグが存在する場合があります。

いいえ。カーネルスペースはほとんどのアーキテクチャでプロセッサによって保護されており、オペレーティングシステムにエラーがない限り、そこに書き込もうとするとプロセスが終了します。

バッファオーバーフロー攻撃は(通常)関数のリターンアドレスを上書きし、攻撃者の手に渡る制御フローを破壊します。

0