Heap Overflow
基本情報
ヒープオーバーフローは、ヒープ内でのスタックオーバーフローのようなものです。基本的には、ヒープにデータを格納するためのスペースが予約されており、格納されたデータが予約されたスペースよりも大きかったことを意味します。
スタックオーバーフローでは、スタックから命令ポインタやスタックフレームなどの一部のレジスタがスタックから復元されることがわかっており、これを悪用する可能性があります。ヒープオーバーフローの場合、ヒープチャンクにはデフォルトで保存されている機密情報はありません。ただし、機密情報やポインタが含まれる可能性があるため、この脆弱性の重大性は、どのデータが上書きされるかと攻撃者がこれをどのように悪用できるかに依存します。
オーバーフローのオフセットを見つけるためには、スタックオーバーフローと同じパターンを使用できます。
スタックオーバーフロー vs ヒープオーバーフロー
スタックオーバーフローでは、脆弱性がトリガーされる時点でスタックに存在するデータと配置がかなり信頼できます。これは、スタックがリニアであり、常に増加しているため、プログラムの実行中にスタックメモリの特定の場所には通常同様のデータが格納され、各関数が使用するスタック部分の末尾にいくつかのポインタがあるという特定の構造があるためです。
しかし、ヒープオーバーフローの場合、使用されるメモリはリニアではなく、通常はメモリの別々の位置に割り当てられたチャンクがあるため(隣接しているわけではない)、サイズによって割り当てられたビンやゾーンによって割り当てられた前の解放されたメモリが使用されるため、ヒープオーバーフローに対して脆弱なオブジェクトがどのように衝突するかを把握するのは複雑です。したがって、ヒープオーバーフローが見つかった場合、望ましいオブジェクトがオーバーフローの対象となるオブジェクトの隣になるようにする**信頼性のある方法を見つける必要があります。
これに使用されるテクニックの1つがHeap Groomingであり、たとえばこの投稿で使用されています。この投稿では、iOSカーネルでメモリを格納するためのゾーンがメモリ不足になると、カーネルページが拡張され、このページが期待されるサイズのチャンクに分割され、これらのチャンクが順番に使用されます(iOSバージョン9.2まで、その後、これらのチャンクはこれらの攻撃の複雑化を困難にするためにランダムな方法で使用されます)。
したがって、ヒープオーバーフローが発生する前述の投稿では、オーバーフローしたオブジェクトが衝突するように強制するために、複数のスレッドによって複数の**kallocs
が強制され、すべての空きチャンクが埋められ、新しいページが作成される**ようにします。
特定のサイズのオブジェクトでこの埋め込みを強制するために、iOS machポートに関連付けられたアウトオブラインの割り当てが理想的な候補です。メッセージのサイズを作成することで、kalloc
の割り当てサイズを正確に指定し、対応するmachポートが破棄されると、対応する割り当てがすぐにkfree
に戻されます。
その後、これらのプレースホルダーのいくつかを解放できます。kalloc.4096
のフリーリストは、最後に追加されたものが最初に解放される順序で要素を解放します。つまり、いくつかのプレースホルダーが解放され、エクスプロイトがオーバーフローの対象となるオブジェクトを割り当てようとする間に複数の被害者オブジェクトを割り当てようとする場合、このオブジェクトが被害者オブジェクトに続く可能性が高いです。
libcの例
このページでは、次のチャンクの前の使用中ビットと前のサイズの位置を上書きすることで、使用中のチャンクを統合(未使用と見なすことで)し、それを再度割り当てして、異なるポインタで使用されているデータを上書きできることを示す基本的なヒープオーバーフローエミュレーションが示されています。
protostar heap 0からの別の例では、ヒープオーバーフローを悪用してwinner関数を呼び出してフラグを取得するCTFの非常に基本的な例が示されています。
protostar heap 1の例では、バッファオーバーフローを悪用することで、ユーザーからの任意のデータが書き込まれるアドレスに近いチャンクを上書きすることが可能であることが示されています。
ARM64の例
https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/のページでは、実行されるコマンドがオーバーフローしたチャンクからの次のチャンクに格納されるヒープオーバーフローの例が示されています。そのため、簡単なエクスプロイトでそれを上書きして実行されるコマンドを変更することが可能です。
Last updated