ヒープオーバーフロー
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
基本情報
ヒープオーバーフローはスタックオーバーフローのようなもので、ヒープ内で発生します。基本的には、ヒープ内にデータを保存するために予約されたスペースがあり、保存されたデータが予約されたスペースよりも大きいことを意味します。
スタックオーバーフローでは、命令ポインタやスタックフレームのようなレジスタがスタックから復元されることがわかっており、これを悪用することが可能です。ヒープオーバーフローの場合、デフォルトでヒープチャンクに保存される機密情報はありません。ただし、機密情報やポインタが含まれる可能性があるため、この脆弱性の重要性は上書きされる可能性のあるデータと、攻撃者がこれを悪用する方法に依存します。
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/では、実行されるコマンドがオーバーフローしたチャンクの次のチャンクに保存されるヒープオーバーフローの例を見つけることができます。したがって、次のような簡単な攻撃を使用して、実行されるコマンドを上書きすることが可能です。
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。