libsafeはCの標準関数のうち,よくバッファオーバーフローを起こすものを差し替えてバッファサイズをチェックする処理をしてくれるらしいので試してみた.
libsafeって何だ?
インストール
試してみる
libsafeって何だ?
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がチェックする関数を呼び出すサンプルを作成してみる.
#include "stdio.h"
#include "string.h"
int
main(int argc, char *argv[])
{
char buffer[512];
gets(buffer);
return 0;
}
コンパイルして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)