Transcript Slides

バッファ・オーバフロー・アタックを動的に
検出するセキュア・キャッシュ
~安全性と消費エネルギーのトレードオフ~
福岡大学/科学技術振興機構さきがけ
井上弘士
安全で安定した情報化社会シス
テムの実現に向けて

安全性の向上(特にウィルス問題)




ホームサーバ
毎月800の新種ウィルスが誕生(*)
気づかないうちに侵入して突然暴走
個人の財産に対する直接的な脅威
次世代
携帯端末
低消費エネルギー化



バッテリ寿命の延長
利用者数の爆発
地球規模でのエネルギー問題
情報サービス会社
センサ
R F ID タ グ
(*)板倉正俊「インターネット・セキュリティとは何か」日経BP社

バッファ・オーバフロー



最も多く活用される脆弱性の1つ
Blaster@2003, CodeRed@2001
戻りアドレスの改ざん


プログラム実行制御の乗っ取り
解決策

Static:→コード解析や再コンパイル



SASI[WNSP99]
StakcGuard[USENIX98]
Dynamic:



バッファ・オーバフローを含む警告
の割合(%)
バッファ・オーバフロー攻撃
60
50
40
30
20
10
0
1996 1997 1998 1999 2000 2001
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.
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へ設定
プログラム実行の乗っ取り
関数呼出し側ではなく悪質コードを実行
関数呼出し/復帰時の動作
実行
コード
処理
手順
int f ( ) {
…
g (s1);
…
}
int g ( char *s1) {
char buf [10];
…
strcpy(buf, s1);
…
}
1.
2.
3.
4.
関数f ( )の実行
関数g( )の呼出し
文字列コピー
関数f( )へ復帰
関数呼出し/復帰時の動作
実行
コード
処理
手順
int f ( ) {
…
g (s1);
…
}
int g ( char *s1) {
char buf [10];
…
strcpy(buf, s1);
…
}
1.
2.
3.
4.
関数f ( )の実行
関数g( )の呼出し
文字列コピー
関数f( )へ復帰
上位アドレス
FP
s1
g()呼出し
戻りアドレス
の次命令
スタックの
伸張
FP退避
ローカル変数
buf
SP
下位アドレス
関数呼出し時の
スタック
正常時
関数呼出し/復帰時の動作
実行
コード
処理
手順
int f ( ) {
…
g (s1);
…
}
int g ( char *s1) {
char buf [10];
…
strcpy(buf, s1);
…
}
1.
2.
3.
4.
関数f ( )の実行
関数g( )の呼出し
文字列コピー
関数f( )へ復帰
上位アドレス
FP
s1
g()呼出し
戻りアドレス
の次命令
スタックの
伸張
FP退避
ローカル変数
buf
文字列
SP
下位アドレス
関数呼出し時の
スタック
正常時
関数呼出し/復帰時の動作
実行
コード
処理
手順
int f ( ) {
…
g (s1);
…
}
int g ( char *s1) {
char buf [10];
…
strcpy(buf, s1);
…
}
1.
2.
3.
4.
関数f ( )の実行
関数g( )の呼出し
文字列コピー
関数f( )へ復帰
上位アドレス
FP
s1
g()呼出し
戻りアドレス
の次命令
スタックの
伸張
FP退避
ローカル変数
buf
文字列
SP
下位アドレス
関数呼出し時の
スタック
正常時
スタック・スマッシングによる実
行制御の乗っ取り
実行
コード
処理
手順
int f ( ) {
…
g (s1);
…
}
int g ( char *s1) {
char buf [10];
…
strcpy(buf, s1);
…
}
1.
2.
3.
4.
関数f ( )の実行
関数g( )の呼出し
文字列コピー
関数f( )へ復帰
上位アドレス
FP
s1
g()呼出し
戻りアドレス
の次命令
スタックの
伸張
FP退避
ローカル変数
buf
文字列
SP
下位アドレス
関数呼出し時の
スタック
正常時
スタック・スマッシングによる実
行制御の乗っ取り
実行
コード
処理
手順
int f ( ) {
…
g (s1);
…
}
int g ( char *s1) {
char buf [10];
…
strcpy(buf, s1);
…
}
1.
2.
3.
4.
関数f ( )の実行
関数g( )の呼出し
文字列コピー
関数f( )へ復帰
上位アドレス
上位アドレス
FP
FP
s1
g()呼出し
戻りアドレス
の次命令
スタックの
伸張
FP退避
スタックの
伸張
FP退避
ローカル変数
ローカル変数
buf
buf
文字列
SP
下位アドレス
s1
g()呼出し
戻りアドレス
の次命令
SP
関数呼出し時の
スタック
異常時
下位アドレス
関数呼出し時の
スタック
正常時
スタック・スマッシングによる実
行制御の乗っ取り
実行
コード
処理
手順
int f ( ) {
…
g (s1);
…
}
int g ( char *s1) {
char buf [10];
…
strcpy(buf, s1);
…
}
1.
2.
3.
4.
関数f ( )の実行
関数g( )の呼出し
文字列コピー
関数f( )へ復帰
上位アドレス
上位アドレス
FP
FP
s1
攻撃コー
g()呼出し
戻りアドレス
ドの先頭
の次命令
スタックの
伸張
FP退避
s1
g()呼出し
戻りアドレス
の次命令
スタックの
伸張
攻撃
ローカル変数
コード
ローカル変数
buf
SP
下位アドレス
FP退避
buf
文字列
SP
関数呼出し時の
スタック
異常時
下位アドレス
関数呼出し時の
スタック
正常時
スタック・スマッシングによる実
行制御の乗っ取り
実行
コード
処理
手順
int f ( ) {
…
g (s1);
…
}
int g ( char *s1) {
char buf [10];
…
strcpy(buf, s1);
…
}
1.
2.
3.
4.
関数f ( )の実行
関数g( )の呼出し
文字列コピー
関数f( )へ復帰
上位アドレス
上位アドレス
FP
FP
s1
攻撃コー
戻りアドレス
ドの先頭
スタックの
伸張
FP退避
s1
g()呼出し
戻りアドレス
の次命令
スタックの
伸張
攻撃
ローカル変数
コード
ローカル変数
buf
SP
下位アドレス
FP退避
buf
文字列
SP
関数呼出し時の
スタック
異常時
下位アドレス
関数呼出し時の
スタック
正常時
発表手順




はじめに
バッファ・オーバフロー・アタック
セキュア・キャッシュ・アーキテクチャ
評価




実験環境と評価モデル
安全性と消費エネルギー
性能オーバヘッド
おわりに
動的な戻りアドレス改ざん検出
~Secure Cache: SCache~

問題点:


解決策:



スタックに書込んだ戻りアドレスが改ざんされる
主記憶スタックに書込む前に必ずキャッシュにストア
キャッシュで戻りアドレスを保護しよう!
手段:



戻りアドレス書込み時に複製(レプリカ・ライン)を作成
戻りアドレス読出し時に複製と比較
不一致であれば戻りアドレス改ざん発生と判定
内部構成
レプリカ・フラグ
R-flag (1b)
tag
way0
Ref. Addr.
Index
Tag
Offset
Data (Ret. Addr.)
way1
way2
way3
ML
RL
RL
master
Tag Match
&& R-flag
Tag Match
&& no R-flag
RL: Replica Line
ML: Master Line
ヒット条件
HIT?
Store (push)
Data (Ret. Addr.)
Word-Data
Match
Safe?
replica
data
(line)
レプリカ・ライン
用選択回路
replica
Replica-MUX
Read-MUX
ワード比較器
(32b)
Load (pop)
動作(戻りアドレス書込み時)
RL: Replica Line
ML: Master Line
キャッシュ・アクセス
(戻りアドレス)
Store
no
yes
Load
Original
Data
Replica
tag
Store?
way0
戻りアドレスをMLへストア
全てのウェイからラインを読出し
(MLから戻りアドレス値を出力)
同一タグのRLが存在する
場合は上書き
RLヒット(タグ比較)
way1
way2
data
(line)
no
R-flag
yes
no
RL数=Nrepとなるまで新
規RLを作成
way3
Replica-MUX
戻りアドレス一致
yes
Read-MUX
Word-Data
Match
正常終了
危険異常終了
キャッシュ・ヒット時
安全正常終了
危険正常終了
Data (Ret. Addr.)
Safe?
生成レプリカ数(Nrep)=2の場合
動作(戻りアドレス読出し時)
RL: Replica Line
ML: Master Line
キャッシュ・アクセス
(戻りアドレス)
Store
no
yes
Load
tag
Store?
way0
戻りアドレスをMLへストア
全てのウェイからラインを読出し
(MLから戻りアドレス値を出力)
同一タグのRLが存在する
場合は上書き
RLヒット(タグ比較)
way1
危険異常終了
キャッシュ・ヒット時
安全正常終了
data
(line)
Replica
Replica-MUX
戻りアドレス一致
yes
way3
R-flag
no
RL数=Nrepとなるまで新
規RLを作成
way2
no
yes
正常終了
Data
Original
危険正常終了
Data (Ret. Addr.)
Read-MUX
Word-Data
Match
Safe?
生成レプリカ数(Nrep)=2の場合
SCacheの特徴(利点と欠点)
Pros

戻りアドレス改ざんの動的検
出が可能




ただし、レプリカ・ラインが存在
する場合のみ
プロセッサの内部構成へ与え
る影響は極めて小さい
アクセス時間/面積オーバヘッ
ドは極めて小さい
レプリカ数を変更可能

安全性と消費エネルギーのバ
ランスを決定可能
Cons

レプリカ作成に伴うヒット率の
低下



平均メモリアクセス時間の増大
下位階層メモリへのアクセス消
費エネルギー増大
レプリカ作成に伴う消費エネ
ルギーの増加



書込みエネルギーの増大
ライトバック・エネルギーの増大
読出しエネルギーの増大(他低
消費電力キャッシュと比較して)
SCacheの設計選択肢

レプリカ・ラインのキャッシュ滞在期間を延長
(→安全性の向上)

レプリカ・ライン数の増加


最大 W-1個まで(Wはキャッシュの連想度)
レプリカ・ラインの配置アルゴリズム



LRU
MRU
追出し禁止(この場合はレプリカ・ラインの開放が必要)
発表手順




はじめに
バッファ・オーバフロー・アタック
セキュア・キャッシュ・アーキテクチャ
評価




実験環境と評価モデル
安全性と消費エネルギー
性能オーバヘッド
おわりに
評価環境
消費エネルギー
安全性/消費エネルギー/性能

SimpleScalar3.0





16KB 4-way Dキャッシュ
ラインサイズ:32B
アウト・オブ・オーダ実行



SPEC2000



7個のintプログラム
4個のfpプログラム
Small input(完全実行)
4KB SRAM設計

0.18μm CMOSプロセス
16KBキャッシュの1ウェイ
8bメモリセルが1個のラッチ
型センスアンプを共有
Hspiceシミュレーション


カスタム・レイアウトと容量抽
出(周辺回路は含まない)
ビット当たりのアクセス消費
エネルギー測定
評価モデル
評価対象モデル
モデル レプリカ生成ポリシ
LRU1R
LRU2R
MRU1R
MRU2R
ALL
CONV
配置
LRU
LRU
MRU
MRU
-----
数
1
2
1
2
3
MRUウェイ予測
危険度
Vulnerability = (Nv-rald / Nrald) * 100
安全性を保障できない
戻りアドレス・ロード回数
全戻りアドレス
ロード回数
消費エネルギー
Etotal = Erd + Ewt + Ewb + Emp
読出し 書込み
キャッシュ・ミス
レプリカ生成に伴う
ライトバック
実験結果(危険度)
5.4%
3.0%
LRU1R
LRU2R
MRU1R
MRU2R
ALL
Vulnerability
2.5%
2.0%
1.5%
1.0%
0.5%
0.0%
16
4
z
.g
ip
17
v
5.
pr
17
g
6.
cc
18
1
.m
cf
1
.
97
p
s
ar
er
2
.
55
v
t
or
ex
25
6
z
.b
ip
7
17
.m
es
Benchmarks
a
17
a
9.
rt
3
18
.e
a
qu
ke
18
8.
am
m
p
ALL: 99.3%以上の戻りアドレス・ロードを保護
MRU1R: 88.5%以上の戻りアドレス・ロードを保護
実験結果(消費エネルギー)
Energy Overhead
25%
LRU1R
LRU2R
MRU1R
MRU2R
ALL
20%
15%
10%
5%
0%
16
g
4.
zi
p
17
v
5.
pr
17
g
6.
cc
18
m
1.
cf
1
.
97
p
s
ar
er
2
.
55
v
t
or
ex
25
b
6.
zi
p
7
17
.m
es
a
1
.
79
ar
t
3
18
.e
a
qu
ke
18
8.
am
m
p
Benchmarks
ALL: 最大23%のエネルギー増加
MRU1R: 最大9.9%のエネルギー増加
Normalized EV Product to
LRU1R
実験結果(EV積)
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
16
g
4.
LRU2R
MRU1R
MRU2R
ALL
zi
p
17
v
5.
pr
17
g
6.
cc
18
m
1.
cf
19
p
7.
s
ar
er
25
v
5.
t
or
ex
25
6
z
.b
ip
7
17
.m
es
Benchmarks
a
17
a
9.
rt
18
e
3.
q
k
ua
1
e
.
88
am
m
p
実験結果(性能オーバヘッド)
1.2%
Performance
Overhead
1.0%
LRU1R
LRU2R
MRU1R
MRU2R
ALL
0.8%
0.6%
0.4%
0.2%
0.0%
4
16
z
.g
ip
17
v
5.
pr
c
.g
c
.m
cf
e
rs
r
e
rt
x
i
bz
p
es
a
a
9.
rt
k
ua
e
6 81
a vo
6 . 7 .m 1 7
q
am
7
.
p
5
.
.
e
1
1 97 55
2
3. 188
17
8
1
2
1
m
p
Benchmarks
MRU1R: 最大0.1%の性能低下
ALL: 最大1.1%の性能低下
発表手順




はじめに
バッファ・オーバフロー・アタック
セキュア・キャッシュ・アーキテクチャ
評価




実験環境と評価モデル
安全性と消費エネルギー
性能オーバヘッド
おわりに
おわりに

まとめ


SCache:関数戻りアドレス改ざんを動的に検出
安全性、消費エネルギー、性能オーバヘッドの評価

安全性重視型:ALLモデル



消費エネルギー重視型:MRU1Rモデル



多くのプログラム(9/11)で99.3%以上の戻りアドレスロードを保護
最大で23%のキャッシュ消費エネルギー増加
多くのプログラムで(9/11)で98.5%以上の戻りアドレスロードを保護
最大で9.9%のキャッシュ消費エネルギー増加
今後の課題



脆弱性を含む実アプリケーションでの評価
SCacheの完全設計
適切なレプリカ・ライン数を決定する最適化手法の確立
(動的/静的)
Back-Up Slides …
キャッシュ・ミス率
IRA: Issued Return Address
CA: Cache Access
Miss Rate (%)
LRU2 MRU1 MRU2
CONV LRU1R
R
R
R
ALL
#IRA Load
(#IRA/#CA)
164.gzip
5.22
5.22
5.22
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.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.31
2.32
2.31
2.32
2.45
18,147,017 (0.8%)
177.mesa
0.14
0.15
0.16
0.15
0.16
1.08
4,727,396 (1.0%)
42.93 42.93 42.93
42.93
42.93
32,466 (0.004%)
2.45
2.47
2.52
3,580,827 (0.8%)
36.28 36.31 36.28
36.30
36.38
6,307,839 (0.6%)
179.art
42.93
183.equake
2.44
188.ammp
36.27
2.44
2.46
Cache Design (0.18μm CMOS)
実験結果(消費エネルギー内訳)
Normalized Energy
1.2
Emp
Ewb
Ewt
Erd
CONV
LRU1R
LRU2R
MRU1R
MRU2R
ALL
1.4
1
0.8
0.6
0.4
0.2
0
181.mcf
197.parser
255.vortex
177.mesa
Benchmarks
179.art
183.equake
こんなご経験はありませんか?