ヒープの悪用:Use-After-Freeとヒープスプレー
glibc mallocの内部構造、Use-After-Freeの状態、ヒープスプレーの技法を理解します。
「ヒープの悪用:Use-After-Freeとヒープスプレー」はCoddyKit上の無料Cyber Security Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCyber Security Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cyber Security Academyコースには全4レッスンが含まれています。
ヒープ
ヒープは、実行時にmalloc()/free()/new/deleteを介して割り当てられる動的メモリです。スタックとは異なり、ヒープのレイアウトはコールスタックではなく、割り当てと解放のパターンによって決まります。ヒープの脆弱性は、ブラウザー、パーサー、ネットワークデーモンでよく見られます。
Use-After-Free(解放後使用、UAF)
Use-After-Freeの脆弱性は、プログラムがメモリ領域を解放した後もその領域を使い続けるときに発生します。解放された領域が攻撃者の制御するデータで再割り当てされると、プログラムは古いポインターを使って、攻撃者のデータを対象に処理することになります。
UAFの例
UAFのパターン:
// Vulnerable C code:
struct Object *obj = malloc(sizeof(*obj));
free(obj);
// Later, attacker causes a new malloc to fill the freed region
// with their data...
obj->method(); // now calls attacker's function pointer!ヒープ・フェンシュイ
ヒープ・フェンシュイ(またはヒープグルーミング)とは、ヒープアロケーターを操作してオブジェクトを特定の位置に配置し、解放済みメモリを制御された形で再利用できるようにする手法です。攻撃者は、割り当てと解放を正確な順序で実行してヒープの形状を作ります。
ヒープスプレー
ヒープスプレーは、攻撃者が制御する大量のデータ(シェルコードとNOPスレッド)をヒープ全体に割り当てます。ヒープの大部分が埋まるため、不正なポインターが攻撃者のデータを指す可能性が高くなります。UAFや型混同のバグと組み合わせて使われることがよくあります。
// JavaScript heap spray:
var spray = [];
for(var i = 0; i < 100000; i++) {
spray[i] = unescape("%90%90...shellcode...");
}二重解放
二重解放は、メモリを2回解放したときに発生します。2回目の解放によってヒープアロケーターのメタデータ(フリーリストのポインター)が破損し、攻撃者が次の割り当て先を制御して任意のアドレスに書き込める可能性があります。
ヒープバッファオーバーフロー
スタックオーバーフローと同様に、ヒープバッファオーバーフローはヒープ上の割り当て領域の末尾を越えて書き込みます。ただしスタックオーバーフローとは異なり、通常の対象はヒープのメタデータ(サイズ、前後のポインター)や、関数ポインターまたはvtableポインターを含む隣接領域です。
型混同
型混同は、ある型として割り当てられたメモリ領域を別の型として使用したときに発生します。JavaScriptエンジンやC++コードでよく見られます。攻撃者が割り当ての順序を制御できる場合、エンジンに攻撃者のデータを信頼できるオブジェクトとして扱わせることができます。
ptmallocとtcmallocの内部動作
ヒープアロケーターを理解することは、エクスプロイト開発に役立ちます。glibcのptmallocは、ビン(unsorted、small、large)とfast binを使用します。tcache(スレッドごとのキャッシュ)が最初の割り当て元になります。エクスプロイトでは、将来の割り当てアドレスを制御するために、ビンの破損を狙うことがよくあります。
緩和策
ヒープエクスプロイトに対する緩和策:
- ヒープのランダム化(ASLRの一部) — ヒープのベースアドレスをランダム化します
- 安全なunlink — unlinkの前に前後のポインターを検証します
- tcache汚染の検出 — glibc 2.32で追加されました
- ポインターの難読化 — tcacheに保存されたポインターを暗号化します
- メモリ安全な言語 — Rustはコンパイル時にUAFを排除します
ブラウザーヒープエクスプロイト
ブラウザーのゼロデイの多くは、JavaScriptエンジン(V8、SpiderMonkey)のヒープ脆弱性に関係しています。現代のブラウザーでは、サンドボックス脱出を複数段階のチェーンにします。レンダラーのヒープバグ → ブラウザープロセスへの脱出 → OSの権限昇格、という流れです。各段階で独自の手法が必要です。
クイックチェック: ヒープエクスプロイト
すでに解放され、攻撃者のデータで再割り当てされたメモリを、古いポインターで使用することで、攻撃者がプログラムの実行を制御できる脆弱性はどれですか?
レッスンのまとめ
ヒープの脆弱性であるUAF、二重解放、ヒープオーバーフロー、型混同は、動的メモリの管理不備を悪用します。Use-After-Freeは、現代において最も広く見られるエクスプロイトクラスです。ヒープスプレーは、攻撃者のデータに到達する可能性を最大化します。緩和策には、ASLR、安全なunlink、ポインターの難読化があります。Rustなどのメモリ安全な言語は、これらの脆弱性クラスを完全に排除します。
よくある質問
「ヒープの悪用:Use-After-Freeとヒープスプレー」レッスンは無料ですか?
はい。「ヒープの悪用:Use-After-Freeとヒープスプレー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cyber Security Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cyber Security Academyコースには全4レッスンが含まれています。
「ヒープの悪用:Use-After-Freeとヒープスプレー」で何を学びますか?
glibc mallocの内部構造、Use-After-Freeの状態、ヒープスプレーの技法を理解します。 ブラウザで直接実行するハンズオンコードでCyber Security Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cyber Security Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCyber Security Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「ヒープの悪用:Use-After-Freeとヒープスプレー」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCyber Security Academyレッスンでコードを書いて実行できますか?
はい。すべてのCyber Security Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- スタックバッファオーバーフロー
- Return-Oriented Programming(ROP)
- フォーマット文字列脆弱性
- ヒープの悪用:Use-After-Freeとヒープスプレー