上野と申します。mod_rubyの実装中心なので、ruby-extのほうで
続けさせていただきます。$SAFEをどうするかということになったら
振り直していただいて構いません。

> From: "Shugo Maeda" Sent: Wednesday, November 22, 2000 5:08 PM
> 一応こういうスタンスで、デフォルトで$SAFEは1程度にしています。
> これはどちらかというとプログラマのミスでセキュリティホールを作っ
> てしまうのを防ぐためですね。

複数ユーザーで実行環境を共有するというのを前提にすると、悪意を想定
しなくても組み込み環境を変更すれば他のユーザーに必ず影響を与えます。
組み込みモジュールを変更して他のユーザーに影響が出ない場合は、それは
たまたま他のユーザーが影響を受けるコードを書いてなかったからに
すぎません。意図的か、不用意にか、悪意かはここでは関係ありません。

> RubyRequireでロードするスクリプトで$SAFEを設定できます…と思った
> けど今試すとできないですね(^_^;
> 
> RubySafeLevel 4
> 
> のようなApacheディレクティブを追加するパッチを添付します。
> 
> ただ、$SAFE==4だと入出力なども制限されるので、ちょっとCGI的な使い
> 方には実用的でないですね。
> 
> 重要なグローバル変数や、組み込みクラス・モジュールの変更だけ禁止
> するようなセキュリティレベルがあった方がよくないでしょうか?
> > まつもとさん

で、Webサーバー上でスクリプト実行する際に$SAFEがいくつだと安全で、
どこが不便なのかをProgramming Rubyを読みつつ、またこのパッチで試しつつ
(ありがとうございます_o_)考えてみました。
(SAFE=1のレベルは当然なので省きます)

視点としては
・ユーザーに悪意はない。外部からの入力には悪意を想定する。
・一般的なCGIスクリプトが必要な機能は必要。
・Rubyのグローバルな実行環境は守る。
です。

[$SAFE = 2]
×ディレクトリが作成できない。
◎world writable directory からロードできない。
×chmod, stat, truncate, umask, flock, ioctl,fork,syscall等が使えない。
×signalをtrapできない。

[$SAFE = 3]
○新規に作成するオブジェクトはtainted

[$SAFE=4]
○nontainted なオブジェクトを変更できない
△グローバル変数を変更できない(禁止が必要なものもあるが、変更が必要な
ものもある)
△nontaintedなオブジェクトのインスタンス変数にアクセスできない(readのみ可
が望ましい?)
×環境変数を変更できない
○nontaintedなオブジェクトをfreezeできない
○メソッドのvisibilityを変更できない
○nontaintedなメソッドを変更できない
×スレッド操作ができない
○exitできない
×ファイルやパイプに出力できない
○オブジェクトをtaintできない。

ざっとこういうところでしょうか。◎はユーザーと実行環境両方を守るために
必要な機能、○はRuby実行環境を守るために必要、×は不便または困る、
という意味です。

mod_rubyとしては、○がサポートされていて、load(filename, true)の仕組みが
何らかの形で取り込まれれば、かなり安全になるのではないでしょうか。

-- 
UENO Kazuaki <kazu / a-u.net>
(MSN Messenger: kazuau / hotmail.com)