2007年3月11日日曜日

システムコール制限ツール



そろそろ名前を考えなきゃ。


やることは



cgiなどを動かすときにシステムコールをユーザ定義のスクリプトで制限できるとセキュアになってうれしい。


cgiの中身もそんなにかえることもなく、ユーザランドで動くものが欲しい。


使いかたのイメージとしてはcgiの先頭に 


#!/usr/bin/perl


とかく変わりに


#!/usr/bin/limit [制限条件] /usr/bin/perl


とすると、制限条件に違反するシステムこーるは実行できなくなる。


この制限はOSレベルでかかるので、バッファオーバーフローでやられても大丈夫なはず。






とりあえず実装方法として




  • 一番簡単なのは、アクセス違反をみつけたらプロセスを強制的に殺す。


ってのを考えてみたけど。。。cgiなんかに適用するとlockしっぱなしのファイルとかできていやげだね。


やっぱり




  • アクセス違反のシステムコールは失敗する。


のほうがスマートだね。


実際に制御したいのはopen,exec,socketぐらいなもんだとおもう。


で、このツールの元になるソースはFreeBSDのtrussコマンド





違反検知


違反検知はsyscall.cで行う。


i386_syscall_entryのところでeaxレジスタの中身でシステムコールの種類を取得しているので


それで各検知ハンドラを起動。


lseek(Procfd, parm_offset, SEEK_SET);


read(Procfd, &syscall_num, sizeof(int));


のところでスタックのなかみをコピーしてるので、その内容にぱたんまっちをかければよい


違反システムコールのreject方法


setup.cでopen("/proc/curproc/mem", O_WRONLY);してるのをReadwriteに書き換えておく。


引数が無効になるように、改変してわざとしっぱいさせるのがよいでせう。


とりあえず使えるのはこれかな?



[EINVAL] O_RDONLY, O_WRONLY および O_RDWR の不正な組合わせで記


述子をオープンしようとしました。



execに関してはたいして実害ないところを目指すと、ファイル名の先頭に「#」でもたすかな


ファイル名が書いてあるアドレスをいじる方法は、syscalls.cのget_string関数参照.


(こいつだけは実行中アプリの変数に影響をあたえる)


socketにかんしてはぜんぜん関係ないドメインを指定してこけさせよう。





0 件のコメント:

コメントを投稿