Heap Overflow
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
ヒープオーバーフローはスタックオーバーフローのようなもので、ヒープ内で発生します。基本的には、ヒープ内にデータを保存するためのスペースが予約されており、保存されたデータが予約されたスペースよりも大きいことを意味します。
スタックオーバーフローでは、命令ポインタやスタックフレームのようなレジスタがスタックから復元されることがわかっており、これを悪用することが可能です。ヒープオーバーフローの場合、デフォルトでヒープチャンクに保存される機密情報はありません。しかし、機密情報やポインタが含まれる可能性があるため、この脆弱性の重大性はどのデータが上書きされる可能性があるかと、攻撃者がこれをどのように悪用できるかに依存します。
オーバーフローオフセットを見つけるためには、スタックオーバーフローと同じパターンを使用できます。
スタックオーバーフローでは、脆弱性がトリガーされる瞬間にスタックに存在するデータの配置がかなり信頼できます。これは、スタックが線形であり、常に衝突するメモリ内で増加し、プログラムの実行中の特定の場所でスタックメモリは通常同様の種類のデータを格納し、各関数によって使用されるスタック部分の末尾にいくつかのポインタがあるためです。
しかし、ヒープオーバーフローの場合、使用されるメモリは線形ではなく、割り当てられたチャンクは通常メモリの別々の位置にあります(隣接していない)ビンとゾーンがサイズによって割り当てを分け、以前に解放されたメモリが新しいチャンクを割り当てる前に使用されるためです。ヒープオーバーフローに対して衝突するオブジェクトを知るのは複雑です。したがって、ヒープオーバーフローが見つかった場合、オーバーフロー可能なオブジェクトの隣に目的のオブジェクトを配置する信頼できる方法を見つける必要があります。
このために使用される技術の1つがヒープグルーミングで、例えばこの投稿で説明されています。この投稿では、iOSカーネルでゾーンがメモリを使い果たすと、カーネルページによって拡張され、このページが期待されるサイズのチャンクに分割され、順番に使用されることが説明されています(iOSバージョン9.2まで、その後はこれらのチャンクがランダム化された方法で使用され、攻撃の悪用を困難にします)。
したがって、ヒープオーバーフローが発生している前の投稿では、オーバーフローされたオブジェクトが被害者のオブジェクトと衝突するように強制するために、複数のスレッドによって複数のkalloc
が強制され、すべての空きチャンクが埋められ、新しいページが作成されることを試みます。
特定のサイズのオブジェクトでこの埋め込みを強制するために、iOSマッチポートに関連するアウトオブライン割り当てが理想的な候補です。メッセージのサイズを調整することで、kalloc
割り当てのサイズを正確に指定でき、対応するマッチポートが破棄されると、対応する割り当ては即座にkfree
に戻されます。
その後、これらのプレースホルダーのいくつかを解放できます。kalloc.4096
のフリーリストは、後入れ先出しの順序で要素を解放します。これは基本的に、いくつかのプレースホルダーが解放され、エクスプロイトがオーバーフローに脆弱なオブジェクトを割り当てようとする際に、被害者のオブジェクトがそのオブジェクトの後に続く可能性が高いことを意味します。
このページでは、次のチャンクのprev in useビットとprevサイズの位置を上書きすることで、使用中のチャンクを統合(未使用だと思わせる)し、再度割り当てることができる基本的なヒープオーバーフローのエミュレーションを見つけることができます。
protostar heap 0の別の例では、ヒープオーバーフローを悪用して勝者関数を呼び出し、フラグを取得する非常に基本的なCTFの例が示されています。
protostar heap 1の例では、バッファオーバーフローを悪用することで、近くのチャンクにアドレスを上書きすることができ、ユーザーからの任意のデータが書き込まれることがわかります。
ページhttps://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/では、実行されるコマンドがオーバーフローしたチャンクの次のチャンクに保存されるヒープオーバーフローの例を見つけることができます。したがって、次のような簡単なエクスプロイトで上書きすることで、実行されるコマンドを変更することが可能です。
整数オーバーフローの脆弱性を利用してヒープオーバーフローを引き起こします。
オーバーフローしたチャンクのstruct
内の関数へのポインタを破損させ、system
のような関数を設定してコード実行を得ます。
AWSハッキングを学び、練習する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、練習する:HackTricks Training GCP Red Team Expert (GRTE)