PR 本記事には広告(Amazonアソシエイト・もしもアフィリエイト・A8.net等)が含まれます。掲載情報の正確性には努めていますが、商品の詳細は必ずリンク先で最新情報をご確認ください。

【Heap入門編】tcache・fastbinから読み解くglibcヒープ|CTF思考フレームワーク #62

【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

glibcのbinはtcache(64〜1032B) / fastbin(〜176B) / smallbin / largebin / unsortedに分類。サイズで挙動が違います👀

tcacheはサイズごとに単方向リンクリスト。リンクを書き換えるのが攻撃の基本だね💡

🤔 仮説フェーズ:攻撃者は何を考える?

Heap攻撃の基礎4要素。

🕶️ 攻撃者は「mallocは決まった順でbinから出す」「freeしたチャンクのfwdポインタは攻撃者の制御下に置ける」「サイズフィールドを書き換えればmallocが思わぬ場所を返す」と考えます。

📐 仮説①:chunk構造の理解

prev_size / size / fd / bksize下位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」が前提になりました🛡️

① tcache poisoning

free→fd上書き→2回mallocで任意アドレス取得。最も成功率が高い基本技。

② Double Free + tcache

tcache key導入前なら同じchunkを2回freeするとfd偽装が容易。

③ House of Spirit

スタック上に偽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等)
🛡️ glibc最新化

tcache key・safe-linkingで多くの古典が死ぬ。最新glibcの恩恵を受ける。

✅ メモリ安全言語に移行

Heap攻撃の根本はUAF/Double Free/OOB。Rust/Goに移行するだけで大半が消える。

🔍 ASan/HWASan活用

開発時にAddressSanitizerを回す。CIで連続実行すれば本番事故を激減できる。

Heap攻撃は「Cの宿命」。安全な言語こそ究極の対策💪

🧪 pwn検証用のLinuxラボ

Pwnやエクスプロイトの練習は、必ず自分の検証環境で。💻 ConoHa VPSならLinuxをワンクリックで立てて、gdb-pedaやpwntoolsを仕込んでそのままトレーニングできます。

PR / 広告

ConoHa VPS

※ 上記は他社サービスへのリンクです。購入は各自でご判断ください。

⚠️ よくある落とし穴

  1. glibcバージョンによってbin構造とmitigationが大きく違う事実を軽視
  2. tcacheが登場する前後で攻撃手法が異なる
  3. malloc(0x20)とmalloc(0x18)が同じbin(0x20)に入ることを忘れる
  4. チャンクサイズには8バイトのmetadataが含まれる
  5. free後にポインタをNULLにせずUAFを誘発
  6. Hardened malloc採用済み環境で古い手法を試す

🧰 ツール早見表

ツール用途備考
gdb + pwndbg / gefヒープ可視化heap/bins/vis_heap_chunks
pwntoolsmalloc/freeシーケンス送信インタラクティブshell模倣
glibc-all-in-one異バージョン即実行CTF常備
how2heap (shellphish)ヒープ攻撃カタログ学習の決定版リポジトリ
ASan / Valgrindメモリエラー検出開発側の防御

🎓 本気で学びたい人へ

ローレベルやOSレベルの許可を、仕事として深く学びたい方へ。🎓 ササエルはインフラとセキュリティの両方を学べるスクールです。

PR / 広告

ササエル

📚 もっと深く学びたい人へ

実際に手を動かして攻撃手法を体で覚えたいなら『7日間でハッキングをはじめる本 TryHackMe』がおすすめ📚

📚 次に読みたい

✍️ 学んだことを発信する

検証ノートをブログで公開したい方は、高速で安価なConoHa WINGが使いやすいです。

PR / 広告

ConoHa WING

⚖️ 大事なお約束

必ず守ってね

この記事の手法は、必ず自分の環境か、許可されたCTF・脆弱性報奨金プログラム(HackerOne、Bugcrowd等)で試してください。他人のサービスに無断で攻撃を仕掛けるのは不正アクセス禁止法違反、立派な犯罪です。学んだ知識は守る側で活かしましょう🤝

この記事は合法な学習・防御目的での解説です。許可のないシステムへの攻撃は犯罪になります(不正アクセス禁止法ほか)。検証は必ず自分が管理する環境・CTF・公式ハンズオンで行ってください🙏

記事URLをコピーしました