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

【Houseシリーズ編】House of Force・Spiritでヒープを乗っ取る|CTF思考フレームワーク #64

【Houseシリーズ編】House of Force・Spiritでヒープを乗っ取る|CTF思考フレームワーク #64 アイキャッチ画像
安全に生きたい編集部

広告・PRを含みます。この記事にはアフィリエイトリンクが含まれます。掲載内容は編集方針に基づいて作成していますが、価格・在庫・キャンペーン内容はリンク先で最新情報を確認してください。

House of Force?House of Spirit?ヒープエクスプロイトに『家』って何?🏠

phrack.org で歴代の研究者が考案したヒープ攻撃手法のシリーズ名。House of Force、House of Spirit、House of Orange、House of Roman、House of Einherjar――それぞれ異なるヒープ状態を作って、最終的に任意のメモリ書込に至ります。Pwnの『流派』みたいなものです。

House シリーズは、ヒープエクスプロイトの伝統的命名。Phantasmal Phantasmagoria(2005年)が初出。House of Force(malloc サイズ操作)、House of Spirit(偽 fastbin チャンク)、House of Orange(main_arena 操作)、House of Roman(部分上書き)――現代のCTFと、現実の glibc 攻撃で頻出します。

技を持つ家門みたいで、なんだか中二病っぽい命名…

この記事は、CTF思考フレームワーク第64回。House of Force・Spirit・Orange・Roman などの代表的ヒープ攻撃の仕組みと、実装、現代glibc での適用可否を、初心者向けに整理します。

📖 この記事はシリーズの一部です
CTF思考フレームワーク#64 / 全86記事 → シリーズ一覧を見る →

🏠 ヒープPwnの中盤〜終盤に出てくる「House系」攻撃。House of Spirit / Force / Orange / Einherjar / Lore… 名前が中二病ですが、いずれもglibc特有の構造を逆手に取る精緻なテクです。

House系は「mallocの内部状態を仕込んで、攻撃者が望むアドレスを返させる/関数ポインタを書き換える」という共通テーマ。各バージョンのglibcでmitigationがどう変わったかを把握するのが鍵。

難易度:★★★(上級)

House of Force・Spirit・Lore…glibcヒープを乗っ取るシリーズ🏠

Houseシリーズは「glibcの内部実装の隙」を突いてヒープを乗っ取る系統的テクニック群🏠

この記事で出てくる言葉

先に意味を押さえておくと読みやすい用語です。

  • CTF: セキュリティの練習問題を解く競技。必ず許可された環境だけで試します。
  • Pwn: バイナリの不備を突いてプログラムの制御を奪うCTF分野です。
  • ヒープ: プログラムが実行中に動的に使うメモリ領域です。
  • スタック: 関数呼び出しや一時データを積み上げて管理するメモリ領域です。

👀 観察フェーズ:まず何を見る?

まずglibcバージョンとtcache関連の挙動を確認!バージョンごとに通用するHouseが違う🔍

House系を選ぶ判断材料は「使えるprimitive(読み書き範囲)」「glibcバージョン」「使えるbin」「ヒープleakの有無」。攻撃者は手持ちのカードに合うHouseを選びます。

  • glibcバージョンとmitigation(tcache key、SafeLinking等)
  • 使えるprimitive:edit only / partial overflow / full overflow
  • leakの有無(ヒープ・libc・スタック)
  • malloc/free呼び出しの自由度
  • top chunkの状態(House of Forceの伏線)
  • __free_hook / __malloc_hook の存在(glibc < 2.34)

主要House: House of Force / Spirit / Lore / Einherjar / Botcake / Apple。それぞれ前提条件と効果が違います👀

House of Apple2なんて2.35以降の最新glibcでも通る最先端だね😱

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

House系統の4分類。

🕶️ 攻撃者の発想:「Spiritは偽チャンクをfreeさせて任意mallocを返す」「Forceはtop chunkのsizeを巨大値に書き換えて任意アドレスmalloc」「Orangeは_IO_FILE構造を悪用」と、各bin・各構造の特性を選んで使い分けます。

🏰 仮説①:House of Force

top chunkのsizeを巨大値に書換→次のmallocで任意アドレスに着地。古典(2.29以前)。

👻 仮説②:House of Spirit

スタック上に偽chunkを作ってfree→tcacheに混入させて任意malloc。

📚 仮説③:House of Lore

small binのbk偽装で任意アドレスを取り出す。整合性チェックが少ない経路。

🍎 仮説④:House of Apple/Botcake

