From: Kazuhiro NISHIYAMA Date: 2007-03-14T15:11:40+09:00 Subject: [ruby-dev:30575] RSS::Parser.parseでSecurityError 西山和広です。 http://lists.sourceforge.jp/mailman/archives/hiki-dev/2007-March/001150.html [Hiki-dev:01151] Ruby 1.8.6でrss-showをうごかすとsecurityエラー というのを調べていて気がついたのですが、 #!/usr/bin/ruby require 'rss' rss = RSS::Maker.make("1.0") do |maker| maker.channel.about = "http://example.com/index.rdf" maker.channel.title = "Example" maker.channel.description = "Example Site" maker.channel.link = "http://example.com/" end.to_s rss.taint $SAFE = 1 RSS::Parser.parse(rss, false) のように$SAFEが1か2のときに、taintedなStringをRSS::Parser.parseに渡すと .../rss/parser.rb:314:in `respond_to?': Insecure: can't intern tainted string (SecurityError) になります。 ($SAFEが3と4のときはそれぞれ別のところで SecurityError になるけど、 それはたぶん問題はないはず。) 原因として、以下のように対応する Symbol がない String を 引数として respond_to? を呼び出すと SecurityError に なっているようです。 このとき、SecurityError になるならrespond_to? は false に なるはず、と予測できてしまうので SecurityError ではなく false を返してもセキュリティの問題はないと思うのですが、 どうでしょうか? % ruby18 -ve '$SAFE=1; respond_to? "to_a".taint' ruby 1.8.6 (2007-03-13 patchlevel 5000) [i686-linux] % ruby18 -ve '$SAFE=1; respond_to? "hoge".taint' ruby 1.8.6 (2007-03-13 patchlevel 5000) [i686-linux] -e:1:in `respond_to?': Insecure: can't intern tainted string (SecurityError) from -e:1 % ruby18 -ve 'def hoge; end; $SAFE=1; respond_to? "hoge".taint' ruby 1.8.6 (2007-03-13 patchlevel 5000) [i686-linux] % ruby18 -ve ':hoge; $SAFE=1; respond_to? "hoge".taint' ruby 1.8.6 (2007-03-13 patchlevel 5000) [i686-linux] -e:1: warning: unused literal ignored % -- |ZnZ(ゼット エヌ ゼット) |西山和広(Kazuhiro NISHIYAMA)