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にかんしてはぜんぜん関係ないドメインを指定してこけさせよう。
2007年3月10日土曜日
リップシンク@ごっすん ごっすん ごすんくぎ
なんとなく、「ごっすん」のパクリflashを見てたら、、、、なんか違和感。
パクリ物はコマ数がすくない???
とおもってあらためてみなおしてると、、、ごっすんくぎってこんな少ない工数で
細かい表情とかはちゃんとつくってるのね。
そういや、先輩が音声から自動で口のうごきをおこす研究してるっていってたなぁ。
これを音声から自動でおこなおうなんぞ、感情音声としてあつかっても難しそうだねぇ。。。
FreeBSD 4系でopensslがBus error
mod_sslがcoreをはいてきがついたんだけど。
最新のopensslはgcc2.95ではコンパイルできないっぽ。
キャストまわりにばぐがあるらしい。
対処方は3つ
- すなおにFreeBSDをバージョンアップ
- opensslにパッチをあてる(ぐぐりゃでてくる)
- gccのバージョンアップ
で、私の選択肢は。
- サバ、引越しを期にマシンごとアップグレード
dnscacheからBINDへののりかえ tinyDNSはのこしててもえんちゃうの?
イントラネットキャッシュサーバにdnscache+tinyDNSでDNSサバをくんでたんだけど、、、
dnscacheをデフォルトでつかってるとUDPパケットに収まらない返答がうまく処理できず
しょぼーんでした。
ま、なんか設定ひろってくればいいのかもしれないけど、、BINDでいいやーってことで
dnscacheの設定にちかいnamed.confをつくる。
options {
directory "/etc/namedb";
pid-file "/var/run/named/pid";
dump-file "/var/dump/named_dump.db";
statistics-file "/var/stats/named.stats";
listen-on { 192.168.10.1; }; //イントラ用うけぐち
};
zone "." {//ここはデフォルトのまま
type hint;
file "named.root";
};
zone "0.0.127.IN-ADDR.ARPA" {//ここもデフォルトのまま(zoneファイルはmake-localhostでつくる)
type master;
file "master/localhost.rev";
allow-query{192.168.10.0/24;127.0.0.1;};
};
// RFC 3152 ここもデフォルト
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA" {
type master;
file "master/localhost-v6.rev";
};
//イントラ内でDNSをフックして書き換えたいので、tinyDNSに飛ばす
zone "saifes.dip.jp" {
type forward;
forwarders { 127.0.0.1;};
};
//おなじく飛ばす
zone "jh-zizake.ddo.jp" {
type forward;
forwarders { 127.0.0.1;};
};
//フレッツのDNSをひくにはBBルータ様にきいたほうが楽(うちはAはルータ様のアドレス)
zone "fletsnet.com" {
type forward;
forwarders { 192.168.10.A;};
};
zone "flets" {
type forward;
forwarders { 192.168.10.A;};
};
FreeBSDでシステムコールをフックする方法
参考になるソースはusr.bin/trussとsys/pioctl.h
システムコールをフック出きれば、jailみたいなざっくりとしたフレームじゃなくてもっと細粒度のアクセス制御ができるはずだよね。きっと。
うんうん.