ファイヤープロジェクト
libsafeを使ってみる
2007-04-17T20:50+09:00   matsu
libsafeはCの標準関数のうち,よくバッファオーバーフローを起こすものを差し替えてバッファサイズをチェックする処理をしてくれるらしいので試してみた.
libsafeはベル研がLinux向けに開発した,バッファオーバフロー対策用のライブラリらしい. 詳細はこの辺に書いてあるが,とにかくCの標準ライブラリがバッファのオーバーフローチェックをしてないからダメなんじゃないか,だったらそういうライブラリを作って差し替えようとか,そういう感じらしい.
では,libsafeをインストールしてみる. まず,この辺からソースをダウンロードする. あとは,展開してmake.
# tar zxvf libsafe-2.0-16.tgz
# cd libsafe-2.0-16
# make install 
cd src; make install
make[1]: Entering directory `/home/matsu/usr/local/src/libsafe-2.0-16/src'
gcc -c -o util.o -O2 -Wall -fPIC -DLIBSAFE_VERSION=\"2.0.16\"  util.c
util.c: In function '_libsafe_warn':
util.c:1428: warning: 'maps' may be used uninitialized in this function
gcc -c -o intercept.o -O2 -Wall -fPIC -DLIBSAFE_VERSION=\"2.0.16\"  intercept.c
gcc -o libsafe.so.2.0.16 -shared -Wl,-soname,libsafe.so.2 -ldl  util.o intercept.o
ln -sf libsafe.so.2.0.16 libsafe.so
install libsafe.so.2.0.16 /lib 
/sbin/ldconfig
Type y for installing libsafe system wide?[default n] 
install ../doc/libsafe.8 /usr/share/man/man8
make[1]: Leaving directory `/home/matsu/usr/local/src/libsafe-2.0-16/src'
	
適当にlibsafeがチェックする関数を呼び出すサンプルを作成してみる.
コンパイルしてlddすると以下のようになる.
$ ldd sample
        linux-gate.so.1 =>  (0xffffe000)
        libc.so.6 => /lib/tls/libc.so.6 (0x4001d000)
        /lib/ld-linux.so.2 (0x40000000)
ここで,LD_PRELOADにlibsafeを設定してみる.
export LD_PRELOAD=libsafe.so.2
もう一度lddすると,libsafeがロードされるようになる.
$ ldd sample
        libsafe.so.2 => /lib/libsafe.so.2 (0x4001d000)
        linux-gate.so.1 =>  (0xffffe000)
        libc.so.6 => /lib/tls/libc.so.6 (0x40022000)
        libdl.so.2 => /lib/tls/libdl.so.2 (0x40154000)
        /lib/ld-linux.so.2 (0x40000000)
matsu(C)
Since 2002
Mail to matsu