そろそろ名前を考えなきゃ。
やることは
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 件のコメント:
コメントを投稿