tainted?
tmpfileを読んでたらハマッタ。セキュリティモデルについて勉強中。
[methods]
- taint 汚染する
- untaint 汚染解除
- tainted? チェック
- $SAFE セキュリティレベル。
セキュリティレベル
[レベル0]
デフォルトのレベル
汚染条件:
IOや環境変数、コマンドライン引数から得られた文字列
環境変数PATHのみ危険なパスを含む場合のみ危険。
ここでは危険なパスとは誰でも変更/書き込みが可能なパスのこと。
ルートディレクトリから階層が順番にチェックされ、一箇所でも誰でも変
更可能な個所があればそのパスは危険とみなされます
禁止される操作:特になし
[レベル1]
汚染条件:
レベル0と同じ
禁止される操作:
汚染された文字列を引数とした、以下の操作。
- Dir, IO, File, FileTestのクラスメソッド、メソッド
- ファイルテスト演算子の使用、ファイルの更新時刻比較
- eval
- toplevelへの load 第二要素を指定してラップればOK(トップレベルがmainじゃなくなる)
- require
- trap
[レベル2]
汚染条件:レベル1と同様
禁止される操作:
- Dir.chdir, Dir.chroot, Dirmkdir, Dir.rmdir
- File.chown, File.chmod, File.umask, File.truncate, File#lstat,File#chmod File#chown File#delete File#unlink File#truncate,File#flock FileTest
- Process.fork, Process.setpgid, Process.setsid, Process.setpriority,Process.egid = Process.kill
- 危険なパスからの load
- (wrapされていても)汚染されている文字列での load()
- syscall
- exit!
- trap
[レベル3]
生成される全てのオブジェクトが汚染される。レベル4でプログラムを実行する環境を作り上げるのに適する。
汚染条件: 生成される全てのオブジェクト
禁止される操作:
レベル2+ Object#untaint
[レベル4]
信用する事のできないプログラムを実行するためのレベル。
レベル4は信頼できないプログラムの危険な動作をほぼ全て研修可能。完全では無い。
このレベルではレベル3では禁止されている汚染された文字列の evalが許可されている。evalで実行すると危険な操作は全て禁止されているから。
汚染条件: レベル3と同様
禁止される操作
- Object#taint
- トップレベルの定義の変更 (autoload, load, include)
- 既存のメソッドの再定義
- Objectクラスの定義の変更
- 汚染されていないクラスやモジュールの定義の変更 およびクラス変数の変更
- 汚染されていないオブジェクトの状態の変更。
- グローバル変数の変更
- 汚染されていないIOやFileを仕様する処理
- IOへの出力
- プログラムの終了(exit, abort) (out of memoryでもfatalにならない)
頭に入んないよー。実例を考えよう。
というかのど痛いので帰ろう。