汚染されたクラスの利用
注 (2008-08-28)
最新のRuby(1.8.7-p72)ではメソッド呼び出し制限の動作が修正されています。最新の環境での制限表は、続 汚染されたクラスの利用を参照ください。
汚染されたクラスの利用について、気になっていたことの検証結果をまとめる。
クラスの汚染
セーフレベル3または4でクラスを作成するか、
tainted_calss = Thread.fork { $SAFE = 3 class TaintedClass attr :test, true self end }.value
クラスのtaintを呼び出すと、クラスを汚染できる。(試した限りではどちらも同じ挙動だった。)
tainted_calss2 = class TaintedClass2 attr :test, true self end tainted_calss2.taint
クラス/インスタンスの汚染とメソッドの汚染
クラスが普通 | クラスが汚染 | |
---|---|---|
インスタンスが普通 | メソッドは普通 | メソッドは汚染 |
インスタンスが汚染 | メソッドは普通 | メソッドは汚染 |
なお、汚染されたメソッドは、強制的にセーフレベル4で実行されるとのこと(→ Rubyリファレンス セキュリティモデル)
各セーフレベルでのインスタンス/メソッドの汚染によるメソッド呼び出しの制限
- セーフレベル0では、汚染されたメソッド(=汚染されたクラスのメソッド)を実行できない。
- セーフレベル4では、汚染されていないインスタンスのsetメソッドを実行できない。
- もちろん、メソッド内で各セーフレベルで禁止されている行為(ファイルの書き込みなど)を行っている場合はこの限りではないですよ。
セーフレベル0 | セーフレベル1-3 | セーフレベル4 | |
---|---|---|---|
クラス:汚染/インスタンス:汚染 | × | ○ | ○ |
クラス:通常/インスタンス:汚染 | ○ | ○ | ○ |
クラス:汚染/インスタンス:通常 | × | ○ | ×(setのみ/getは可) |
クラス:通常/インスタンス:通常 | ○ | ○ | ×(setのみ/getは可) |