【Heap入門編】tcache・fastbinから読み解くglibcヒープ|CTF思考フレームワーク #62
広告・PRを含みます。この記事にはアフィリエイトリンクが含まれます。掲載内容は編集方針に基づいて作成していますが、価格・在庫・キャンペーン内容はリンク先で最新情報を確認してください。

ヒープって、スタックと違って自由に確保するメモリのことだよね?それも攻撃面なの?🧱

ヒープこそ現代Pwnの主戦場。glibc の malloc 実装(ptmalloc2)には tcache・fastbin など複雑なデータ構造があり、free(同じポインタを2回) や malloc サイズ計算ミスを突けば、メモリレイアウトを攻撃者好みに歪められます。
ヒープエクスプロイトは、glibc・jemalloc・mimalloc など各種アロケータの内部実装を突く技術。glibc 2.27以降の tcache、fastbin、smallbin、unsorted bin、large bin――それぞれの管理ルールに合わせて、Use-After-Free、Double Free、Heap Overflow を組み合わせ、メモリレイアウトを操作します。

ヒープってそんなに複雑なんだ…malloc使うだけだと思ってた。
この記事は、CTF思考フレームワーク第62回。Heap入門として、glibc ptmalloc2 のtcache・fastbin・smallbin・unsorted bin の役割と、それぞれを狙う攻撃の基礎を、図解とともに整理します。
📖 この記事はシリーズの一部です
「CTF思考フレームワーク」 #62 / 全86記事 → シリーズ一覧を見る →
🧬 スタックBOFができたら次はヒープ。glibc malloc の世界はbin(fastbin/tcache/smallbin/largebin/unsorted)の構造を知ると、突然「自由自在に書き換えできる」風景に変わります。
ヒープPwnは「fastbin・tcacheの単純連結リスト」を理解するのがスタート。free→size→fwd ポインタの仕組みがわかると、UAFやDouble Freeで「どこに次にmallocが来るか」を制御できるようになります。
tcache・fastbinから読み解くglibcヒープです🧱

Heapは「mallocの内部構造」を理解しないと戦えない世界。glibc tcacheが現代の主役🧱
先に意味を押さえておくと読みやすい用語です。
- CTF: セキュリティの練習問題を解く競技。必ず許可された環境だけで試します。
- Pwn: バイナリの不備を突いてプログラムの制御を奪うCTF分野です。
- ヒープ: プログラムが実行中に動的に使うメモリ領域です。
- スタック: 関数呼び出しや一時データを積み上げて管理するメモリ領域です。
👀 観察フェーズ:まず何を見る?

まずvmmapでheapセグメントを観察→malloc_chunk構造体を頭に叩き込む🔍
glibcのmallocは複数のbinを使い分けます。tcache(per-thread)→fastbin→smallbin→largebin→unsortedの順に走査。tcacheの登場(glibc 2.26〜)で攻撃面が大きく変わりました。
- glibcバージョン(2.26+でtcache、2.32+でtcache key)
- mallocサイズ:tcache=0x20-0x410、fastbin=0x20-0x80
- チャンクのmetadata:prev_size / size / fwd / bk
- in_use bitとprev_in_use bit
- tcache_perthread_struct の存在
- main_arena vs thread_arena

tcacheはサイズごとに単方向リンクリスト。リンクを書き換えるのが攻撃の基本だね💡
🤔 仮説フェーズ:攻撃者は何を考える?

Heap攻撃の基礎4要素。
🕶️ 攻撃者は「mallocは決まった順でbinから出す」「freeしたチャンクのfwdポインタは攻撃者の制御下に置ける」「サイズフィールドを書き換えればmallocが思わぬ場所を返す」と考えます。
📐 仮説①:chunk構造の理解
prev_size / size / fd / bk。size下位3bit(P/M/N)のフラグ意味も重要。
🪣 仮説②:tcache poisoning
freeしたchunkのfdを書き換え、次のmallocを任意アドレスに着地させる。
⚡ 仮説③:fastbin attack
fastbinに偽chunkを連結し、想定外のアドレスをmallocさせる古典手法。
🪞 仮説④:unlink攻撃
unsortedや large binでFD/BKポインタを偽装。glibcの整合性チェックを通す必要あり。

Heap問題は「glibcバージョンごとに細部が変わる」から、対象バージョンを必ず確認💡
🔬 検証フェーズ:どうやって確かめる?

pwndbgのheap / bins / visコマンドでchunkの繋がりを可視化するのが学習の近道🧪
gdb-pwndbgのheap系コマンド(heap bins fastbins tcache vis_heap_chunks)で内部状態を可視化しながら学習。
# pwndbg heap可視化
pwndbg> heap
pwndbg> bins
pwndbg> fastbins
pwndbg> tcachebins
pwndbg> vis_heap_chunks
# tcacheダンプ
pwndbg> tcache_get

