From: matz@... (Yukihiro Matsumoto) Date: 1997-04-09T13:33:33+09:00 Subject: [ruby-list:2702] security model まつもと ゆきひろです. rubyをCGIとかにも使おうと思ったらやっぱり危険な操作は検出し てくれた方が嬉しいですよね.人間がいちいち「これ大丈夫かな」 などと考えながら作るより,こういうことは言語が検出してくれた 方がrubyの思想にあっているようにも思えます. そう思って,昔safe.rbというのを書いてみましたが,やはりruby だけでセキュリティを確保するのはちょっと無理そうでした.で, それ以来つらつらと考えていたのですが,perlのtaintをベースに した以下のモデルでうまく行きそうです. 穴が無いか考えてみてくださる人はいませんか? ruby securityモデル セキュリティレベルはグローバル変数$SAFEの値(整数)で設定する. $SAFEの値の初期値は0である.$SAFEの値を現在の値より小さくす る事はできない. $SAFEの値はthreadローカルである.あるthreadでの$SAFEの値は親 threadの値を引き継ぎ,値を大きくしても別のthreadでの値は変わ らない. 文字列はtaintフラグを持つ.taintフラグのたった文字列は「汚れ ている」とみなされる.「汚れている」文字列のコピー(clone/dup) も汚れている. セキュリティレベルが0以上の時,「汚れている」文字列を以下の 操作の引数にする事はできない. * file/pipe/dir/socket/dbmのオープン * File操作(chmod..など) * system, `` * load/require * その他,危なそうな操作(思い付いたら追加) セキュリティレベルが1以上の時,以下の操作で与えられる文字列 は汚れている. * 環境変数の取り出し * getsなどストリームからの読み込み セキュリティレベルが2以上の時,新しく生成される全ての文字列 は汚れている. セキュリティレベルが3以上の時,以下の操作は禁止される. * Process.kill * その他プロセスに関する危なそうな処理(思い付いたら追加) セキュリティレベルが4以上の時,以下の操作は禁止される * 大域変数の値の変更 これで,新たにthreadを作ってその中で$SAFEの値を大きくすれば, 信頼できないコードでも安心して実行できそうに思うのですが,ど うでしょう? 例: unsafe_script = url.readlines.join Thread.start do $SAFE = 4 eval unsafe_script end