ヒープオーバーフロー

Reading time: 9 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

基本情報

ヒープオーバーフローはスタックオーバーフローのようなもので、ヒープ内で発生します。基本的には、ヒープ内にデータを保存するために予約されたスペースがあり、保存されたデータが予約されたスペースよりも大きいことを意味します。

スタックオーバーフローでは、命令ポインタやスタックフレームのようなレジスタがスタックから復元されることがわかっており、これを悪用することが可能です。ヒープオーバーフローの場合、デフォルトでヒープチャンクに保存される機密情報はありません。ただし、機密情報やポインタが含まれる可能性があるため、この脆弱性の重要性上書きされる可能性のあるデータと、攻撃者がこれを悪用する方法に依存します。

tip

オーバーフローオフセットを見つけるためには、スタックオーバーフローと同じパターンを使用できます。

スタックオーバーフローとヒープオーバーフロー

スタックオーバーフローでは、脆弱性がトリガーされる瞬間にスタックに存在するデータの配置がかなり信頼できます。これは、スタックが線形であり、常に衝突するメモリが増加し、プログラムの実行中の特定の場所でスタックメモリは通常同様の種類のデータを格納し、各関数によって使用されるスタック部分の末尾にいくつかのポインタがあるためです。

しかし、ヒープオーバーフローの場合、使用されるメモリは線形ではなく、割り当てられたチャンクは通常メモリの別々の位置にあります(隣接していない)し、サイズによって割り当てを分けるためのビンやゾーンがあるため、以前に解放されたメモリが新しいチャンクを割り当てる前に使用されます。したがって、ヒープオーバーフローに対して衝突するオブジェクトを知るのは複雑です。したがって、ヒープオーバーフローが見つかった場合、オーバーフロー可能なオブジェクトの隣にメモリ内で目的のオブジェクトを配置する信頼できる方法を見つける必要があります

このために使用される技術の一つがヒープグルーミングで、例えばこの投稿で説明されています。この投稿では、iOSカーネルでゾーンがメモリを使い果たしたときに、カーネルページによって拡張され、このページが期待されるサイズのチャンクに分割され、順番に使用される方法が説明されています(iOSバージョン9.2まで、その後はこれらのチャンクがランダム化された方法で使用され、攻撃の悪用を困難にします)。

したがって、ヒープオーバーフローが発生している前の投稿では、オーバーフローしたオブジェクトが被害者のオブジェクトと衝突するように強制するために、複数のスレッドによって複数のkallocが強制され、すべての空きチャンクが埋められ、新しいページが作成されることを試みます

特定のサイズのオブジェクトでこの埋め込みを強制するために、iOSマッチポートに関連するアウトオブライン割り当てが理想的な候補です。メッセージのサイズを調整することで、kalloc割り当てのサイズを正確に指定でき、対応するマッチポートが破棄されると、対応する割り当ては即座にkfreeに戻されます。

その後、これらのプレースホルダーのいくつかを解放できます。kalloc.4096のフリーリストは、後入れ先出しの順序で要素を解放します。これは基本的に、いくつかのプレースホルダーが解放され、攻撃がオーバーフローに脆弱なオブジェクトを割り当てようとする際に、被害者オブジェクトがそのオブジェクトの後に続く可能性が高いことを意味します。

例 libc

このページでは、次のチャンクのprev in useビットとprevサイズの位置を上書きすることで、使用中のチャンクを統合(未使用だと思わせる)し、再度割り当てることができる基本的なヒープオーバーフローのエミュレーションを見つけることができます。

protostar heap 0の別の例では、ヒープオーバーフローを悪用して勝者関数を呼び出し、フラグを取得する非常に基本的なCTFの例が示されています。

protostar heap 1の例では、バッファオーバーフローを悪用することで、近くのチャンクにアドレスを上書きすることができ、ユーザーからの任意のデータが書き込まれることがわかります。

例 ARM64

ページhttps://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/では、実行されるコマンドがオーバーフローしたチャンクの次のチャンクに保存されるヒープオーバーフローの例を見つけることができます。したがって、次のような簡単な攻撃を使用して、実行されるコマンドを上書きすることが可能です。

bash
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt

その他の例

  • Auth-or-out. Hack The Box
  • 整数オーバーフローの脆弱性を利用してヒープオーバーフローを引き起こします。
  • オーバーフローしたチャンクのstruct内の関数へのポインタを破損させ、systemのような関数を設定してコード実行を得ます。

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする