バッファーオーバーフロー
プロテクションのFreeBSDへの対応について江藤博明
etoh@jp.ibm.com

バッファーオーバーフロー問題
今年見つかった、影響の大きいバッファーオーバーフロー
2001-05-01: Microsoft Windows 2000 IIS 5.0 IPP
ISAPI 'Host:' Buffer Overflow Vulnerability
2001-04-04: Ntpd Remote Buffer OverflowVulnerability
2001-01-29: ISC Bind 8 Transaction Signatures
Buffer Overflow Vulnerability

バッファーオーバーフローを利用した攻撃
SUIDプログラムへの攻撃
サーバープログラムへの攻撃
個人プログラムへの攻撃
HTMLコンテンツを利用しての攻撃

ユーザー権限の奪取プログラムの実行

スタック内のいろいろな攻撃方法
保護すべき場所
関数引数
戻りアドレス
フレームポインタ領域
ローカル変数int foo (void (*fn)()) {char* ptr = bar; /* bar: global string */char buf[128];*ptr = -1;
gets (buf);}
hsting growth
return address
previous frame pointerattackcode

fake frame
return address
P. F. P.

frame pointerg

stack pointer g

func. ptr.
return address
previous frame pointerpointer var.
buf
istack growthスタックを安全に利用するモデル
を安全に利用するモデル
A 配列やポインターを含まない
B 配列や配列を含む構造体だけC 配列を含まない。ポインターを含んでも良いhsting growthframe pointerg

stack pointer garguments (A)return address
previous frame pointerguard
arrays (B)local variables (C)istack growth

呼び出し側関数はバッファーオーバーフローに関して安全である。
The protection can be omitted for the function without string.

Stack Protection (1)防御用コードの自動挿入"Guard" をローカル変数として挿入
ストリング配列の有無で制御
foo () {volatile int Guard
char buf[128];
Guard = 'random number'gets (buf);
if (Guard != 'random number')/* program halts */}hString
growtharguments...
return address
FPg prev. frame ptr.
Guard
local variables ...
local variables ...
buf[128]
iStackSPg
buf[128]
iStack
growthSPg
growthStack Protection (2)1. ローカル変数の位置を入れ替える
hString
growth

2. ポインター引数を配列の後ろへ
foo{
foo (int(int a,a, voidvoid (*fn1)())(*tmpfn1)()){
volatile int Guardvoid
char(*fn2)();
buf[128];
charbuf[128];
void (*fn2)();
void (*fn1)() = tmpfn1;

}

Guard
== 'randomnumber'
Guard'random
number'gets(buf);(*fn1)();(*fn2)();
gets(buf);(*fn1)();
gets (buf); (*fn1)(); (*fn2)();(*fn2)();
if (Guard != 'random number')if (Guard != 'random number')/* program halts *//* program halts */

FPg

SPg
SPg
SPg

a
tmpfn1
fn1
return address
prev. frame ptr.
Guardfn2
buf[128]fn2
fn1iStackigrowth
Stackigrowth
Stackgrowth

Translation Details;; Function stkchk;; Function stkchk(note 2 0 3 "" NOTE̲INSN̲DELETED)(note 3 2 27 "" NOTE̲INSN̲FUNCTION̲BEG)(note 4 28 6 "" NOTE̲INSN̲DELETED)(note 6 4 9 0 NOTE̲INSN̲BLOCK̲BEG)(insn 9 6 12 (set (mem:SI (plus:SI (reg:SI 18)(const̲int -4)))(const̲int 0)) -1 (nil)(nil))(insn 12 9 14 (set (reg:SI 21)(plus:SI (reg:SI 18)(const̲int -132))) -1 (nil)(nil))(insn 14 12 16 (set (mem:SI (pre̲dec:SI (reg:SI 7 %esp)))(reg:SI 21)) -1 (nil)(nil))

code insertion
address modification
debug info. maintenance(note 2 0 3 "" NOTE̲INSN̲DELETED)(note 3 2 27 "" NOTE̲INSN̲FUNCTION̲BEG)(insn 27 3 28 (set (reg:SI 22)(mem:SI (symbol̲ref:SI ("̲̲canary")))) -1 (nil)(nil))(insn 28 27 4 (set (mem/v:SI (plus:SI (reg:SI 18)(const̲int -4)))(reg:SI 22)) -1 (nil)(nil))(note 4 28 6 "" NOTE̲INSN̲DELETED)(note 6 4 9 0 NOTE̲INSN̲BLOCK̲BEG)(insn 9 6 12 (set (mem:SI (plus:SI (reg:SI 18)(const̲int -136)))(const̲int 0)) -1 (nil)(nil))(insn 12 9 14 (set (reg:SI 21)(plus:SI (reg:SI 18)(const̲int -132))) -1 (nil)(nil))(insn 14 12 16 (set (mem:SI (pre̲dec:SI (reg:SI 7 %esp)))(reg:SI 21)) -1 (nil)(nil))

攻撃耐性

ProgramDescription

Result of Attack Protected Result

xlockmore 3.10 Screen saver
root shell
Perl script lang. root shell
Perl 5.003
Mail agent
elm 2.003
root shell
SuperProbe2.11 Probes videoHW root shellxlockmore, Perl, elm exploits:
attacks against the return address
SuperProbe exploit:
attacks against argument

terminatedterminatedterminatedterminated他の防御法との比較
Description
None propolice libsafe StackGuard StackShieldProtection Effectiveness
return address
NoYes
Yes
Yes
Yes
prev. frame pointer
No
Yes
Yes
No
Yes
argument
No
Yes
Yes
NoNo
local variableNo
Yes
No
No
No
string overation coverage NoAll
Not allAll
All
Implementation characteristics
OS independence
Yes
NoYes
Yes
Processor independence
Yes
Yes
NoNo
Other characteristics
performance overhead
None Very low Very low
LowLowsource code needed
Yes
NoYesYes防御コード
防御コードのオーバーヘッドは？
Benchmark program:
50,000,000 runs on a 600 MHz Pentium III
int test(){char buf[128];
strcpy(buf, "1234567890");
return strncmp(buf, "1234", 4);}

Original
run time

propolice
run time

Overhead(%)

4.67 sec

5.05 sec8%

ストリング配列の使用率
Program# of function
Perl 5.005
9590
ctags
850
imapd 4.7-5
915
XFree86 3.3.6
22198
kernel 2.2.14
3881
egcs 1.1.2
27019
glibc 2.1.3
719

with string5442591145
112244106

ratio (%)
0.6%
0.5%
6.4%
5.1%
2.8%
0.9%
14.7%

Weak correlation to the actual execution ratio

No structure passing found as an argument

ベンチマーク
25original

propolice

libsafe

StackGuard

Execution Time (seconds)

20

15

10

50
perl

ctags

performance overhead:

imapd

propolice
libsafe
StackGuard

perl
4%
8%8%

ctags
1%
2%
3%

imapd
0%
0%
0%

ツールの公開場所
http://www.trl.ibm.com/projects/security/ssp
gcc-2.95.2, gcc-2.95.3, latest̲snapshotの差分
OS毎の手順

GCC使用方法
GCC オプション： -fstack-protector
オプションをつけない場合はオリジナルGCCと同じ動作プロテクト化のおねがい
多くのユーザーは自らビルドすることはない
個人用アプリケーションやベータコードのプ
ロテクトも必要ポートのプロテクト化
プロテクト化されたものの配布＊BSDのプロテクト化
プロセッサごとのテスﾄ確認されたプロセッサ： iX86, powerpc, sparc

オペレーティングシステムの移植概要
FreeBSD 4.3-release
カーネル、/usr/srcのプロテクト化完了

作業手順
GCCのパッチ当て
GCCのビルド＆インストール
カーネルへのパッチ作成、(10行程度）
シェアードライブラリへのパッチ作成
BUILD ALL

まとめ
バッファーオーバーフローの概要を話しました。
防御方法を提案しました。
バッファーオーバーフローに関して、防御したOSを皆さん作りませんか？