
Retbleed(CVE-2022-29900/29901)マイクロアーキテクチャ攻撃のgem5上での再現。RSBアンダーフロー、Flush+Reloadサイドチャネルリーク、および検証済みのlfence緩和策。
Retbleed (CVE-2022-29900 / CVE-2022-29901) のハンズオン再現 — 2022年のマイクロアーキテクチャ攻撃で、長らく安全とされてきた ret 命令が、CPUのリターンスタックバッファ (RSB) がアンダーフローした際にハイジャックされうることを証明し、「Retpoline」防御を破った。
本プロジェクトは、gem5 上の x86 アウトオブオーダーCPUモデルで攻撃のライフサイクル全体をシミュレートする。RSBアンダーフローを引き起こし、Flush+Reloadキャッシュサイドチャネルを通じて秘密データを1バイトずつ漏洩させ、その後、漏洩を塞ぐソフトウェア緩和策 (lfence) を検証する。
コースプロジェクト — Advanced Computer Architecture, Fall 2025, CUNY City College 著者: Abdul Kalam Mansoor & Rebiha Selmani
Spectre系の攻撃は、CPUが誤った推測を「取り消す」場合でも、投機的実行がキャッシュレベルの副作用を残すことを示した。業界の修正策であるRetpolineは、危険な間接ジャンプを ret 命令に置き換えた。これは、リターンが小さなハードウェアスタック (RSB) から安全に予測されるという前提に基づいていた。Retbleedはその前提が誤りであることを示した。深い再帰でRSBを枯渇させると、CPUはRetpolineが回避するために設計されたのと同じ危険な予測器へと暗黙のうちにフォールバックする。
| 段階 | 何が起こるか |
|---|
| 1. トリガー | rsb_deep_call() が32レベル深く再帰し、16エントリのRSBをオーバーフローさせる。再帰が巻き戻されると、RSBは空になる。 |
| 2. フォールバック | RSBが空になると、CPUは ret のターゲットを予測するために分岐ターゲットバッファ (BTB) にフォールバックする — これは攻撃者によって汚染されうる。 |
| 3. ガジェット | ハイジャックされた投機的パスが gadget() を実行し、これが秘密のパスワードの1バイトを読み取り、それを使って probe_array をインデックスし、その配列の1ページをキャッシュに引き込む。 |
| 4. Flush+Reloadスパイ | 攻撃の前に、probe_array のすべてのページがキャッシュからフラッシュされる (_mm_clflush)。投機的ウィンドウが閉じた後、プログラムはすべての可能なバイト値へのアクセスを計測する (__rdtscp) — 高速に戻ってくるもの (キャッシュヒット) が秘密のバイトを明らかにする。 |
これを ROOT_PASSWORD のすべてのバイトに対して繰り返すことで、gadget() をアーキテクチャ上呼び出すことなく、秘密全体を再構築する。
| モード | アクセスレイテンシ | 結果 |
|---|---|---|
脆弱 (SECURE_MODE 未定義) | 約49サイクル (キャッシュヒット) | 秘密がバイト単位で漏洩し、赤い HIT! インジケータで確認される |
パッチ済み (SECURE_MODE 定義済み、_mm_lfence() 注入) | 150サイクル超 (キャッシュミス / ノイズ) | 攻撃失敗 — 出力は SAFE / Found: ??? を示す |
lfence は、後続の命令が実行される前にCPUにリターンアドレスを解決させることを強制し、ガジェットが秘密依存のメモリに触れる前に投機的ウィンドウを崩壊させる。
src/
retbleed.c # Full PoC: trigger, gadget, Flush+Reload spy, and lfence mitigation (toggle via SECURE_MODE)
docs/
Retbleed_Report.pdf # Full written report: methodology, related work, gem5 setup, results
Retbleed_Attack_Demonstration.pptx # Slide deck used to present the project
PoCは gem5 (DerivO3CPU、アウトオブオーダーモデル — インオーダーモデルは投機的実行を実装していないため必須) の下でビルドおよび計測された:
gcc -O0 -static -o retbleed src/retbleed.c
./build/X86/gem5.opt configs/deprecated/example/se.py \
--cpu-type=DerivO3CPU --caches --l2cache \
--l1d_size=64kB --l1i_size=64kB --cmd=retbleed
脆弱な動作とパッチ済みの動作を切り替えるには、retbleed.c の先頭にあるこの行をコメント/コメント解除する:
#define SECURE_MODE
このコードは実際のx86組み込み関数 (
_mm_clflush、__rdtscp、_mm_lfence) を使用しており、より迅速なデモのためにx86ハードウェア上でネイティブにコンパイルおよび実行することもできる (gcc -O0 -o retbleed src/retbleed.c) — 結果はホストCPU自身の緩和策 (eIBRS、マイクロコードパッチなど) によって変動するが、これはこの種のバグが2022年以降いかに徹底的にパッチされてきたかを示す有用な例でもある。
lfence) は、影響を受けるハードウェアで 14〜39%のパフォーマンスオーバーヘッド が計測された。