FILE構造体や__malloc_hook無効化後の最新世代テク。論文ベースで進化中。

House系はglibcの仕様書を読み込んだ職人芸の世界💡

🔬 検証フェーズ:どうやって確かめる?

how2heapリポジトリでバージョン別動作を確認しながら写経が王道🧪

理解にはhow2heapリポジトリ(shellphish)が決定版。各houseの最小サンプルが揃っており、gdbでステップ実行して構造変化を観察するのが学習の最短経路。

# how2heap でHouse系を実行
git clone https://github.com/shellphish/how2heap
cd how2heap/glibc_2.31
make
./house_of_spirit

# gdbで観察
gdb ./house_of_spirit
pwndbg> b *main+...
pwndbg> r
pwndbg> heap

CTFで使うのは「対象glibcで動くHouseを選ぶ」のが勝ち筋だね💡

⚔️ 攻撃フェーズ:実際の手口

House代表攻撃3つ。

主要House系:①Spirit(偽チャンクをfastbin/tcacheに送り込む)、②Force(top chunkサイズ書き換えで巨大malloc)、③Orange(_IO_FILE悪用、glibc 2.24以前)、④Lorenzo / Mind(新世代)、⑤House of Banana(glibc 2.34+)。

# House of Spirit(fastbin)
# 1. スタック上に偽チャンク(size=0x40)を仕込む
// uint64_t fake[8];
// fake[1] = 0x40;
// fake[9] = 0x40;  // 次のチャンクのprev_size
# 2. free(&fake[2])
# 3. malloc(0x30) → スタック上のアドレスが返る!

# House of Force(top chunk size書き換え)
# 1. top chunkのsizeを 0xffffffffffffffff に書き換え
# 2. malloc(target - top - hdr) → 次のmallocはほぼ任意位置

glibc 2.29 以降 House of Force は使えなくなり(mchunk size check導入)、近年は House of Botcake / House of Banana 等の新世代が主流です🆕

① House of Force

top chunk size書換→巨大mallocで任意アドレスをchunkとして取得。glibc 2.29以前限定。

② House of Spirit

スタック領域に偽chunkを作ってfree→tcache再配布。シンプルかつ強力。

③ House of Apple2

FILE構造体の_IO_FILEを偽装し_IO_str_finishからシステム関数を呼ばせる最新テク。

🛡️ 防御フェーズ:どう守る?

House対策の3レイヤー。

防御は「glibcの最新版に追従」「アプリ側でヒープ越境を起こさない」「Hardened malloc採用」「fuzzingで挙動を検証」。

  • glibc最新版+mitigationフル活用
  • Hardened malloc(GrapheneOS / Android)
  • scudo allocator
  • ASan / HWAsanでテスト
  • fuzzer(libFuzzer / AFL++)で深層パスを探索
  • メモリ安全言語(Rust)で書き直し検討
🛡️ glibc最新化&safe-linking

2.32以降のsafe-linkingでtcache fd攻撃の難度激増。最新で運用。

🧱 Sandbox/seccompで影響局所化

RCE取得後のsyscall制限。execveが呼べなければシェルは取れない。

🦀 メモリ安全言語化

根本対策としてRustやGoへの移行。新規CライブラリよりGoライブラリが優先。

House系の終わりなき進化を見ると「Cで戦い続ける限界」を感じるね💪

🧪 pwn検証用のLinuxラボ

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

PR / 広告

ConoHa VPS

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

⚠️ よくある落とし穴

  1. glibcバージョンとmitigationの対応表を頭に入れず古手法を試す
  2. how2heapを写経で終わり、gdb観察を省略
  3. House of Forceがglibc 2.29で死んだことを知らずに延々試す
  4. __free_hookに頼った攻略がglibc 2.34で消えた事実を見落とす
  5. tcache key登場で単純Poisoningが効かなくなった環境で試す
  6. thread arena使用時にmain_arena前提のexploitを書く

🧰 ツール早見表

ツール用途備考
how2heap (shellphish)House系カタログ最強の学習リポジトリ
glibc-all-in-oneバージョン即切替CTF常備
gdb + pwndbgヒープ観察heap/bins/vis_heap_chunks
heaplooker (gef)ヒープ可視化拡張gef使い向け
libc-databaselibc特定leak下位3桁から

🎓 本気で学びたい人へ

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

PR / 広告

ササエル

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

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

📚 次に読みたい

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

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

PR / 広告

ConoHa WING

⚖️ 大事なお約束

必ず守ってね

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

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

記事URLをコピーしました