前田です。

At Sun, 26 Nov 2000 00:16:16 +0900,
UENO Kazuaki <kazu / a-u.net> wrote:
> > 一応こういうスタンスで、デフォルトで$SAFEは1程度にしています。
> > これはどちらかというとプログラマのミスでセキュリティホールを作っ
> > てしまうのを防ぐためですね。
> 
> 複数ユーザーで実行環境を共有するというのを前提にすると、悪意を想定
> しなくても組み込み環境を変更すれば他のユーザーに必ず影響を与えます。
> 組み込みモジュールを変更して他のユーザーに影響が出ない場合は、それは
> たまたま他のユーザーが影響を受けるコードを書いてなかったからに
> すぎません。意図的か、不用意にか、悪意かはここでは関係ありません。

そうですね。

実際、www.ruby-lang.orgでも何度かトラブルが起きています。
セキュリティというよりはシステムの頑丈さの問題ですよね。

# まあ、組み込みクラス・モジュールを変更するというのはあまりよい
# コーディングスタイルではないという気もするんですが。
# mod_rubyを使う場合に限らず。

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

定数を定義できない(のでクラス定義などもできない)、というのもあり
ますね。

一部のグローバル変数($KCODEとか$:とか)については変更されても再設
定していますが、もっと網羅的にやればよいのかな?

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

現状で、load(filename, true)相当の処理を行っていますので、

def print(*args)
  ...
end

のようなケースでは問題ないはずです。

ただ、

module Kernel
  def print(*args)
    ...
  end
end

のように明示的に指定されるとだめなんですけど。

-- 
前田 修吾