高度な攻撃手法

ROPチェーン あーるおーぴーちぇーん

Return-Oriented ProgrammingバッファオーバーフローガジェットDEP/NXスタックエクスプロイト
ROPチェーンについて教えて

簡単に言うとこんな感じ!

プログラムの中にもともと存在する小さな命令の断片(ガジェット)をドミノ倒しみたいにつなげて、セキュリティ防御をすり抜けながら悪意のある動作を実行する高度な攻撃手法だよ!「自前のコードは一切持ち込まない」のがミソなんだ!


ROPチェーンとは

ROP(Return-Oriented Programming)チェーンとは、攻撃者がターゲットのプログラム内にすでに存在するコード断片(ガジェット)を組み合わせて、任意の悪意ある処理を実行する攻撃手法です。「チェーン」という名の通り、複数のガジェットを数珠つなぎにつなぎ合わせることで、攻撃者が意図する動作を作り出します。

この手法が登場した背景には、DEP(Data Execution Prevention)NX(No-Execute)ビット といったセキュリティ機構があります。これらはスタックやヒープ領域に注入したコードを直接実行させないための防御策ですが、ROPチェーンはプログラム本体の実行可能領域(テキストセグメント)内のコードを間接的に利用するため、この防御を巧みに回避できます。

実務上、ROPチェーンはバッファオーバーフロー脆弱性などと組み合わせて使われることが多く、システムへの不正侵入・権限昇格・シェルコード実行などを引き起こす可能性があります。OS・ブラウザ・組み込みデバイスなど幅広いターゲットに対して使われる、現代のエクスプロイト技術の中核的な手法のひとつです。


ROPチェーンの仕組み

ROPチェーンを理解するには「ガジェット」と「スタック操作」の概念が鍵になります。

用語意味
ガジェットプログラム中に存在する「数命令 + RET命令」で終わる小さなコード断片
RET命令スタックの先頭アドレスにジャンプする命令。ガジェットの連鎖に利用される
スタック関数呼び出し時に使われるメモリ領域。ROPではここにガジェットのアドレスを並べる
チェーン複数のガジェットをRET命令でつないだ一連の流れ
ペイロードスタックに書き込むガジェットアドレス列(攻撃データ)のこと

攻撃の流れをざっくり示すと以下のようになります:

[通常の関数呼び出し]
  スタック: [戻りアドレス] → 正規の関数へ戻る

[ROPチェーン攻撃]
  スタックを改ざん:
  ┌───────────────────────────────────┐
  │ ガジェット1のアドレス             │ ← RETで飛ぶ先
  │ ガジェット2のアドレス             │ ← ガジェット1のRETで飛ぶ先
  │ ガジェット3のアドレス             │ ← ガジェット2のRETで飛ぶ先
  │ ...                               │
  │ システムコール等の最終目的アドレス │
  └───────────────────────────────────┘
  → それぞれのガジェットが数命令だけ実行してRETで次へ渡す
  → 全体として攻撃者が望む処理が完成する

「借りてきた道具だけで料理する」と覚えよう

ROPは「自前の武器(注入コード)を使わず、家にある包丁(プログラム内のガジェット)だけで料理(攻撃)する」イメージです。防御側が「外から持ち込んだ刃物はすべて没収」(DEP/NX)しても、家の包丁は没収できない——そこを突く手法です。

ガジェットの種類

ガジェットの種類命令例用途
レジスタ設定pop rdi; ret引数をレジスタに設定する
メモリ読み書きmov [rdi], rax; ret任意アドレスへの書き込み
算術演算add rax, 1; ret値の計算
システムコールsyscall; retOSへの命令(シェル起動など)
スタック移動add rsp, 8; retスタックポインタの調整

歴史と背景

  • 2000年代前半:バッファオーバーフロー攻撃への対策としてDEP(NXビット)が普及。スタックに注入したシェルコードを直接実行する古典的手法が封じられる
  • 2001年頃:「ret2libc」攻撃が登場。標準ライブラリ(libc)の関数アドレスへ直接リターンする手法でDEPを回避
  • 2007年:Hovav Shacham氏が論文 “The Geometry of Innocent Flesh on the Bone: Return-into-libc without Function Calls” を発表し、ROPの概念を体系化
  • 2008〜2010年代:ROPがエクスプロイト開発の標準技術に。MetasploitなどのツールにもROPガジェット検索機能が搭載される
  • 2010年ASLR(Address Space Layout Randomization) の普及によりROPも困難化するが、情報リーク脆弱性と組み合わせることで突破する手法が確立
  • 2014年以降:JIT(Just-In-Time)コンパイラを利用した JIT-ROP や、Blindな状態でROPを構築する技術が登場
  • 現在CFI(Control Flow Integrity)CET(Control-flow Enforcement Technology) など新世代の防御技術との攻防が続く

関連する防御技術との比較

ROPチェーンはさまざまな防御技術と対になって理解すると整理しやすいです。

防御技術何をするかROPへの有効性
DEP / NXデータ領域のコード実行禁止ROPで回避される(起源)
ASLRメモリ配置をランダム化部分的に有効。情報リークで突破される
Stack Canaryスタック改ざん検出ROPはカナリアを回避できる場合がある
CFI制御フローを正規のものに制限ROPに有効。ただし実装コストが高い
CET(Intel)シャドースタックでRETを検証ROPに対し強力な防御
PIE(ASLR+PIE)実行ファイルもランダム配置ガジェットアドレス特定を困難化

以下の図は、ROPチェーンがどのセキュリティ層をすり抜け、どの防御技術が対抗するかを示しています。

ROPチェーンと防御技術の関係 攻撃の段階 ① 脆弱性の発見 バッファオーバーフローなど ② ガジェット探索 ROPgadget等のツールで自動収集 ③ チェーン構築 スタックにアドレス列を並べる ④ ペイロード注入 DEP/NXを回避して実行 ⑤ 任意コード実行 シェル取得・権限昇格など 対抗する防御技術 Stack Canary / FORTIFY スタック破壊の検出 ASLR / PIE アドレスのランダム化 CFI / SafeStack 制御フローの正規性検証 DEP / NX ビット データ領域の実行禁止 Intel CET / シャドースタック RET先アドレスの二重検証 vs vs vs vs vs 攻撃の各段階に対応する防御技術が存在する

関連する規格・RFC

規格・文書内容
CWE-121Stack-based Buffer Overflow(ROPの前提となる脆弱性の分類)
CWE-470Use of Externally-Controlled Input to Select Classes or Code(関連する制御フロー問題)

関連用語

  • バッファオーバーフロー — ROPチェーンの足がかりとなる代表的なメモリ脆弱性
  • DEP/NXビット — データ領域でのコード実行を禁止するセキュリティ機構。ROPが回避しようとする防御
  • ASLR — メモリ配置をランダム化してROPのガジェットアドレス特定を困難にする技術
  • シェルコード — 攻撃者が実行させたい悪意あるコード。ROPはシェルコードの代替手段として登場した
  • スタック — ROPチェーンの舞台となるメモリ構造
  • エクスプロイト — 脆弱性を突いて攻撃を成立させるコードや手順の総称
  • CFI(制御フロー完全性) — ROPを含む制御フロー乗っ取り攻撃に対抗する防御技術
  • 脆弱性スキャン — ROPの前提となる脆弱性を事前に検出するセキュリティ活動