【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 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 等の新世代が主流です🆕
top chunk size書換→巨大mallocで任意アドレスをchunkとして取得。glibc 2.29以前限定。
スタック領域に偽chunkを作ってfree→tcache再配布。シンプルかつ強力。
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)で書き直し検討
2.32以降のsafe-linkingでtcache fd攻撃の難度激増。最新で運用。
RCE取得後のsyscall制限。execveが呼べなければシェルは取れない。
根本対策としてRustやGoへの移行。新規CライブラリよりGoライブラリが優先。

House系の終わりなき進化を見ると「Cで戦い続ける限界」を感じるね💪
🧪 pwn検証用のLinuxラボ
Pwnやエクスプロイトの練習は、必ず自分の検証環境で。💻 ConoHa VPSならLinuxをワンクリックで立てて、gdb-pedaやpwntoolsを仕込んでそのままトレーニングできます。
※ 上記は他社サービスへのリンクです。購入は各自でご判断ください。
⚠️ よくある落とし穴
- glibcバージョンとmitigationの対応表を頭に入れず古手法を試す
- how2heapを写経で終わり、gdb観察を省略
- House of Forceがglibc 2.29で死んだことを知らずに延々試す
- __free_hookに頼った攻略がglibc 2.34で消えた事実を見落とす
- tcache key登場で単純Poisoningが効かなくなった環境で試す
- thread arena使用時にmain_arena前提のexploitを書く
🧰 ツール早見表
| ツール | 用途 | 備考 |
|---|---|---|
| how2heap (shellphish) | House系カタログ | 最強の学習リポジトリ |
| glibc-all-in-one | バージョン即切替 | CTF常備 |
| gdb + pwndbg | ヒープ観察 | heap/bins/vis_heap_chunks |
| heaplooker (gef) | ヒープ可視化拡張 | gef使い向け |
| libc-database | libc特定 | leak下位3桁から |
🎓 本気で学びたい人へ
ローレベルやOSレベルの許可を、仕事として深く学びたい方へ。🎓 ササエルはインフラとセキュリティの両方を学べるスクールです。
📚 もっと深く学びたい人へ
実際に手を動かして攻撃手法を体で覚えたいなら『7日間でハッキングをはじめる本 TryHackMe』がおすすめ📚
📚 次に読みたい
- Heap応用編(UAF/DF)|CTF思考フレームワーク #63
- 保護機構と回避編|CTF思考フレームワーク #65
- Heap入門編|CTF思考フレームワーク #62
- Pwn総まとめ編|CTF思考フレームワーク #66
✍️ 学んだことを発信する
検証ノートをブログで公開したい方は、高速で安価なConoHa WINGが使いやすいです。
⚖️ 大事なお約束
この記事の手法は、必ず自分の環境か、許可されたCTF・脆弱性報奨金プログラム(HackerOne、Bugcrowd等)で試してください。他人のサービスに無断で攻撃を仕掛けるのは不正アクセス禁止法違反、立派な犯罪です。学んだ知識は守る側で活かしましょう🤝
この記事は合法な学習・防御目的での解説です。許可のないシステムへの攻撃は犯罪になります(不正アクセス禁止法ほか)。検証は必ず自分が管理する環境・CTF・公式ハンズオンで行ってください🙏



