web-dev-qa-db-ja.com

バッファオーバーフローについての私の理解は正しいですか?

私は、バッファオーバーフローの悪用に関する現在の理解が正しいかどうかをペネトレーションテストして疑問に思っています。 3アドレスの動作アドレス空間、2アドレスの命令空間、および隣接する1アドレス命令ポインタを想定します。

(矢印は命令ポインタの現在位置です。)

==>000x243  
001xFFF

002x26B  
003x4FF  
004x14C  

005x000 (points to address 000 as the next instruction)

バッファオーバーフローにより、操作スペースが4アドレスに置き換えられ、操作スペースへの命令ポインタ呼び出しが操作スペースの1つのアドレスで上書きされ、次に実行されるマシンコードが悪用者の1つになります。選択しますか?ここに示されている:

000x243  
001xFFF

==>002x456 (arbitrary machine code to be executed)  
003xB3B  
004x00F

005x002 (points to address 002 as next instruction)

通常、いいえ、バッファオーバーフローの悪用はコードの上書きではありません。しかし、定義の問題があります。

(「書き込み」の種類の)バッファオーバーフローエクスプロイトは、ターゲットシステムに、書き込み先の領域に収まらない量のデータを書き込ませることができる状況を利用して、RAM =バッファの隣にあり、攻撃者が多かれ少なかれ制御できるデータがあります。古典的なエクスプロイト手法は、上書きされたデータ内にコードへのポインタを見つけることです。 -)ある時点で、ターゲットアプリケーションが続くため、攻撃者はアプリケーションをデレールさせ、RAMの他の場所にある命令を実行する可能性があります。

コードがRAMにある間、すべてではないにしてもほとんどが読み取り専用セクションにあります。オペレーティングシステムは、プラットフォームの [〜#〜] mmu [〜#〜] を使用してこれらのセクションをそのようにマークし、コードを上書きしようとすると、OSカーネルからの例外がトリガーされます。また、一般的なシステムでは、コードセクションとデータセクションはアドレス空間でかなり離れているため、オーバーランを試みるのは困難です。

非常に古典的な状況は、オーバーフローしたバッファがスタック上にある場合です(C用語では「ローカル変数」です)。スタックにはコードへのポインタ、つまり保存された命令ポインタも含まれているためです。 。関数が入力されると、命令ポインタがスタックに保存されるため、関数が戻ると、実行は呼び出しサイトに戻ることができます。したがって、この保存された命令ポインタは、実行のある時点で追跡されるコードポインタであるため、オーバーフローの主なターゲットになります。

もう1つのかなり一般的なケースは、オブジェクト指向開発スタイルをサポートする言語での vtables の使用に関連しています(通常はC++ですが、「オブジェクト指向C」も対象となります)。 Vtablesは、RAM内のテーブルであり、関数へのポインターでいっぱいであり、メソッドが呼び出されたときに追跡されます。このようなポインタは、オーバーフローエクスプロイトの適切なターゲットです( PS3 Jailbreak はそのように機能していました)。


現在、生の命令ではなく、 スレッドコード と呼ばれる特別な形式にコンパイルされている言語があります。スレッド化されたコードは、基本的に、コード(他のスレッド化されたコード、またはネイティブ命令のシーケンス)へのポインターの長い連続です。これは、実行時に建築基準法を受け入れる言語の典型的なものです。つまり、「通訳者」と呼ばれることが多い言語です。そのコンテキストでのバッファオーバーフローは、(スレッド化された)コードの上書きにつながる可能性があります。これは、カーネルとCPUの観点から、スレッド化されたコードはデータであるためです。これは、定義の詳細があなたを噛む可能性がある部分です。


上記のすべては、データがバッファに書き込まれ、そのバッファを通過するオーバーフローに関するものであることに注意してください。 「読み取り」オーバーフローもあり(「オーバーラン」という用語の方が適切かもしれません)、データはソースバッファーを超えて読み取られます(おそらく別のバッファーに書き込まれます)。これにより、シークレットが漏洩したり、アプリケーションが一貫性のないデータを処理したりする可能性があります。結果は、アプリケーションがデータをどのように処理するかによって大きく異なります。これは非常に不便である可能性があります。つまり、攻撃者が暗号化キーやその他の機密データの一部を取得するようなオーバーフローの場合、攻撃者にとって非常に便利です。

2
Tom Leek