tcacheは2.32以降keyフィールド追加で従来攻撃が効かなくなったから常に最新を追うんだね💡
⚔️ 攻撃フェーズ:実際の手口

Heap入門の代表攻撃3つ。
基礎攻撃:①Tcache Dup(同じチャンクを2回tcacheに入れる→同じアドレスを2回返す)、②Tcache Poisoning(fwd書き換えで任意アドレスをmallocさせる)、③Unsorted Bin Attack。
# Tcache Poisoning(glibc 2.27〜2.31)
# 1. tcacheにチャンクをfreeで入れる
# 2. UAFでfwdポインタを target に書き換え
# 3. 2回malloc(1回目で元のチャンク、2回目でtargetが返る)
# 4. target に好きな値を書き込む
# glibc 2.32+ では tcache key(mangle)が入って単純Poisoningは難化
glibc 2.32 から tcache の next pointer が SafeLinking(XOR mangle)で保護され、Tcache Poisoningには「ヒープアドレスleak」が前提になりました🛡️
free→fd上書き→2回mallocで任意アドレス取得。最も成功率が高い基本技。
tcache key導入前なら同じchunkを2回freeするとfd偽装が容易。
スタック上に偽chunkを構築してfreeさせ、tcacheに混入。
🛡️ 防御フェーズ:どう守る?

Heap安全運用の3点。
ヒープ攻撃対策はglibc側のhardening進化に乗ること。tcache key、SafeLinking、check機構が年々強化されている。アプリ側はuse-after-freeを書かないのが第一。
- glibc最新版の追従(2.34+はtcache double free検知)
- Hardened malloc(GrapheneOS等)
- AddressSanitizer (ASan)でテスト
- scudo allocator(Android/Fuchsia)
- 型安全な言語(Rust)への置き換え検討
- アプリ層:所有権・lifetimeを明示(C++ smart pointer等)
tcache key・safe-linkingで多くの古典が死ぬ。最新glibcの恩恵を受ける。
Heap攻撃の根本はUAF/Double Free/OOB。Rust/Goに移行するだけで大半が消える。
開発時にAddressSanitizerを回す。CIで連続実行すれば本番事故を激減できる。

Heap攻撃は「Cの宿命」。安全な言語こそ究極の対策💪
🧪 pwn検証用のLinuxラボ
Pwnやエクスプロイトの練習は、必ず自分の検証環境で。💻 ConoHa VPSならLinuxをワンクリックで立てて、gdb-pedaやpwntoolsを仕込んでそのままトレーニングできます。
※ 上記は他社サービスへのリンクです。購入は各自でご判断ください。
⚠️ よくある落とし穴
- glibcバージョンによってbin構造とmitigationが大きく違う事実を軽視
- tcacheが登場する前後で攻撃手法が異なる
- malloc(0x20)とmalloc(0x18)が同じbin(0x20)に入ることを忘れる
- チャンクサイズには8バイトのmetadataが含まれる
- free後にポインタをNULLにせずUAFを誘発
- Hardened malloc採用済み環境で古い手法を試す
🧰 ツール早見表
| ツール | 用途 | 備考 |
|---|---|---|
| gdb + pwndbg / gef | ヒープ可視化 | heap/bins/vis_heap_chunks |
| pwntools | malloc/freeシーケンス送信 | インタラクティブshell模倣 |
| glibc-all-in-one | 異バージョン即実行 | CTF常備 |
| how2heap (shellphish) | ヒープ攻撃カタログ | 学習の決定版リポジトリ |
| ASan / Valgrind | メモリエラー検出 | 開発側の防御 |
🎓 本気で学びたい人へ
ローレベルやOSレベルの許可を、仕事として深く学びたい方へ。🎓 ササエルはインフラとセキュリティの両方を学べるスクールです。
📚 もっと深く学びたい人へ
実際に手を動かして攻撃手法を体で覚えたいなら『7日間でハッキングをはじめる本 TryHackMe』がおすすめ📚
📚 次に読みたい
- GOT・Format String編|CTF思考フレームワーク #61
- Heap応用編(UAF/DF)|CTF思考フレームワーク #63
- ROP入門編|CTF思考フレームワーク #60
- Houseシリーズ編|CTF思考フレームワーク #64
✍️ 学んだことを発信する
検証ノートをブログで公開したい方は、高速で安価なConoHa WINGが使いやすいです。
⚖️ 大事なお約束
この記事の手法は、必ず自分の環境か、許可されたCTF・脆弱性報奨金プログラム(HackerOne、Bugcrowd等)で試してください。他人のサービスに無断で攻撃を仕掛けるのは不正アクセス禁止法違反、立派な犯罪です。学んだ知識は守る側で活かしましょう🤝
この記事は合法な学習・防御目的での解説です。許可のないシステムへの攻撃は犯罪になります(不正アクセス禁止法ほか)。検証は必ず自分が管理する環境・CTF・公式ハンズオンで行ってください🙏



