From: Kazuhiro NISHIYAMA Date: 2009-08-05T02:00:08+09:00 Subject: [ruby-dev:39013] Re: セキュリティモデルのドキュメント 西山和広です。 At Thu, 23 Jul 2009 22:09:36 +0900, Shugo Maeda wrote: > > 前田です。 > > 2009/07/23 1:09 に Kazuhiro NISHIYAMA さんは書きました: > > untrusted はフラグとして設定されたりされなかったりするだけで、 > > フラグが設定されているかどうかによって何らかの動作に影響する > > ものではない、ということなのでしょうか? > > 違います。 untrust で検索して違いをチェックしていたら見落としてしまっていました。 > 「セーフレベル4」の「禁止される操作」に挙げている以下の操作のチェックに > 利用されます。 > # 抜けがあるかもしれません。 > > * 信頼されたクラスやモジュールの定義の変更 およびクラス変数の変更 > * 信頼されたオブジェクトの状態の変更 > * 信頼されたIOやFileを使用する処理 > > 基本的にセーフレベル4では信頼されていないオブジェクト(untrustedフラグ > が設定されたオブジェクト)しか変更できません。 > > 以前はこれがtaintedフラグによってチェックされていたので、サンドボックス > 外で生成されたオブジェクトがたまたまtaintedだった場合に、それを書き変 > えることにより、セーフレベル4で禁止された操作を実行させることができる > 脆弱性がいくつも報告されました。 > 当初は一つずつfreezeする対策が取られましたが、きりがないので、 > taintedとは別のフラグとしてuntrustedを用意する変更を私が行いました。 tdiary-devel でとりあえず 1.9 でも動くようにする方法として class Object def taint super untrust end end if respond_to?(:untrust) という案を出してしまいましたが(Objectに定義しているのは Kernelで定義されている元のtaintを簡単に呼ぶため)、 変更の意図を考えると module Kernel unless method_defined?(:untrust) alias untrust taint end end のように untrust が無ければ定義して、taint の代わりに untrust を使うべきなのでしょうか? -- |ZnZ(ゼット エヌ ゼット) |西山和広(Kazuhiro NISHIYAMA)