Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | Object | tainted?

概要

Object#tainted? -> bool

詳細

オブジェクトの「汚染マーク」がセットされている時真を返却。
オブジェクトの「汚染マーク」は、組み込み機能利用時に内部で設定される場合と、
自分で Object#taint / untaint メソッドで設定する場合がある。

セキュリティレベルについては下記参照。
http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fsafelevel.html

サンプルコード
require 'tbpgr_utils'

name = ARGV[0]
age = ARGV[1]

Person = Struct.new(:name, :age)
tanaka = Person.new('tanaka', 24)
yogore = Person.new(name, age)

bulk_puts_eval binding, <<-EOS
tanaka.name.tainted?
tanaka.name.taint
tanaka.name.tainted?
tanaka.name.untaint
tanaka.name.tainted?
yogore.name.tainted?
yogore.name.taint
EOS

$SAFE = 1
# 汚染された文字列でディレクトリ操作をしようとしてセキュリティエラーが発生
Dir.mkdir(yogore.name) unless Dir.exist?(yogore.name)

__END__
下記はTbpgrUtils gemの機能
bulk_puts_eval

https://rubygems.org/gems/tbpgr_utils
https://github.com/tbpgr/tbpgr_utils

出力

$ruby object_tainted.rb tanaka
object_tainted.rb:22:in `exist?': Insecure operation: -r (SecurityError)
        from object_tainted.rb:22:in `<main>'
tanaka.name.tainted? # => false
tanaka.name.taint    # => "tanaka"
tanaka.name.tainted? # => true
tanaka.name.untaint  # => "tanaka"
tanaka.name.tainted? # => false
yogore.name.tainted? # => true
yogore.name.taint    # => "tanaka"