【ひーぷすぷれー】

ヒープスプレー とは?

💡 大きな的を作るために、会場全体にシートを敷き詰める作戦
📌 このページのポイント
ヒープスプレーのイメージ ヒープ領域 NOP sled NOP sled NOP sled NOP sled NOP sled + Shell Code Shell Code ← 本命 NOP sled + Shell Code NOP sled + Shell Code NOP sled NOP sled NOP sled NOP sled NOP sled NOP sled NOP sled NOP sled
ヒープ全体に攻撃コードをばら撒いて命中率を上げる
ひよこ ひよこ

ヒープスプレーって、どんな攻撃なの?

ペンギン先生 ペンギン先生

脆弱性を悪用しやすくするための「準備」技術だよ。ヒープ領域全体に同じ攻撃コードを大量にばら撒いておいて、脆弱性プログラムの制御が飛んできたときに高確率で当たるようにするんだ。

ひよこ ひよこ

なんでそんなにばら撒く必要があるの?

ペンギン先生 ペンギン先生

脆弱性によってプログラムカウンタが飛ぶ先のアドレスは予測しにくいんだよ。だからヒープの広い範囲に攻撃コードを配置しておけば、どこに飛んでも命中する確率が上がるんだね。

ひよこ ひよこ

NOP sledって何?初めて聞いたよ。

ペンギン先生 ペンギン先生

NOP(ノップ)は「何もしない命令」のことだよ。その塊(sled=そり)をシェルコードの前に大量に置いておくと、そこに当たっても命令がスルーしてシェルコードまで滑り落ちていく仕組みなんだ。的の面積を広げるイメージだね。

ひよこ ひよこ

ASLRがあれば防げるんじゃないの?

ペンギン先生 ペンギン先生

ASLRはアドレスをランダム化するけど、ヒープ全体に配置するヒープスプレーは確率的に当たってしまうんだよ。さらに情報リーク脆弱性と組み合わせてアドレスを特定し、ASLRを完全に突破することもできるんだ。

ひよこ ひよこ

防ぐ方法はあるの?

ペンギン先生 ペンギン先生

JITコンパイラのコードをランダム化するJIT randomizationや、ヒープのレイアウトを予測しにくくするGuarded Heap、メモリ圧縮などの対策があるよ。攻撃者が大量のデータを思い通りの位置に置きにくくする方向で進化しているんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ヒープスプレー」って出てきたら「脆弱性を確実に当てるためのメモリ爆撃準備」と思えればだいたいOK!
📖 おまけ:英語の意味
「Heap Spray」 = ヒープへの散布
💬 heap(メモリのヒープ領域)+spray(スプレーで噴きつける)で、ヒープ全体にコードを噴霧するイメージからきているんだよ。
← 用語集にもどる