バッファ・オーバフロー・アタックを動的に 検出するセキュア・キャッシュ ~安全性と消費エネルギーのトレードオフ~ 福岡大学/科学技術振興機構さきがけ 井上弘士
安全で安定した情報化社会システムの実現に向けて 安全性の向上(特にウィルス問題) 毎月800の新種ウィルスが誕生(*) 気づかないうちに侵入して突然暴走 個人の財産に対する直接的な脅威 低消費エネルギー化 バッテリ寿命の延長 利用者数の爆発 地球規模でのエネルギー問題 (*)板倉正俊「インターネット・セキュリティとは何か」日経BP社
バッファ・オーバフロー攻撃 バッファ・オーバフロー 解決策 最も多く活用される脆弱性の1つ CERTバッファ・オーバフロー勧告 R.B.Lee, D.K.Karig, J.P.McGregor, and Z.Shi, “Enlisting Hardware Architecture to Thwart Malicious Code Injection,” Proc. of the Int. Conf. on Security in Pervasive Computing, Mar. 2003. バッファ・オーバフロー 最も多く活用される脆弱性の1つ Blaster@2003, CodeRed@2001 戻りアドレスの改ざん プログラム実行制御の乗っ取り 解決策 Static:→コード解析や再コンパイル SASI[WNSP99] StakcGuard[USENIX98] Dynamic: SW: LibSafe, LibVerify[USENIX00] →ライブラリの更新、性能オーバヘッド SW: StackGhost[USENIX01] →SPARCアーキテクチャ特有 HW: SRAS[SPC03] →プロセッサ内部の変更、LIFO動作のみHWで対応
本研究のポイント 戻りアドレス改ざんの新しい動的検出方式を提案 安全性と消費エネルギーに関する定量的評価 Dynamic+HWアプローチ→コード互換性を完全保障 キャッシュでの実装(1)→プロセッサとの分離 キャッシュでの実装(2)→大容量、ランダム・アクセス キャッシュでの実装(3) →コスト削減 安全性と消費エネルギーに関する定量的評価 ベンチマークを用いたプロセッサ・シミュレーション 0.18μm CMOSプロセスを用いたSRAM設計に基づく消費エネルギーの測定 安全性/消費エネルギーのトレードオフ解析
発表手順 はじめに バッファ・オーバフロー・アタック セキュア・キャッシュ・アーキテクチャ 評価 おわりに 実験環境と評価モデル 安全性と消費エネルギー 性能オーバヘッド おわりに
バッファ・オーバフロー・アタック スタックの破壊(スタック・スマッシング) データ境界を越えた書込み 悪質コードへ制御が移行 悪質コードの挿入 戻りアドレスの改ざん データ境界を越えた書込み C標準ライブラリ内に存在(strcpyなど) 多くのシステムが有する脆弱性 悪質コードへ制御が移行 改ざん後の戻りアドレスがPCへ設定 プログラム実行の乗っ取り 関数呼出し側ではなく悪質コードを実行
関数呼出し/復帰時の動作 関数f ( )の実行 関数g( )の呼出し 文字列コピー 関数f( )へ復帰 int f ( ) { … g (s1); } int g ( char *s1) { char buf [10]; strcpy(buf, s1); 実行 コード 関数f ( )の実行 関数g( )の呼出し 文字列コピー 関数f( )へ復帰 処理 手順
関数呼出し/復帰時の動作 正常時 関数f ( )の実行 関数g( )の呼出し 文字列コピー 関数f( )へ復帰 int f ( ) { … g (s1); } int g ( char *s1) { char buf [10]; strcpy(buf, s1); 正常時 g()呼出し の次命令 実行 コード 関数f ( )の実行 関数g( )の呼出し 文字列コピー 関数f( )へ復帰 処理 手順
関数呼出し/復帰時の動作 正常時 関数f ( )の実行 関数g( )の呼出し 文字列コピー 関数f( )へ復帰 int f ( ) { … g (s1); } int g ( char *s1) { char buf [10]; strcpy(buf, s1); 正常時 g()呼出し の次命令 実行 コード 文字列 関数f ( )の実行 関数g( )の呼出し 文字列コピー 関数f( )へ復帰 処理 手順
関数呼出し/復帰時の動作 正常時 関数f ( )の実行 関数g( )の呼出し 文字列コピー 関数f( )へ復帰 int f ( ) { … g (s1); } int g ( char *s1) { char buf [10]; strcpy(buf, s1); g()呼出し の次命令 実行 コード 文字列 関数f ( )の実行 関数g( )の呼出し 文字列コピー 関数f( )へ復帰 処理 手順 正常時
スタック・スマッシングによる実行制御の乗っ取り int f ( ) { … g (s1); } int g ( char *s1) { char buf [10]; strcpy(buf, s1); 正常時 文字列 g()呼出し の次命令 実行 コード 関数f ( )の実行 関数g( )の呼出し 文字列コピー 関数f( )へ復帰 処理 手順
スタック・スマッシングによる実行制御の乗っ取り int f ( ) { … g (s1); } int g ( char *s1) { char buf [10]; strcpy(buf, s1); 異常時 正常時 文字列 g()呼出し の次命令 g()呼出し の次命令 実行 コード 関数f ( )の実行 関数g( )の呼出し 文字列コピー 関数f( )へ復帰 処理 手順
スタック・スマッシングによる実行制御の乗っ取り int f ( ) { … g (s1); } int g ( char *s1) { char buf [10]; strcpy(buf, s1); 異常時 g()呼出し の次命令 正常時 文字列 g()呼出し の次命令 攻撃コー ドの先頭 攻撃 コード 実行 コード 関数f ( )の実行 関数g( )の呼出し 文字列コピー 関数f( )へ復帰 処理 手順
スタック・スマッシングによる実行制御の乗っ取り int f ( ) { … g (s1); } int g ( char *s1) { char buf [10]; strcpy(buf, s1); 異常時 正常時 文字列 g()呼出し の次命令 攻撃コー ドの先頭 攻撃 コード 実行 コード 関数f ( )の実行 関数g( )の呼出し 文字列コピー 関数f( )へ復帰 処理 手順
発表手順 はじめに バッファ・オーバフロー・アタック セキュア・キャッシュ・アーキテクチャ 評価 おわりに 実験環境と評価モデル 安全性と消費エネルギー 性能オーバヘッド おわりに
動的な戻りアドレス改ざん検出 ~Secure Cache: SCache~ 問題点: スタックに書込んだ戻りアドレスが改ざんされる 解決策: 主記憶スタックに書込む前に必ずキャッシュにストア キャッシュで戻りアドレスを保護しよう! 手段: 戻りアドレス書込み時に複製(レプリカ・ライン)を作成 戻りアドレス読出し時に複製と比較 不一致であれば戻りアドレス改ざん発生と判定
内部構成 レプリカ・フラグ(1b) レプリカ・ライン用選択回路 ヒット条件 ワード比較器(32b)
動作(戻りアドレス書込み時) Original Replica 生成レプリカ数(Nrep)=2の場合 キャッシュ・ヒット時
動作(戻りアドレス読出し時) Original Replica 生成レプリカ数(Nrep)=2の場合 キャッシュ・ヒット時
SCacheの特徴(利点と欠点) Pros Cons 戻りアドレス改ざんの動的検出が可能 レプリカ数を変更可能 ただし、レプリカ・ラインが存在する場合のみ プロセッサの内部構成へ与える影響は極めて小さい アクセス時間/面積オーバヘッドは極めて小さい レプリカ数を変更可能 安全性と消費エネルギーのバランスを決定可能 レプリカ作成に伴うヒット率の低下 平均メモリアクセス時間の増大 下位階層メモリへのアクセス消費エネルギー増大 レプリカ作成に伴う消費エネルギーの増加 書込みエネルギーの増大 ライトバック・エネルギーの増大 読出しエネルギーの増大(他低消費電力キャッシュと比較して)
SCacheの設計選択肢 レプリカ・ラインのキャッシュ滞在期間を延長 レプリカ・ライン数の増加 レプリカ・ラインの配置アルゴリズム (→安全性の向上) レプリカ・ライン数の増加 最大 W-1個まで(Wはキャッシュの連想度) レプリカ・ラインの配置アルゴリズム LRU MRU 追出し禁止(この場合はレプリカ・ラインの開放が必要)
発表手順 はじめに バッファ・オーバフロー・アタック セキュア・キャッシュ・アーキテクチャ 評価 おわりに 実験環境と評価モデル 安全性と消費エネルギー 性能オーバヘッド おわりに
評価環境 SimpleScalar3.0 SPEC2000 4KB SRAM設計 Hspiceシミュレーション 安全性/消費エネルギー/性能 16KB 4-way Dキャッシュ ラインサイズ:32B アウト・オブ・オーダ実行 SPEC2000 7個のintプログラム 4個のfpプログラム Small input(完全実行) 4KB SRAM設計 0.18μm CMOSプロセス 16KBキャッシュの1ウェイ 8bメモリセルが1個のラッチ型センスアンプを共有 Hspiceシミュレーション カスタム・レイアウトと容量抽出(周辺回路は含まない) ビット当たりのアクセス消費エネルギー測定
評価モデル 危険度 評価対象モデル 消費エネルギー モデル レプリカ生成ポリシ 配置 数 LRU1R LRU 1 LRU2R 2 MRU1R Vulnerability = (Nv-rald / Nrald) * 100 モデル レプリカ生成ポリシ 配置 数 LRU1R LRU 1 LRU2R 2 MRU1R MRU MRU2R ALL ----- 3 CONV MRUウェイ予測 安全性を保障できない 戻りアドレス・ロード回数 全戻りアドレス ロード回数 消費エネルギー Etotal = Erd + Ewt + Ewb + Emp 読出し 書込み キャッシュ・ミス レプリカ生成に伴う ライトバック
実験結果(危険度) LRU1R LRU2R MRU1R MRU2R ALL ALL: 99.3%以上の戻りアドレス・ロードを保護 5.4% LRU1R LRU2R MRU1R MRU2R ALL MRU1R: 88.5%以上の戻りアドレス・ロードを保護 ALL: 99.3%以上の戻りアドレス・ロードを保護
実験結果(消費エネルギー) LRU1R LRU2R MRU1R MRU2R ALL ALL: 最大23%のエネルギー増加
実験結果(EV積) LRU2R MRU1R MRU2R ALL
実験結果(性能オーバヘッド) LRU1R LRU2R MRU1R MRU2R ALL ALL: 最大1.1%の性能低下
発表手順 はじめに バッファ・オーバフロー・アタック セキュア・キャッシュ・アーキテクチャ 評価 おわりに 実験環境と評価モデル 安全性と消費エネルギー 性能オーバヘッド おわりに
おわりに まとめ 今後の課題 SCache:関数戻りアドレス改ざんを動的に検出 安全性、消費エネルギー、性能オーバヘッドの評価 安全性重視型:ALLモデル 多くのプログラム(9/11)で99.3%以上の戻りアドレスロードを保護 最大で23%のキャッシュ消費エネルギー増加 消費エネルギー重視型:MRU1Rモデル 多くのプログラムで(9/11)で98.5%以上の戻りアドレスロードを保護 最大で9.9%のキャッシュ消費エネルギー増加 今後の課題 脆弱性を含む実アプリケーションでの評価 SCacheの完全設計 適切なレプリカ・ライン数を決定する最適化手法の確立(動的/静的)
Back-Up Slides …
キャッシュ・ミス率 IRA: Issued Return Address CA: Cache Access Miss Rate (%) #IRA Load (#IRA/#CA) CONV LRU1R LRU2R MRU1R MRU2R ALL 164.gzip 5.22 5.23 5.25 4,930,467 (0.3%) 175.vpr 3.53 3.56 3.63 3.59 3.66 3.74 5,627,709 (4.3%) 176.gcc 4.26 4.29 4.37 4.33 4.43 4.64 37,519,156 (2.0%) 181.mcf 20.02 20.03 20.05 20.06 20.10 992,419 (0.3%) 197.parser 4.13 4.18 4.44 4.23 4.55 5.07 45,466,527 (3.0%) 255.vortex 1.75 1.79 1.91 1.82 1.94 2.32 22,101,265 (2.1%) 256.bzip 2.31 2.45 18,147,017 (0.8%) 177.mesa 0.14 0.15 0.16 1.08 4,727,396 (1.0%) 179.art 42.93 32,466 (0.004%) 183.equake 2.44 2.46 2.47 2.52 3,580,827 (0.8%) 188.ammp 36.27 36.28 36.31 36.30 36.38 6,307,839 (0.6%)
Cache Design (0.18μm CMOS)
実験結果(消費エネルギー内訳) LRU1R LRU2R MRU1R MRU2R CONV ALL Emp Ewb Ewt Erd
こんなご経験はありませんか?