8.8 KiB
ヒープオーバーフロー
htARTE(HackTricks AWS Red Team Expert)を使用して、ゼロからヒーローまでAWSハッキングを学ぶ こちら!
HackTricks をサポートする他の方法:
- HackTricks で企業を宣伝したい場合や HackTricks をPDFでダウンロードしたい場合は、SUBSCRIPTION PLANS をチェックしてください!
- 公式PEASS&HackTricksグッズを入手する
- The PEASS Familyを発見し、独占的なNFTsのコレクションを見つける
- 💬 Discordグループ に参加するか、telegramグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローする
- ハッキングテクニックを共有するには、HackTricksとHackTricks CloudのGitHubリポジトリにPRを提出してください。
基本情報
ヒープオーバーフローは、ヒープ内でのスタックオーバーフローのようなものです。基本的には、ヒープにデータを格納するためのスペースが予約されており、格納されたデータが予約されたスペースよりも大きかったことを意味します。
スタックオーバーフローでは、スタックからレジスタ(命令ポインタやスタックフレームなど)が復元されることがわかっており、これを悪用する可能性があります。ヒープオーバーフローの場合、ヒープチャンクにはデフォルトで機密情報は格納されていないことがわかります。ただし、機密情報やポインタが格納されている可能性があるため、この脆弱性の重大性は、どのデータが上書きされるかと攻撃者がこれをどのように悪用できるかに依存します。
{% hint style="success" %} オーバーフローのオフセットを見つけるためには、スタックオーバーフローと同じパターンを使用できます。 {% endhint %}
スタックオーバーフロー vs ヒープオーバーフロー
スタックオーバーフローでは、脆弱性がトリガーされる時点でスタックに存在するデータと配置がかなり信頼できます。これは、スタックが線形であり、常に衝突するメモリで増加しており、プログラムの実行中にスタックメモリの特定の場所には通常同様のデータが格納され、各関数が使用するスタック部分の末尾にいくつかのポインタがある特定の構造を持っているためです。
しかし、ヒープオーバーフローの場合、使用されるメモリは線形ではなく、通常はメモリの別々の位置に割り当てられたチャンク(隣接していない)にあります。これは、サイズによって割り当てられたビンやゾーンによって割り当てられたメモリが使用される前に以前に解放されたメモリが使用されるためです。ヒープオーバーフローに対して脆弱性が見つかった場合、望ましいオブジェクトをメモリ内で次になるように信頼性の高い方法を見つける必要があります。
これに使用されるテクニックの1つがHeap Groomingです。これは、たとえばこの投稿で使用されています。この投稿では、iOSカーネルでメモリを格納するためのメモリチャンクが不足すると、カーネルページが拡張され、このページが期待されるサイズのチャンクに分割され、これらのチャンクが順番に使用されます(iOSバージョン9.2まで、その後、これらのチャンクはこれらの攻撃の複雑さを増すためにランダムな方法で使用されます)。
したがって、ヒープオーバーフローが発生する前の投稿では、オーバーフローしたオブジェクトが被害者の順序と衝突するように強制するために、複数のスレッドによっていくつかの**kallocs
が強制され、すべての空きチャンクが埋められ、新しいページが作成されるようにする**必要があります。
特定のサイズのオブジェクトでこの埋め込みを強制するために、iOS mach port に関連付けられたアウトオブラインの割り当てが理想的な候補です。メッセージのサイズを作成することで、kalloc
の割り当てのサイズを正確に指定し、対応するmach port が破棄されると、対応する割り当てがすぐに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/では、実行されるコマンドがオーバーフローしたチャンクからの次のチャンクに格納されるヒープオーバーフローの例が見つかります。そのため、簡単なエクスプロイトでそれを上書きして実行されるコマンドを変更することが可能です。
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
AWSハッキングをゼロからヒーローまで学ぶ htARTE(HackTricks AWS Red Team Expert)!
HackTricksをサポートする他の方法:
- HackTricksで企業を宣伝したいまたはHackTricksをPDFでダウンロードしたい場合は、SUBSCRIPTION PLANSをチェックしてください!
- 公式PEASS&HackTricksのグッズを入手する
- The PEASS Family、当社の独占的なNFTsコレクションを発見する
- **💬 Discordグループまたはtelegramグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローする。
- ハッキングトリックを共有するためにPRを HackTricks および HackTricks Cloud のGitHubリポジトリに提出する。