2007年3月11日日曜日

これだから、教育者って聞くと眉唾ものでみられるのかと。。。



http://www.asahi.com/life/update/0310/007.html


なに、この激しく痴話げんか。。。そんなものがニュースになるだけ平和なのか?(笑





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



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


やることは



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つ




  1. すなおにFreeBSDをバージョンアップ

  2. opensslにパッチをあてる(ぐぐりゃでてくる)

  3. gccのバージョンアップ


で、私の選択肢は。




  • サバ、引越しを期にマシンごとアップグレード





がんばることスタックに追加



octaveとmaximaがそつなく使えるかっこいい人になる!


コードの記述量をへらさなきゃなぁ。生産性あげなきゃ。





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みたいなざっくりとしたフレームじゃなくてもっと細粒度のアクセス制御ができるはずだよね。きっと。


うんうん.